Imported Upstream version 3.9.11 upstream/3.9.11
authorJinWang An <jinwang.an@samsung.com>
Wed, 18 Jan 2023 06:01:25 +0000 (15:01 +0900)
committerJinWang An <jinwang.an@samsung.com>
Wed, 18 Jan 2023 06:01:25 +0000 (15:01 +0900)
268 files changed:
Doc/c-api/exceptions.rst
Doc/c-api/object.rst
Doc/c-api/reflection.rst
Doc/c-api/typeobj.rst
Doc/c-api/unicode.rst
Doc/c-api/veryhigh.rst
Doc/faq/design.rst
Doc/faq/extending.rst
Doc/faq/programming.rst
Doc/glossary.rst
Doc/howto/descriptor.rst
Doc/howto/logging_flow.png
Doc/library/abc.rst
Doc/library/asyncio-eventloop.rst
Doc/library/asyncio-stream.rst
Doc/library/asyncio-task.rst
Doc/library/codecs.rst
Doc/library/collections.rst
Doc/library/configparser.rst
Doc/library/copyreg.rst
Doc/library/datetime.rst
Doc/library/exceptions.rst
Doc/library/functions.rst
Doc/library/hashlib-blake2-tree.png
Doc/library/html.parser.rst
Doc/library/http.server.rst
Doc/library/idle.rst
Doc/library/importlib.metadata.rst
Doc/library/io.rst
Doc/library/multiprocessing.rst
Doc/library/os.rst
Doc/library/pathlib-inheritance.svg
Doc/library/sqlite3.rst
Doc/library/ssl.rst
Doc/library/stdtypes.rst
Doc/library/string.rst
Doc/library/subprocess.rst
Doc/library/sys.rst
Doc/library/tempfile.rst
Doc/library/time.rst
Doc/library/timeit.rst
Doc/library/tk_msg.png
Doc/library/tkinter.rst
Doc/library/typing.rst
Doc/library/uuid.rst
Doc/library/xml.dom.rst
Doc/reference/datamodel.rst
Doc/reference/expressions.rst
Doc/reference/import.rst
Doc/reference/simple_stmts.rst
Doc/tools/extensions/escape4chm.py
Doc/tools/extensions/peg_highlight.py
Doc/tools/susp-ignored.csv
Doc/tutorial/controlflow.rst
Doc/using/win_installer.png
Doc/using/windows.rst
Doc/whatsnew/3.7.rst
Doc/whatsnew/3.9.rst
Include/patchlevel.h
Lib/_collections_abc.py
Lib/_pyio.py
Lib/argparse.py
Lib/asyncio/base_events.py
Lib/asyncio/futures.py
Lib/asyncio/proactor_events.py
Lib/asyncio/protocols.py
Lib/asyncio/queues.py
Lib/asyncio/selector_events.py
Lib/asyncio/sslproto.py
Lib/asyncio/tasks.py
Lib/asyncio/transports.py
Lib/ctypes/test/test_bitfields.py
Lib/ctypes/test/test_python_api.py
Lib/ensurepip/__init__.py
Lib/ensurepip/_bundled/pip-21.2.4-py3-none-any.whl [deleted file]
Lib/ensurepip/_bundled/pip-22.0.4-py3-none-any.whl [new file with mode: 0644]
Lib/http/server.py
Lib/idlelib/Icons/idle_16.gif
Lib/idlelib/Icons/idle_16.png
Lib/idlelib/Icons/idle_256.png
Lib/idlelib/Icons/idle_32.gif
Lib/idlelib/Icons/idle_32.png
Lib/idlelib/Icons/idle_48.png
Lib/idlelib/Icons/minusnode.gif
Lib/idlelib/Icons/plusnode.gif
Lib/idlelib/Icons/python.gif
Lib/idlelib/Icons/tk.gif
Lib/idlelib/NEWS.txt
Lib/idlelib/README.txt
Lib/idlelib/editor.py
Lib/idlelib/help.html
Lib/idlelib/help_about.py
Lib/idlelib/idle_test/example_noext [new file with mode: 0644]
Lib/idlelib/idle_test/example_stub.pyi [new file with mode: 0644]
Lib/idlelib/idle_test/htest.py
Lib/idlelib/idle_test/test_calltip.py
Lib/idlelib/idle_test/test_iomenu.py
Lib/idlelib/idle_test/test_util.py [new file with mode: 0644]
Lib/idlelib/iomenu.py
Lib/idlelib/mainmenu.py
Lib/idlelib/pyparse.py
Lib/idlelib/query.py
Lib/idlelib/replace.py
Lib/idlelib/run.py
Lib/idlelib/util.py [new file with mode: 0644]
Lib/importlib/_bootstrap_external.py
Lib/importlib/metadata.py
Lib/inspect.py
Lib/lib2to3/pytree.py
Lib/lib2to3/tests/data/infinite_recursion.py
Lib/lib2to3/tests/test_all_fixers.py
Lib/lib2to3/tests/test_parser.py
Lib/mimetypes.py
Lib/pdb.py
Lib/pydoc_data/topics.py
Lib/shutil.py
Lib/sqlite3/test/userfunctions.py
Lib/tarfile.py
Lib/test/_test_multiprocessing.py
Lib/test/ann_module7.py [new file with mode: 0644]
Lib/test/datetimetester.py
Lib/test/imghdrdata/python.gif
Lib/test/pythoninfo.py
Lib/test/support/__init__.py
Lib/test/test___all__.py
Lib/test/test_argparse.py
Lib/test/test_asyncio/test_context.py
Lib/test/test_asyncio/test_futures.py
Lib/test/test_asyncio/test_futures2.py
Lib/test/test_asyncio/test_proactor_events.py
Lib/test/test_asyncio/test_protocols.py
Lib/test/test_asyncio/test_queues.py
Lib/test/test_asyncio/test_runners.py
Lib/test/test_asyncio/test_selector_events.py
Lib/test/test_asyncio/test_sendfile.py
Lib/test/test_asyncio/test_sock_lowlevel.py
Lib/test/test_asyncio/test_sslproto.py
Lib/test/test_asyncio/test_tasks.py
Lib/test/test_asyncio/test_transports.py
Lib/test/test_asyncio/test_unix_events.py
Lib/test/test_builtin.py
Lib/test/test_codecs.py
Lib/test/test_compileall.py
Lib/test/test_concurrent_futures.py
Lib/test/test_crypt.py
Lib/test/test_decimal.py
Lib/test/test_dict.py
Lib/test/test_distutils.py
Lib/test/test_dtrace.py
Lib/test/test_email/data/PyBanner048.gif
Lib/test/test_email/test__header_value_parser.py
Lib/test/test_exceptions.py
Lib/test/test_faulthandler.py
Lib/test/test_flufl.py
Lib/test/test_fstring.py
Lib/test/test_ftplib.py
Lib/test/test_hashlib.py
Lib/test/test_idle.py
Lib/test/test_importlib/test_metadata_api.py
Lib/test/test_importlib/test_namespace_pkgs.py
Lib/test/test_importlib/test_windows.py
Lib/test/test_inspect.py
Lib/test/test_io.py
Lib/test/test_json/test_recursion.py
Lib/test/test_logging.py
Lib/test/test_mimetypes.py
Lib/test/test_minidom.py
Lib/test/test_os.py
Lib/test/test_pdb.py
Lib/test/test_peg_generator/__init__.py
Lib/test/test_posix.py
Lib/test/test_raise.py
Lib/test/test_set.py
Lib/test/test_tabnanny.py
Lib/test/test_tarfile.py
Lib/test/test_time.py
Lib/test/test_tix.py
Lib/test/test_tk.py
Lib/test/test_tools/__init__.py
Lib/test/test_ttk_guionly.py
Lib/test/test_turtle.py
Lib/test/test_typing.py
Lib/test/test_urllib2.py
Lib/test/test_urllib2_localnet.py
Lib/test/test_xml_etree.py
Lib/test/test_zipfile.py
Lib/test/test_zipimport.py
Lib/typing.py
Lib/unittest/mock.py
Lib/unittest/result.py
Lib/unittest/test/test_program.py
Lib/unittest/test/test_result.py
Lib/unittest/test/testmock/testpatch.py
Lib/urllib/request.py
Lib/xml/etree/ElementTree.py
Lib/zipfile.py
Mac/BuildScript/build-installer.py
Misc/ACKS
Misc/NEWS
Modules/_asynciomodule.c
Modules/_elementtree.c
Modules/_hashopenssl.c
Modules/_io/iobase.c
Modules/_io/textio.c
Modules/_sqlite/connection.c
Modules/_sqlite/cursor.c
Modules/_sqlite/microprotocols.h
Modules/_sqlite/module.c
Modules/_sqlite/statement.c
Modules/_tracemalloc.c
Modules/_zoneinfo.c
Modules/audioop.c
Modules/clinic/_elementtree.c.h
Modules/clinic/itertoolsmodule.c.h
Modules/clinic/selectmodule.c.h
Modules/expat/expat.h
Modules/expat/pyexpatns.h
Modules/expat/xmlparse.c
Modules/expat/xmlrole.c
Modules/expat/xmltok.c
Modules/expat/xmltok_impl.c
Modules/expat/xmltok_ns.c
Modules/faulthandler.c
Modules/itertoolsmodule.c
Modules/selectmodule.c
Objects/clinic/floatobject.c.h
Objects/descrobject.c
Objects/floatobject.c
Objects/setobject.c
Objects/typeobject.c
PC/classicAppCompat.can.xml
PC/classicAppCompat.sccd
PC/icons/logox128.png
PC/icons/py.png
PC/icons/pythonwx150.png
PC/icons/pythonwx44.png
PC/icons/pythonx150.png
PC/icons/pythonx44.png
PC/icons/pythonx50.png
PC/layout/support/appxmanifest.py
PC/layout/support/constants.py
PCbuild/get_externals.bat
PCbuild/python.props
PCbuild/readme.txt
Parser/pegen/parse_string.c
Python/compile.c
Python/importlib_external.h
README.rst
Tools/msi/README.txt
Tools/msi/build.bat
Tools/msi/buildrelease.bat
Tools/msi/bundle/SideBar.png
Tools/msi/bundle/bundle.wxs
Tools/msi/common.wxs
Tools/msi/dev/dev.wxs
Tools/msi/doc/doc.wxs
Tools/msi/lib/lib.wxs
Tools/msi/path/path.wxs
Tools/msi/tcltk/tcltk.wxs
Tools/msi/test/test.wxs
Tools/msi/tools/tools.wxs
Tools/msi/ucrt/ucrt.wxs
Tools/peg_generator/pegen/build.py
Tools/ssl/multissltests.py
configure
configure.ac
pyconfig.h.in
setup.py

index 614eb24525541802a7c80c638412d0d46eea62f9..df38ba43ec43134144efcd64c36ce04b854bb38b 100644 (file)
@@ -253,6 +253,14 @@ For convenience, some of these functions will always return a
    .. versionadded:: 3.3
 
 
+.. c:function:: PyObject* PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, PyObject *name, PyObject *path)
+
+   Much like :c:func:`PyErr_SetImportError` but this function allows for
+   specifying a subclass of :exc:`ImportError` to raise.
+
+   .. versionadded:: 3.6
+
+
 .. c:function:: void PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset)
 
    Set file, line, and offset information for the current exception.  If the
@@ -320,13 +328,6 @@ an error value).
    :mod:`warnings` module and the :option:`-W` option in the command line
    documentation.  There is no C API for warning control.
 
-.. c:function:: PyObject* PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, PyObject *name, PyObject *path)
-
-   Much like :c:func:`PyErr_SetImportError` but this function allows for
-   specifying a subclass of :exc:`ImportError` to raise.
-
-   .. versionadded:: 3.6
-
 
 .. c:function:: int PyErr_WarnExplicitObject(PyObject *category, PyObject *message, PyObject *filename, int lineno, PyObject *module, PyObject *registry)
 
index 05faa72346ed6bb3eaf9ad20aaf1f5c3c8864cf2..9f874382e85bb639b20e52f1816098fb7f0237e0 100644 (file)
@@ -81,8 +81,9 @@ Object Protocol
    return ``0`` on success.  This is the equivalent of the Python statement
    ``o.attr_name = v``.
 
-   If *v* is ``NULL``, the attribute is deleted, however this feature is
-   deprecated in favour of using :c:func:`PyObject_DelAttr`.
+   If *v* is ``NULL``, the attribute is deleted. This behaviour is deprecated
+   in favour of using :c:func:`PyObject_DelAttr`, but there are currently no
+   plans to remove it.
 
 
 .. c:function:: int PyObject_SetAttrString(PyObject *o, const char *attr_name, PyObject *v)
index 9207d86012c8b338175ba72b849510b7d8edb8c4..44ee009f1f94de0b685565b848d61baded535d99 100644 (file)
@@ -31,7 +31,7 @@ Reflection
    See also :c:func:`PyThreadState_GetFrame`.
 
 
-.. c:function:: int PyFrame_GetBack(PyFrameObject *frame)
+.. c:function:: PyFrameObject* PyFrame_GetBack(PyFrameObject *frame)
 
    Get the *frame* next outer frame.
 
@@ -42,7 +42,7 @@ Reflection
    .. versionadded:: 3.9
 
 
-.. c:function:: int PyFrame_GetCode(PyFrameObject *frame)
+.. c:function:: PyCodeObject* PyFrame_GetCode(PyFrameObject *frame)
 
    Get the *frame* code.
 
index a800616730b9da8ac42be23246b4b382e0a9bdd3..d58a53b1d69fb101e2498cf5e1a6a98a96728780 100644 (file)
@@ -474,7 +474,7 @@ PyObject Slots
 --------------
 
 The type object structure extends the :c:type:`PyVarObject` structure. The
-:attr:`ob_size` field is used for dynamic types (created by  :func:`type_new`,
+:attr:`ob_size` field is used for dynamic types (created by :func:`type_new`,
 usually called from a class statement). Note that :c:data:`PyType_Type` (the
 metatype) initializes :c:member:`~PyTypeObject.tp_itemsize`, which means that its instances (i.e.
 type objects) *must* have the :attr:`ob_size` field.
@@ -1909,6 +1909,17 @@ and :c:type:`PyType_Type` effectively act as defaults.)
    For this field to be taken into account (even through inheritance),
    you must also set the :const:`Py_TPFLAGS_HAVE_FINALIZE` flags bit.
 
+   Also, note that, in a garbage collected Python,
+   :c:member:`~PyTypeObject.tp_dealloc` may be called from
+   any Python thread, not just the thread which created the object (if the object
+   becomes part of a refcount cycle, that cycle might be collected by a garbage
+   collection on any thread).  This is not a problem for Python API calls, since
+   the thread on which tp_dealloc is called will own the Global Interpreter Lock
+   (GIL). However, if the object being destroyed in turn destroys objects from some
+   other C or C++ library, care should be taken to ensure that destroying those
+   objects on the thread which called tp_dealloc will not violate any assumptions
+   of the library.
+
    **Inheritance:**
 
    This field is inherited by subtypes.
@@ -1933,17 +1944,6 @@ and :c:type:`PyType_Type` effectively act as defaults.)
    .. versionadded:: 3.9 (the field exists since 3.8 but it's only used since 3.9)
 
 
-Also, note that, in a garbage collected Python, :c:member:`~PyTypeObject.tp_dealloc` may be called from
-any Python thread, not just the thread which created the object (if the object
-becomes part of a refcount cycle, that cycle might be collected by a garbage
-collection on any thread).  This is not a problem for Python API calls, since
-the thread on which tp_dealloc is called will own the Global Interpreter Lock
-(GIL). However, if the object being destroyed in turn destroys objects from some
-other C or C++ library, care should be taken to ensure that destroying those
-objects on the thread which called tp_dealloc will not violate any assumptions
-of the library.
-
-
 .. _heap-types:
 
 Heap Types
@@ -2340,7 +2340,8 @@ Async Object Structures
 
       PyObject *am_aiter(PyObject *self);
 
-   Must return an :term:`awaitable` object.  See :meth:`__anext__` for details.
+   Must return an :term:`asynchronous iterator` object.
+   See :meth:`__anext__` for details.
 
    This slot may be set to ``NULL`` if an object does not implement
    asynchronous iteration protocol.
index 0d13d949e38c76436385b4314b805715a62bcc23..a6ae8ba13657d5820bcfddbe2ac08665a6dc62d2 100644 (file)
@@ -1025,7 +1025,7 @@ Error handling is set by errors which may also be set to ``NULL`` meaning to use
 the default handling defined for the codec.  Default error handling for all
 built-in codecs is "strict" (:exc:`ValueError` is raised).
 
-The codecs all use a similar interface.  Only deviation from the following
+The codecs all use a similar interface.  Only deviations from the following
 generic ones are documented for simplicity.
 
 
@@ -1239,7 +1239,7 @@ These are the UTF-16 codec APIs:
    ``1``, any byte order mark is copied to the output (where it will result in
    either a ``\ufeff`` or a ``\ufffe`` character).
 
-   After completion, *\*byteorder* is set to the current byte order at the end
+   After completion, ``*byteorder`` is set to the current byte order at the end
    of input data.
 
    If *byteorder* is ``NULL``, the codec starts in native order mode.
@@ -1457,7 +1457,7 @@ Character Map Codecs
 
 This codec is special in that it can be used to implement many different codecs
 (and this is in fact what was done to obtain most of the standard codecs
-included in the :mod:`encodings` package). The codec uses mapping to encode and
+included in the :mod:`encodings` package). The codec uses mappings to encode and
 decode characters.  The mapping objects provided must support the
 :meth:`__getitem__` mapping interface; dictionaries and sequences work well.
 
@@ -1619,7 +1619,7 @@ They all return ``NULL`` or ``-1`` if an exception occurs.
 .. c:function:: PyObject* PyUnicode_Splitlines(PyObject *s, int keepend)
 
    Split a Unicode string at line breaks, returning a list of Unicode strings.
-   CRLF is considered to be one line break.  If *keepend* is ``0``, the Line break
+   CRLF is considered to be one line break.  If *keepend* is ``0``, the line break
    characters are not included in the resulting strings.
 
 
index 551846ea6d7205870fb8ceb02eacd9eb4d608fcc..3595a7b995626a4d4f7b1e7d30f1b8e90db0225d 100644 (file)
@@ -75,6 +75,8 @@ the same library that the Python runtime is using.
    :c:func:`PyRun_SimpleFile`.  *filename* is decoded from the filesystem
    encoding (:func:`sys.getfilesystemencoding`).  If *filename* is ``NULL``, this
    function uses ``"???"`` as the filename.
+   If *closeit* is true, the file is closed before
+   ``PyRun_SimpleFileExFlags()`` returns.
 
 
 .. c:function:: int PyRun_SimpleString(const char *command)
index d0aee4e6072686169c0565d4721fafbcccd182bd..01fa5c77d86596126eb6d5c10f3d89315cd5fa45 100644 (file)
@@ -267,12 +267,9 @@ For cases where you need to choose from a very large number of possibilities,
 you can create a dictionary mapping case values to functions to call.  For
 example::
 
-   def function_1(...):
-       ...
-
    functions = {'a': function_1,
                 'b': function_2,
-                'c': self.method_1, ...}
+                'c': self.method_1}
 
    func = functions[value]
    func()
@@ -280,14 +277,14 @@ example::
 For calling methods on objects, you can simplify yet further by using the
 :func:`getattr` built-in to retrieve methods with a particular name::
 
-   def visit_a(self, ...):
-       ...
-   ...
+   class MyVisitor:
+       def visit_a(self):
+           ...
 
-   def dispatch(self, value):
-       method_name = 'visit_' + str(value)
-       method = getattr(self, method_name)
-       method()
+       def dispatch(self, value):
+           method_name = 'visit_' + str(value)
+           method = getattr(self, method_name)
+           method()
 
 It's suggested that you use a prefix for the method names, such as ``visit_`` in
 this example.  Without such a prefix, if values are coming from an untrusted
index aecb56eaa4fd2f3d4ee7a62db06c982ffd1b4412..1d2aca6f4c8d974b4f58c4bbbfc2bb288087b65d 100644 (file)
@@ -254,7 +254,6 @@ For Red Hat, install the python-devel RPM to get the necessary files.
 
 For Debian, run ``apt-get install python-dev``.
 
-
 How do I tell "incomplete input" from "invalid input"?
 ------------------------------------------------------
 
@@ -273,161 +272,6 @@ you. You can also set the :c:func:`PyOS_ReadlineFunctionPointer` to point at you
 custom input function. See ``Modules/readline.c`` and ``Parser/myreadline.c``
 for more hints.
 
-However sometimes you have to run the embedded Python interpreter in the same
-thread as your rest application and you can't allow the
-:c:func:`PyRun_InteractiveLoop` to stop while waiting for user input.  The one
-solution then is to call :c:func:`PyParser_ParseString` and test for ``e.error``
-equal to ``E_EOF``, which means the input is incomplete.  Here's a sample code
-fragment, untested, inspired by code from Alex Farber::
-
-   #define PY_SSIZE_T_CLEAN
-   #include <Python.h>
-   #include <node.h>
-   #include <errcode.h>
-   #include <grammar.h>
-   #include <parsetok.h>
-   #include <compile.h>
-
-   int testcomplete(char *code)
-     /* code should end in \n */
-     /* return -1 for error, 0 for incomplete, 1 for complete */
-   {
-     node *n;
-     perrdetail e;
-
-     n = PyParser_ParseString(code, &_PyParser_Grammar,
-                              Py_file_input, &e);
-     if (n == NULL) {
-       if (e.error == E_EOF)
-         return 0;
-       return -1;
-     }
-
-     PyNode_Free(n);
-     return 1;
-   }
-
-Another solution is trying to compile the received string with
-:c:func:`Py_CompileString`. If it compiles without errors, try to execute the
-returned code object by calling :c:func:`PyEval_EvalCode`. Otherwise save the
-input for later. If the compilation fails, find out if it's an error or just
-more input is required - by extracting the message string from the exception
-tuple and comparing it to the string "unexpected EOF while parsing".  Here is a
-complete example using the GNU readline library (you may want to ignore
-**SIGINT** while calling readline())::
-
-   #include <stdio.h>
-   #include <readline.h>
-
-   #define PY_SSIZE_T_CLEAN
-   #include <Python.h>
-   #include <object.h>
-   #include <compile.h>
-   #include <eval.h>
-
-   int main (int argc, char* argv[])
-   {
-     int i, j, done = 0;                          /* lengths of line, code */
-     char ps1[] = ">>> ";
-     char ps2[] = "... ";
-     char *prompt = ps1;
-     char *msg, *line, *code = NULL;
-     PyObject *src, *glb, *loc;
-     PyObject *exc, *val, *trb, *obj, *dum;
-
-     Py_Initialize ();
-     loc = PyDict_New ();
-     glb = PyDict_New ();
-     PyDict_SetItemString (glb, "__builtins__", PyEval_GetBuiltins ());
-
-     while (!done)
-     {
-       line = readline (prompt);
-
-       if (NULL == line)                          /* Ctrl-D pressed */
-       {
-         done = 1;
-       }
-       else
-       {
-         i = strlen (line);
-
-         if (i > 0)
-           add_history (line);                    /* save non-empty lines */
-
-         if (NULL == code)                        /* nothing in code yet */
-           j = 0;
-         else
-           j = strlen (code);
-
-         code = realloc (code, i + j + 2);
-         if (NULL == code)                        /* out of memory */
-           exit (1);
-
-         if (0 == j)                              /* code was empty, so */
-           code[0] = '\0';                        /* keep strncat happy */
-
-         strncat (code, line, i);                 /* append line to code */
-         code[i + j] = '\n';                      /* append '\n' to code */
-         code[i + j + 1] = '\0';
-
-         src = Py_CompileString (code, "<stdin>", Py_single_input);
-
-         if (NULL != src)                         /* compiled just fine - */
-         {
-           if (ps1  == prompt ||                  /* ">>> " or */
-               '\n' == code[i + j - 1])           /* "... " and double '\n' */
-           {                                               /* so execute it */
-             dum = PyEval_EvalCode (src, glb, loc);
-             Py_XDECREF (dum);
-             Py_XDECREF (src);
-             free (code);
-             code = NULL;
-             if (PyErr_Occurred ())
-               PyErr_Print ();
-             prompt = ps1;
-           }
-         }                                        /* syntax error or E_EOF? */
-         else if (PyErr_ExceptionMatches (PyExc_SyntaxError))
-         {
-           PyErr_Fetch (&exc, &val, &trb);        /* clears exception! */
-
-           if (PyArg_ParseTuple (val, "sO", &msg, &obj) &&
-               !strcmp (msg, "unexpected EOF while parsing")) /* E_EOF */
-           {
-             Py_XDECREF (exc);
-             Py_XDECREF (val);
-             Py_XDECREF (trb);
-             prompt = ps2;
-           }
-           else                                   /* some other syntax error */
-           {
-             PyErr_Restore (exc, val, trb);
-             PyErr_Print ();
-             free (code);
-             code = NULL;
-             prompt = ps1;
-           }
-         }
-         else                                     /* some non-syntax error */
-         {
-           PyErr_Print ();
-           free (code);
-           code = NULL;
-           prompt = ps1;
-         }
-
-         free (line);
-       }
-     }
-
-     Py_XDECREF(glb);
-     Py_XDECREF(loc);
-     Py_Finalize();
-     exit(0);
-   }
-
-
 How do I find undefined g++ symbols __builtin_new or __pure_virtual?
 --------------------------------------------------------------------
 
index d838e6141f8d4bace9c40708e05506def24cefb5..3cf041e1a4230e7c8dba2059ef49daa22e9cdc47 100644 (file)
@@ -1820,7 +1820,7 @@ for ``None``.  This reads like plain English in code and avoids confusion with
 other objects that may have boolean values that evaluate to false.
 
 2) Detecting optional arguments can be tricky when ``None`` is a valid input
-value.  In those situations, you can create an singleton sentinel object
+value.  In those situations, you can create a singleton sentinel object
 guaranteed to be distinct from other objects.  For example, here is how
 to implement a method that behaves like :meth:`dict.pop`::
 
index da9dc9ceebfc4b55073e404f81a7936d6387bff0..f759c3fb056077db5a90a87e9306c872f53f160f 100644 (file)
@@ -278,12 +278,12 @@ Glossary
       The decorator syntax is merely syntactic sugar, the following two
       function definitions are semantically equivalent::
 
-         def f(...):
+         def f(arg):
              ...
          f = staticmethod(f)
 
          @staticmethod
-         def f(...):
+         def f(arg):
              ...
 
       The same concept exists for classes, but is less commonly used there.  See
index 9f0dd2f1f15506cdb6ab5d506c07f7b3f4e7fc2a..4b76e061c35a570e51449be9d3083a628e12b9ce 100644 (file)
@@ -696,10 +696,14 @@ a pure Python equivalent:
     >>> b.g == b['g'] == ('getattr_hook', b, 'g')
     True
 
+Note, there is no :meth:`__getattr__` hook in the :meth:`__getattribute__`
+code.  That is why calling :meth:`__getattribute__` directly or with
+``super().__getattribute__`` will bypass :meth:`__getattr__` entirely.
 
-Interestingly, attribute lookup doesn't call :meth:`object.__getattribute__`
-directly.  Instead, both the dot operator and the :func:`getattr` function
-perform attribute lookup by way of a helper function:
+Instead, it is the dot operator and the :func:`getattr` function that are
+responsible for invoking :meth:`__getattr__` whenever :meth:`__getattribute__`
+raises an :exc:`AttributeError`.  Their logic is encapsulated in a helper
+function:
 
 .. testcode::
 
@@ -744,12 +748,6 @@ perform attribute lookup by way of a helper function:
         ...
     AttributeError: 'ClassWithoutGetAttr' object has no attribute 'z'
 
-So if :meth:`__getattr__` exists, it is called whenever :meth:`__getattribute__`
-raises :exc:`AttributeError` (either directly or in one of the descriptor calls).
-
-Also, if a user calls :meth:`object.__getattribute__` directly, the
-:meth:`__getattr__` hook is bypassed entirely.
-
 
 Invocation from a class
 -----------------------
index fac4acd775530259deeef077a125fb2e6fb5502b..d65e597f811db5e0a70e6c3ce7124e23b6be86de 100644 (file)
Binary files a/Doc/howto/logging_flow.png and b/Doc/howto/logging_flow.png differ
index 424ae547d829a4cb1dcccfc88418410ba3495e5c..35be01e891e9da3f0ac2a7059a973729c4719302 100644 (file)
@@ -185,15 +185,15 @@ The :mod:`abc` module also provides the following decorator:
 
       class C(ABC):
           @abstractmethod
-          def my_abstract_method(self, ...):
+          def my_abstract_method(self, arg1):
               ...
           @classmethod
           @abstractmethod
-          def my_abstract_classmethod(cls, ...):
+          def my_abstract_classmethod(cls, arg2):
               ...
           @staticmethod
           @abstractmethod
-          def my_abstract_staticmethod(...):
+          def my_abstract_staticmethod(arg3):
               ...
 
           @property
@@ -255,7 +255,7 @@ The :mod:`abc` module also supports the following legacy decorators:
       class C(ABC):
           @classmethod
           @abstractmethod
-          def my_abstract_classmethod(cls, ...):
+          def my_abstract_classmethod(cls, arg):
               ...
 
 
@@ -276,7 +276,7 @@ The :mod:`abc` module also supports the following legacy decorators:
       class C(ABC):
           @staticmethod
           @abstractmethod
-          def my_abstract_staticmethod(...):
+          def my_abstract_staticmethod(arg):
               ...
 
 
index 140851ce2e44810bc1776ee648059dee407bf4fc..2a6d82fa057b00678834d338db1f1d1f283c003f 100644 (file)
@@ -1193,10 +1193,13 @@ Allows customizing how exceptions are handled in the event loop.
    * 'message': Error message;
    * 'exception' (optional): Exception object;
    * 'future' (optional): :class:`asyncio.Future` instance;
+   * 'task' (optional): :class:`asyncio.Task` instance;
    * 'handle' (optional): :class:`asyncio.Handle` instance;
    * 'protocol' (optional): :ref:`Protocol <asyncio-protocol>` instance;
    * 'transport' (optional): :ref:`Transport <asyncio-transport>` instance;
-   * 'socket' (optional): :class:`socket.socket` instance.
+   * 'socket' (optional): :class:`socket.socket` instance;
+   * 'asyncgen' (optional): Asynchronous generator that caused
+                            the exception.
 
    .. note::
 
index bf431cfb8a410a66de87d836d17318dcbbb21f0f..a960b26c8d80067483a2db15a016bdc9f92f762a 100644 (file)
@@ -51,7 +51,8 @@ and work with streams:
 .. coroutinefunction:: open_connection(host=None, port=None, *, \
                           loop=None, limit=None, ssl=None, family=0, \
                           proto=0, flags=0, sock=None, local_addr=None, \
-                          server_hostname=None, ssl_handshake_timeout=None)
+                          server_hostname=None, ssl_handshake_timeout=None, \
+                          happy_eyeballs_delay=None, interleave=None)
 
    Establish a network connection and return a pair of
    ``(reader, writer)`` objects.
@@ -73,6 +74,10 @@ and work with streams:
 
       The *ssl_handshake_timeout* parameter.
 
+   .. versionadded:: 3.8
+
+      Added *happy_eyeballs_delay* and *interleave* parameters.
+
 .. coroutinefunction:: start_server(client_connected_cb, host=None, \
                           port=None, *, loop=None, limit=None, \
                           family=socket.AF_UNSPEC, \
index e8bee20bc76bc77eb113a0f80f34c695d6f741f6..38b12e44b6de2830ebb00825eebcc9e5f6e18802 100644 (file)
@@ -991,7 +991,7 @@ Generator-based Coroutines
 .. note::
 
    Support for generator-based coroutines is **deprecated** and
-   is scheduled for removal in Python 3.10.
+   is removed in Python 3.11.
 
 Generator-based coroutines predate async/await syntax.  They are
 Python generators that use ``yield from`` expressions to await
@@ -1019,7 +1019,7 @@ enforced.
     This decorator should not be used for :keyword:`async def`
     coroutines.
 
-    .. deprecated-removed:: 3.8 3.10
+    .. deprecated-removed:: 3.8 3.11
 
        Use :keyword:`async def` instead.
 
index 2f7497c0c4934c917440e79f41deefc842b1a578..3386208d5ef5f12ba7799bba243e2eccd723df80 100644 (file)
@@ -691,8 +691,9 @@ compatible with the Python codec registry.
 
    .. method:: writelines(list)
 
-      Writes the concatenated list of strings to the stream (possibly by reusing
-      the :meth:`write` method). The standard bytes-to-bytes codecs
+      Writes the concatenated iterable of strings to the stream (possibly by reusing
+      the :meth:`write` method). Infinite or
+      very large iterables are not supported. The standard bytes-to-bytes codecs
       do not support this method.
 
 
index e00b75fa9be19137548ddb7250df153d542fec59..f3b8e2abe5e5db0e4e67d14d4633e0c60c40f218 100644 (file)
@@ -277,7 +277,7 @@ For example::
        according to when an element is first encountered in the left operand
        and then by the order encountered in the right operand.
 
-    Counter objects support three methods beyond those available for all
+    Counter objects support additional methods beyond those available for all
     dictionaries:
 
     .. method:: elements()
index 60d33f59276f9485534e39b38e95e60afbcac204..e5c78246881f1926908e1b5f4ed8bf8da94e32bc 100644 (file)
@@ -243,6 +243,9 @@ out.  Values can also span multiple lines, as long as they are indented deeper
 than the first line of the value.  Depending on the parser's mode, blank lines
 may be treated as parts of multiline values or ignored.
 
+By default,  a valid section name can be any string that does not contain '\\n' or ']'.
+To change this, see :attr:`ConfigParser.SECTCRE`.
+
 Configuration files may include comments, prefixed by specific
 characters (``#`` and ``;`` by default [1]_).  Comments may appear on
 their own on an otherwise empty line, possibly indented. [1]_
index 439202100959516f1e492f82292a1b288776bf93..dc35965be3e40db19dbdd53824125c6fe31f4a6e 100644 (file)
@@ -33,8 +33,8 @@ Such constructors may be factory functions or class instances.
 
    The optional *constructor* parameter, if provided, is a callable object which
    can be used to reconstruct the object when called with the tuple of arguments
-   returned by *function* at pickling time.  :exc:`TypeError` will be raised if
-   *object* is a class or *constructor* is not callable.
+   returned by *function* at pickling time.  A :exc:`TypeError` is raised if the
+   *constructor* is not callable.
 
    See the :mod:`pickle` module for more details on the interface
    expected of *function* and *constructor*.  Note that the
index 217cdf222b89b773fda515ea83e9da985fc90e89..f447b7bc9491e4df90b480739979fd6424c5cc44 100644 (file)
@@ -2375,7 +2375,7 @@ requires, and these work on all platforms with a standard C implementation.
 +-----------+--------------------------------+------------------------+-------+
 | ``%U``    | Week number of the year        | 00, 01, ..., 53        | \(7), |
 |           | (Sunday as the first day of    |                        | \(9)  |
-|           | the week) as a zero padded     |                        |       |
+|           | the week) as a zero-padded     |                        |       |
 |           | decimal number. All days in a  |                        |       |
 |           | new year preceding the first   |                        |       |
 |           | Sunday are considered to be in |                        |       |
@@ -2383,10 +2383,10 @@ requires, and these work on all platforms with a standard C implementation.
 +-----------+--------------------------------+------------------------+-------+
 | ``%W``    | Week number of the year        | 00, 01, ..., 53        | \(7), |
 |           | (Monday as the first day of    |                        | \(9)  |
-|           | the week) as a decimal number. |                        |       |
-|           | All days in a new year         |                        |       |
-|           | preceding the first Monday     |                        |       |
-|           | are considered to be in        |                        |       |
+|           | the week) as a zero-padded     |                        |       |
+|           | decimal number. All days in a  |                        |       |
+|           | new year preceding the first   |                        |       |
+|           | Monday are considered to be in |                        |       |
 |           | week 0.                        |                        |       |
 +-----------+--------------------------------+------------------------+-------+
 | ``%c``    | Locale's appropriate date and  || Tue Aug 16 21:30:00   | \(1)  |
index 6c21c6b96d3c63fbf987665e1873c1649f2571c2..c4945679476a4999bbfaedb8be03e96b33dbb5fa 100644 (file)
@@ -38,15 +38,14 @@ information on defining exceptions is available in the Python Tutorial under
 Exception context
 -----------------
 
-When raising (or re-raising) an exception in an :keyword:`except` or
-:keyword:`finally` clause
-:attr:`__context__` is automatically set to the last exception caught; if the
-new exception is not handled the traceback that is eventually displayed will
-include the originating exception(s) and the final exception.
-
-When raising a new exception (rather than using a bare ``raise`` to re-raise
-the exception currently being handled), the implicit exception context can be
-supplemented with an explicit cause by using :keyword:`from<raise>` with
+When raising a new exception while another exception
+is already being handled, the new exception's
+:attr:`__context__` attribute is automatically set to the handled
+exception.  An exception may be handled when an :keyword:`except` or
+:keyword:`finally` clause, or a :keyword:`with` statement, is used.
+
+This implicit exception context can be
+supplemented with an explicit cause by using :keyword:`!from` with
 :keyword:`raise`::
 
    raise new_exc from original_exc
index 8df557e47a16e13e8bea97d9df99e4841c7c634c..9a9c707dc177a9c6decc669a7f9a3434e8d5f44f 100644 (file)
@@ -210,7 +210,7 @@ are always available.  They are listed here in alphabetical order.
 
       class C:
           @classmethod
-          def f(cls, arg1, arg2, ...): ...
+          def f(cls, arg1, arg2): ...
 
    The ``@classmethod`` form is a function :term:`decorator` -- see
    :ref:`function` for details.
index 73e849444ed7d38fa57e700f4acd2fc5110d7a44..faef21b55f96b13beaa7b0f54e7288574e903c81 100644 (file)
Binary files a/Doc/library/hashlib-blake2-tree.png and b/Doc/library/hashlib-blake2-tree.png differ
index ac844a683bf7ac1b9cc9bdf873943647c8a3ee6d..03aff25ce6117a50118f35479d68fe18ecf5112a 100644 (file)
@@ -126,7 +126,7 @@ implementations do nothing (except for :meth:`~HTMLParser.handle_startendtag`):
 
 .. method:: HTMLParser.handle_starttag(tag, attrs)
 
-   This method is called to handle the start of a tag (e.g. ``<div id="main">``).
+   This method is called to handle the start tag of an element (e.g. ``<div id="main">``).
 
    The *tag* argument is the name of the tag converted to lower case. The *attrs*
    argument is a list of ``(name, value)`` pairs containing the attributes found
index 08b0ddf5f2c6b01eda6837ab755ce0b2b0cd712c..dea79108d34f293ebc427489e1434675c422ac64 100644 (file)
@@ -412,17 +412,22 @@ the current directory::
 .. _http-server-cli:
 
 :mod:`http.server` can also be invoked directly using the :option:`-m`
-switch of the interpreter with a ``port number`` argument.  Similar to
+switch of the interpreter.  Similar to
 the previous example, this serves files relative to the current directory::
 
-        python -m http.server 8000
+        python -m http.server
 
-By default, server binds itself to all interfaces.  The option ``-b/--bind``
+The server listens to port 8000 by default. The default can be overridden
+by passing the desired port number as an argument::
+
+        python -m http.server 9000
+
+By default, the server binds itself to all interfaces.  The option ``-b/--bind``
 specifies a specific address to which it should bind. Both IPv4 and IPv6
 addresses are supported. For example, the following command causes the server
 to bind to localhost only::
 
-        python -m http.server 8000 --bind 127.0.0.1
+        python -m http.server --bind 127.0.0.1
 
 .. versionadded:: 3.4
     ``--bind`` argument was introduced.
@@ -430,14 +435,14 @@ to bind to localhost only::
 .. versionadded:: 3.8
     ``--bind`` argument enhanced to support IPv6
 
-By default, server uses the current directory. The option ``-d/--directory``
+By default, the server uses the current directory. The option ``-d/--directory``
 specifies a directory to which it should serve the files. For example,
 the following command uses a specific directory::
 
         python -m http.server --directory /tmp/
 
 .. versionadded:: 3.7
-    ``--directory`` specify alternate directory
+    ``--directory`` argument was introduced.
 
 .. class:: CGIHTTPRequestHandler(request, client_address, server)
 
@@ -482,4 +487,4 @@ the following command uses a specific directory::
 :class:`CGIHTTPRequestHandler` can be enabled in the command line by passing
 the ``--cgi`` option::
 
-        python -m http.server --cgi 8000
+        python -m http.server --cgi
index 4fa4f1e5d30b99c9b64e71f99abe89f6f030aa62..b8febb9a5b6213dc1174d4066c6e1436e0d18542 100644 (file)
@@ -96,11 +96,13 @@ Save Copy As...
 Print Window
    Print the current window to the default printer.
 
-Close
-   Close the current window (ask to save if unsaved).
+Close Window
+   Close the current window (if an unsaved editor, ask to save; if an unsaved
+   Shell, ask to quit execution).  Calling ``exit()`` or ``close()`` in the Shell
+   window also closes Shell.  If this is the only window, also exit IDLE.
 
-Exit
-   Close all windows and quit IDLE (ask to save unsaved windows).
+Exit IDLE
+   Close all windows and quit IDLE (ask to save unsaved edit windows).
 
 Edit menu (Shell and Editor)
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
index 1f73017e05ced7aa2adb109a9a671e3f4fdd8d84..7652d501d9d917c6c2f3f2e6ec73c4ad10f6e4d0 100644 (file)
@@ -199,6 +199,8 @@ function::
     ["pytest (>=3.0.0) ; extra == 'test'", "pytest-cov ; extra == 'test'"]
 
 
+.. _distributions:
+
 Distributions
 =============
 
index 0ff05cfc0e0911bec276be377d3b05ecffdfb1f0..9f62dd21afbeaec2da77d2570ba5c8f85deaa8cd 100644 (file)
@@ -230,8 +230,7 @@ I/O Base Classes
 
 .. class:: IOBase
 
-   The abstract base class for all I/O classes, acting on streams of bytes.
-   There is no public constructor.
+   The abstract base class for all I/O classes.
 
    This class provides empty abstract implementations for many methods
    that derived classes can override selectively; the default
@@ -385,8 +384,7 @@ I/O Base Classes
 
 .. class:: RawIOBase
 
-   Base class for raw binary streams.  It inherits :class:`IOBase`.  There is no
-   public constructor.
+   Base class for raw binary streams.  It inherits :class:`IOBase`.
 
    Raw binary streams typically provide low-level access to an underlying OS
    device or API, and do not try to encapsulate it in high-level primitives
@@ -439,7 +437,7 @@ I/O Base Classes
 .. class:: BufferedIOBase
 
    Base class for binary streams that support some kind of buffering.
-   It inherits :class:`IOBase`. There is no public constructor.
+   It inherits :class:`IOBase`.
 
    The main difference with :class:`RawIOBase` is that methods :meth:`read`,
    :meth:`readinto` and :meth:`write` will try (respectively) to read as much
@@ -776,8 +774,7 @@ Text I/O
 .. class:: TextIOBase
 
    Base class for text streams.  This class provides a character and line based
-   interface to stream I/O.  It inherits :class:`IOBase`.  There is no public
-   constructor.
+   interface to stream I/O.  It inherits :class:`IOBase`.
 
    :class:`TextIOBase` provides or overrides these data attributes and
    methods in addition to those from :class:`IOBase`:
index 96bc6c153284afb33a663ba48cb6c060589d0f3e..b62e1f8dba1bf2f0dc308e4eb8ab9a94333f057a 100644 (file)
@@ -569,8 +569,15 @@ The :mod:`multiprocessing` package mostly replicates the API of the
    .. attribute:: exitcode
 
       The child's exit code.  This will be ``None`` if the process has not yet
-      terminated.  A negative value *-N* indicates that the child was terminated
-      by signal *N*.
+      terminated.
+
+      If the child's :meth:`run` method returned normally, the exit code
+      will be 0.  If it terminated via :func:`sys.exit` with an integer
+      argument *N*, the exit code will be *N*.
+
+      If the child terminated due to an exception not caught within
+      :meth:`run`, the exit code will be 1.  If it was terminated by
+      signal *N*, the exit code will be the negative value *-N*.
 
    .. attribute:: authkey
 
@@ -1040,9 +1047,9 @@ Miscellaneous
 
    .. versionadded:: 3.4
 
-.. function:: set_executable()
+.. function:: set_executable(executable)
 
-   Sets the path of the Python interpreter to use when starting a child process.
+   Set the path of the Python interpreter to use when starting a child process.
    (By default :data:`sys.executable` is used).  Embedders will probably need to
    do some thing like ::
 
index f8d567af48466e65165e27243ee54dd82cb055c8..2f7b37019e4a437238645d5c92dc3adef30f0e69 100644 (file)
@@ -1909,7 +1909,8 @@ features:
 
    Create a directory named *path* with numeric mode *mode*.
 
-   If the directory already exists, :exc:`FileExistsError` is raised.
+   If the directory already exists, :exc:`FileExistsError` is raised. If a parent
+   directory in the path does not exist, :exc:`FileNotFoundError` is raised.
 
    .. _mkdir_modebits:
 
@@ -4623,7 +4624,7 @@ Random numbers
 
 .. function:: urandom(size)
 
-   Return a string of *size* random bytes suitable for cryptographic use.
+   Return a bytestring of *size* random bytes suitable for cryptographic use.
 
    This function returns random bytes from an OS-specific randomness source.  The
    returned data should be unpredictable enough for cryptographic applications,
index 49057f678fd7d00e428de68c5a19a7e7833ba5e6..01f8684a2b201c5f02acce48189ca26d678c9989 100644 (file)
@@ -1 +1 @@
-<svg version="1.1" viewBox="0.0 0.0 539.005249343832 319.40944881889766" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l539.00525 0l0 319.40945l-539.00525 0l0 -319.40945z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l539.00525 0l0 319.40945l-539.00525 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m203.43307 37.929134l113.98425 0l0 61.165356l-113.98425 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m203.43307 37.929134l113.98425 0l0 61.165356l-113.98425 0z" fill-rule="evenodd"/><path fill="#000000" d="m225.89395 71.12181l0 1.640625l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.265625l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.15625q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.421875 -1.421875 -0.421875l-1.84375 0l0 3.015625zm13.9296875 -2.234375l0 5.484375q0.515625 0 0.75 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-1.515625 0l0 -0.375q-0.6875 0.3125 -1.3125 0.46875q-0.625 0.171875 -1.1875 0.171875q-0.796875 0 -1.375 -0.328125q-0.578125 -0.34375 -0.90625 -0.9375q-0.25 -0.421875 -0.25 -1.046875l0 -3.453125l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.875 0l0 4.765625q0 0.5 0.234375 0.75q0.25 0.234375 0.765625 0.234375q0.484375 0 1.03125 -0.1875q0.5625 -0.203125 1.390625 -0.703125l0 -3.265625l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.171875 0zm5.8671875 0l0 1.0q1.015625 -0.734375 1.59375 -0.96875q0.578125 -0.25 1.09375 -0.25q0.78125 0 1.515625 0.578125q0.5 0.390625 0.5 0.796875q0 0.34375 -0.25 0.59375q-0.234375 0.234375 -0.5625 0.234375q-0.296875 0 -0.625 -0.296875q-0.328125 -0.296875 -0.59375 -0.296875q-0.328125 0 -1.0 0.421875q-0.671875 0.421875 -1.671875 1.265625l0 2.40625l2.28125 0q0.578125 0 0.828125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-4.828125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.953125 0l0 -3.890625l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.171875 0zm13.9609375 4.359375l-6.578125 0q0.25 0.625 0.890625 1.015625q0.640625 0.375 1.71875 0.375q0.890625 0 2.375 -0.390625q0.609375 -0.15625 0.84375 -0.15625q0.3125 0 0.53125 0.234375q0.21875 0.21875 0.21875 0.5625q0 0.3125 -0.234375 0.53125q-0.3125 0.296875 -1.53125 0.5625q-1.203125 0.265625 -2.3125 0.265625q-1.921875 0 -3.078125 -1.09375q-1.15625 -1.09375 -1.15625 -2.671875q0 -1.6875 1.25 -2.75q1.25 -1.0625 2.875 -1.0625q0.96875 0 1.78125 0.34375q0.828125 0.34375 1.21875 0.75q0.5625 0.578125 0.9375 1.421875q0.25 0.59375 0.25 1.375l0 0.6875zm-1.78125 -1.609375q-0.359375 -0.6875 -0.953125 -1.015625q-0.59375 -0.34375 -1.421875 -0.34375q-0.8125 0 -1.40625 0.34375q-0.59375 0.328125 -0.96875 1.015625l4.75 0zm6.4296875 1.09375l0 1.640625l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.265625l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.15625q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.421875 -1.421875 -0.421875l-1.84375 0l0 3.015625zm11.9765625 4.859375l0 -0.375q-0.609375 0.3125 -1.34375 0.46875q-0.71875 0.171875 -1.3125 0.171875q-1.28125 0 -2.09375 -0.6875q-0.796875 -0.6875 -0.796875 -1.515625q0 -1.0 1.015625 -1.859375q1.03125 -0.875 2.84375 -0.875q0.734375 0 1.6875 0.15625l0 -0.375q0 -0.359375 -0.3125 -0.578125q-0.3125 -0.234375 -1.171875 -0.234375q-0.71875 0 -1.84375 0.28125q-0.421875 0.09375 -0.65625 0.09375q-0.328125 0 -0.546875 -0.21875q-0.21875 -0.234375 -0.21875 -0.59375q0 -0.203125 0.078125 -0.34375q0.078125 -0.15625 0.21875 -0.25q0.140625 -0.09375 0.578125 -0.21875q0.59375 -0.15625 1.203125 -0.25q0.625 -0.109375 1.125 -0.109375q1.5 0 2.3125 0.65625q0.828125 0.640625 0.828125 1.75l0 3.296875l0.28125 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.875 0zm0 -2.875q-0.96875 -0.1875 -1.78125 -0.1875q-0.96875 0 -1.671875 0.484375q-0.4375 0.296875 -0.4375 0.609375q0 0.234375 0.203125 0.375q0.390625 0.25 1.078125 0.25q0.578125 0 1.296875 -0.21875q0.734375 -0.234375 1.3125 -0.625l0 -0.6875zm7.7578125 -2.625l0 3.21875q0 0.515625 0.21875 0.671875q0.328125 0.265625 1.171875 0.265625q1.21875 0 2.265625 -0.53125q0.390625 -0.203125 0.625 -0.203125q0.3125 0 0.53125 0.234375q0.234375 0.234375 0.234375 0.578125q0 0.3125 -0.25 0.53125q-0.375 0.375 -1.515625 0.6875q-1.125 0.3125 -1.890625 0.3125q-1.5 0 -2.25 -0.640625q-0.734375 -0.65625 -0.734375 -1.59375l0 -3.53125l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l0.578125 0l0 -1.453125q0 -0.578125 0.21875 -0.8125q0.21875 -0.25 0.578125 -0.25q0.359375 0 0.578125 0.25q0.21875 0.234375 0.21875 0.8125l0 1.453125l2.96875 0q0.578125 0 0.8125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-2.96875 0zm8.3515625 -4.640625l0 3.421875q0.5 -0.296875 1.0 -0.4375q0.515625 -0.15625 1.046875 -0.15625q0.828125 0 1.46875 0.28125q0.65625 0.28125 1.078125 0.890625q0.421875 0.609375 0.421875 1.53125l0 3.0q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.4375 0.375 -0.671875q0.203125 -0.125 0.796875 -0.125l0 -2.890625q0 -0.625 -0.28125 -0.875q-0.359375 -0.328125 -1.078125 -0.328125q-0.53125 0 -0.953125 0.203125q-0.40625 0.203125 -1.09375 0.890625l0 3.0q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.4375 0.375 -0.671875q0.1875 -0.125 0.796875 -0.125l0 -6.921875l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.875 0z" fill-rule="nonzero"/><path fill="#ffffff" d="m26.64567 99.10499l158.20471 0l0 61.16535l-158.20471 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m26.64567 99.10499l158.20471 0l0 61.16535l-158.20471 0z" fill-rule="evenodd"/><path fill="#000000" d="m47.212875 132.29767l0 1.640625l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.2656326l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.1562576q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.42188263 -1.421875 -0.42188263l-1.84375 0l0 3.0156326zm13.9296875 -2.234375l0 5.484375q0.515625 0 0.75 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-1.515625 0l0 -0.375q-0.6875 0.3125 -1.3125 0.46875q-0.625 0.171875 -1.1875 0.171875q-0.796875 0 -1.375 -0.328125q-0.578125 -0.34375 -0.90625 -0.9375q-0.25 -0.421875 -0.25 -1.046875l0 -3.453125l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.875 0l0 4.765625q0 0.5 0.234375 0.75q0.25 0.234375 0.765625 0.234375q0.484375 0 1.03125 -0.1875q0.5625 -0.203125 1.390625 -0.703125l0 -3.265625l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.171875 0zm5.8671875 0l0 1.0q1.015625 -0.734375 1.59375 -0.96875q0.578125 -0.25 1.09375 -0.25q0.78125 0 1.515625 0.578125q0.5 0.390625 0.5 0.796875q0 0.34375 -0.25 0.59375q-0.234375 0.234375 -0.5625 0.234375q-0.296875 0 -0.625 -0.296875q-0.328125 -0.296875 -0.59375 -0.296875q-0.328125 0 -1.0 0.421875q-0.671875 0.421875 -1.671875 1.265625l0 2.40625l2.28125 0q0.578125 0 0.828125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-4.828125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.953125 0l0 -3.890625l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.171875 0zm13.9609375 4.359375l-6.578125 0q0.25 0.625 0.890625 1.015625q0.640625 0.375 1.71875 0.375q0.890625 0 2.375 -0.390625q0.609375 -0.15625 0.84375 -0.15625q0.3125 0 0.53125 0.234375q0.21875 0.21875 0.21875 0.5625q0 0.3125 -0.234375 0.53125q-0.3125 0.296875 -1.53125 0.5625q-1.203125 0.265625 -2.3125 0.265625q-1.921875 0 -3.078125 -1.09375q-1.15625 -1.09375 -1.15625 -2.671875q0 -1.6875 1.25 -2.75q1.25 -1.0625 2.875 -1.0625q0.96875 0 1.78125 0.34375q0.828125 0.34375 1.21875 0.75q0.5625 0.578125 0.9375 1.421875q0.25 0.59375 0.25 1.375l0 0.6875zm-1.78125 -1.609375q-0.359375 -0.6875 -0.953125 -1.015625q-0.59375 -0.34375 -1.421875 -0.34375q-0.8125 0 -1.40625 0.34375q-0.59375 0.328125 -0.96875 1.015625l4.75 0zm6.4296875 1.09375l0 1.640625l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.2656326l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.1562576q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.42188263 -1.421875 -0.42188263l-1.84375 0l0 3.0156326zm14.6953125 1.4375q0 0.921875 -0.515625 1.796875q-0.515625 0.859375 -1.53125 1.375q-1.0 0.515625 -2.109375 0.515625q-1.09375 0 -2.09375 -0.5q-1.0 -0.515625 -1.53125 -1.375q-0.515625 -0.875 -0.515625 -1.828125q0 -0.953125 0.53125 -1.875q0.53125 -0.9375 1.53125 -1.46875q1.0 -0.53125 2.078125 -0.53125q1.09375 0 2.109375 0.546875q1.015625 0.546875 1.53125 1.46875q0.515625 0.90625 0.515625 1.875zm-1.609375 0.015625q0 -0.78125 -0.546875 -1.421875q-0.765625 -0.875 -2.0 -0.875q-1.078125 0 -1.8125 0.703125q-0.71875 0.6875 -0.71875 1.59375q0 0.75 0.734375 1.40625q0.734375 0.65625 1.796875 0.65625q1.078125 0 1.8125 -0.65625q0.734375 -0.65625 0.734375 -1.40625zm8.7734375 -1.8125q-0.390625 -0.25 -0.828125 -0.359375q-0.421875 -0.125 -0.890625 -0.125q-0.921875 0 -1.46875 0.296875q-0.25 0.140625 -0.25 0.296875q0 0.171875 0.328125 0.34375q0.25 0.125 1.125 0.25q1.59375 0.21875 2.21875 0.4375q0.8125 0.28125 1.25 0.859375q0.453125 0.5625 0.453125 1.203125q0 0.859375 -0.75 1.4375q-1.09375 0.84375 -2.828125 0.84375q-0.6875 0 -1.28125 -0.125q-0.59375 -0.125 -1.078125 -0.359375q-0.125 0.09375 -0.265625 0.15625q-0.125 0.046875 -0.265625 0.046875q-0.375 0 -0.59375 -0.234375q-0.21875 -0.25 -0.21875 -0.828125l0 -0.546875q0 -0.578125 0.21875 -0.8125q0.21875 -0.25 0.578125 -0.25q0.296875 0 0.484375 0.15625q0.203125 0.15625 0.3125 0.546875q0.359375 0.3125 0.875 0.484375q0.515625 0.15625 1.1875 0.15625q1.109375 0 1.71875 -0.34375q0.28125 -0.171875 0.28125 -0.359375q0 -0.3125 -0.40625 -0.515625q-0.421875 -0.203125 -1.71875 -0.34375q-1.921875 -0.203125 -2.578125 -0.78125q-0.640625 -0.578125 -0.640625 -1.40625q0 -0.859375 0.71875 -1.4375q0.984375 -0.78125 2.578125 -0.78125q0.5625 0 1.0625 0.109375q0.515625 0.109375 0.984375 0.328125q0.15625 -0.109375 0.28125 -0.15625q0.125 -0.0625 0.234375 -0.0625q0.328125 0 0.546875 0.25q0.21875 0.234375 0.21875 0.8125l0 0.390625q0 0.53125 -0.125 0.71875q-0.25 0.359375 -0.671875 0.359375q-0.296875 0 -0.515625 -0.171875q-0.21875 -0.1875 -0.28125 -0.484375zm8.4453125 -4.9218826l0 1.703125l-1.90625 0l0 -1.703125l1.90625 0zm0.21875 3.0468826l0 5.484375l1.921875 0q0.578125 0 0.828125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-5.4375 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.921875 0l0 -3.890625l-1.296875 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.234375 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.890625 0zm10.0078125 3.40625l2.4375 2.078125q0.4375 0.03125 0.65625 0.25q0.21875 0.21875 0.21875 0.5625q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-1.8125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.28125 0.171875 -0.5q0.1875 -0.21875 0.484375 -0.296875l-1.1875 -1.03125l-1.21875 1.03125q0.359375 0.09375 0.515625 0.296875q0.171875 0.1875 0.171875 0.5q0 0.359375 -0.25 0.59375q-0.234375 0.21875 -0.8125 0.21875l-1.8125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.328125 0.21875 -0.546875q0.21875 -0.21875 0.65625 -0.25l2.375 -2.09375l-2.109375 -1.796875q-0.40625 -0.03125 -0.625 -0.25q-0.21875 -0.21875 -0.21875 -0.546875q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.5 0q0.578125 0 0.8125 0.21875q0.25 0.21875 0.25 0.5625q0 0.46875 -0.4375 0.75l0.96875 0.8125l0.953125 -0.828125q-0.421875 -0.296875 -0.421875 -0.703125q0 -0.375 0.234375 -0.59375q0.25 -0.21875 0.828125 -0.21875l1.484375 0q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.328125 -0.21875 0.546875q-0.21875 0.21875 -0.640625 0.25l-2.109375 1.8125zm7.4765625 0.4375l0 1.640625l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.2656326l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.1562576q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.42188263 -1.421875 -0.42188263l-1.84375 0l0 3.0156326zm11.9765625 4.859375l0 -0.375q-0.609375 0.3125 -1.34375 0.46875q-0.71875 0.171875 -1.3125 0.171875q-1.28125 0 -2.09375 -0.6875q-0.796875 -0.6875 -0.796875 -1.515625q0 -1.0 1.015625 -1.859375q1.03125 -0.875 2.84375 -0.875q0.734375 0 1.6875 0.15625l0 -0.375q0 -0.359375 -0.3125 -0.578125q-0.3125 -0.234375 -1.171875 -0.234375q-0.71875 0 -1.84375 0.28125q-0.421875 0.09375 -0.65625 0.09375q-0.328125 0 -0.546875 -0.21875q-0.21875 -0.234375 -0.21875 -0.59375q0 -0.203125 0.078125 -0.34375q0.078125 -0.15625 0.21875 -0.25q0.140625 -0.09375 0.578125 -0.21875q0.59375 -0.15625 1.203125 -0.25q0.625 -0.109375 1.125 -0.109375q1.5 0 2.3125 0.65625q0.828125 0.640625 0.828125 1.75l0 3.296875l0.28125 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.875 0zm0 -2.875q-0.96875 -0.1875 -1.78125 -0.1875q-0.96875 0 -1.671875 0.484375q-0.4375 0.296875 -0.4375 0.609375q0 0.234375 0.203125 0.375q0.390625 0.25 1.078125 0.25q0.578125 0 1.296875 -0.21875q0.734375 -0.234375 1.3125 -0.625l0 -0.6875zm7.7578125 -2.625l0 3.21875q0 0.515625 0.21875 0.671875q0.328125 0.265625 1.171875 0.265625q1.21875 0 2.265625 -0.53125q0.390625 -0.203125 0.625 -0.203125q0.3125 0 0.53125 0.234375q0.234375 0.234375 0.234375 0.578125q0 0.3125 -0.25 0.53125q-0.375 0.375 -1.515625 0.6875q-1.125 0.3125 -1.890625 0.3125q-1.5 0 -2.25 -0.640625q-0.734375 -0.65625 -0.734375 -1.59375l0 -3.53125l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l0.578125 0l0 -1.4531326q0 -0.578125 0.21875 -0.8125q0.21875 -0.25 0.578125 -0.25q0.359375 0 0.578125 0.25q0.21875 0.234375 0.21875 0.8125l0 1.4531326l2.96875 0q0.578125 0 0.8125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-2.96875 0zm8.3515625 -4.6406326l0 3.4218826q0.5 -0.296875 1.0 -0.4375q0.515625 -0.15625 1.046875 -0.15625q0.828125 0 1.46875 0.28125q0.65625 0.28125 1.078125 0.890625q0.421875 0.609375 0.421875 1.53125l0 3.0q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.4375 0.375 -0.671875q0.203125 -0.125 0.796875 -0.125l0 -2.890625q0 -0.625 -0.28125 -0.875q-0.359375 -0.328125 -1.078125 -0.328125q-0.53125 0 -0.953125 0.203125q-0.40625 0.203125 -1.09375 0.890625l0 3.0q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.4375 0.375 -0.671875q0.1875 -0.125 0.796875 -0.125l0 -6.9218826l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.875 0z" fill-rule="nonzero"/><path fill="#ffffff" d="m336.0 99.10499l174.04724 0l0 61.16535l-174.04724 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m336.0 99.10499l174.04724 0l0 61.16535l-174.04724 0z" fill-rule="evenodd"/><path fill="#000000" d="m354.8869 132.29767l0 1.640625l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.2656326l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.1562576q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.42188263 -1.421875 -0.42188263l-1.84375 0l0 3.0156326zm13.9296875 -2.234375l0 5.484375q0.515625 0 0.75 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-1.515625 0l0 -0.375q-0.6875 0.3125 -1.3125 0.46875q-0.625 0.171875 -1.1875 0.171875q-0.796875 0 -1.375 -0.328125q-0.578125 -0.34375 -0.90625 -0.9375q-0.25 -0.421875 -0.25 -1.046875l0 -3.453125l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.875 0l0 4.765625q0 0.5 0.234375 0.75q0.25 0.234375 0.765625 0.234375q0.484375 0 1.03125 -0.1875q0.5625 -0.203125 1.390625 -0.703125l0 -3.265625l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.171875 0zm5.8671875 0l0 1.0q1.015625 -0.734375 1.59375 -0.96875q0.578125 -0.25 1.09375 -0.25q0.78125 0 1.515625 0.578125q0.5 0.390625 0.5 0.796875q0 0.34375 -0.25 0.59375q-0.234375 0.234375 -0.5625 0.234375q-0.296875 0 -0.625 -0.296875q-0.328125 -0.296875 -0.59375 -0.296875q-0.328125 0 -1.0 0.421875q-0.671875 0.421875 -1.671875 1.265625l0 2.40625l2.28125 0q0.578125 0 0.828125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-4.828125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.953125 0l0 -3.890625l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.171875 0zm13.9609375 4.359375l-6.578125 0q0.25 0.625 0.890625 1.015625q0.640625 0.375 1.71875 0.375q0.890625 0 2.375 -0.390625q0.609375 -0.15625 0.84375 -0.15625q0.3125 0 0.53125 0.234375q0.21875 0.21875 0.21875 0.5625q0 0.3125 -0.234375 0.53125q-0.3125 0.296875 -1.53125 0.5625q-1.203125 0.265625 -2.3125 0.265625q-1.921875 0 -3.078125 -1.09375q-1.15625 -1.09375 -1.15625 -2.671875q0 -1.6875 1.25 -2.75q1.25 -1.0625 2.875 -1.0625q0.96875 0 1.78125 0.34375q0.828125 0.34375 1.21875 0.75q0.5625 0.578125 0.9375 1.421875q0.25 0.59375 0.25 1.375l0 0.6875zm-1.78125 -1.609375q-0.359375 -0.6875 -0.953125 -1.015625q-0.59375 -0.34375 -1.421875 -0.34375q-0.8125 0 -1.40625 0.34375q-0.59375 0.328125 -0.96875 1.015625l4.75 0zm7.3671875 -0.203125l-1.484375 4.546875l-1.796875 0l-0.953125 -7.8750076q-0.375 -0.046875 -0.5625 -0.25q-0.1875 -0.203125 -0.1875 -0.53125q0 -0.375 0.25 -0.59375q0.25 -0.234375 0.828125 -0.234375l2.125 0.015625q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-0.828125 0l0.53125 4.4843826l1.25 -3.734375l1.671875 0l1.25 3.734375l0.53125 -4.4843826l-0.84375 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.21875 -0.234375 -0.578125q0 -0.359375 0.234375 -0.578125q0.25 -0.234375 0.828125 -0.234375l2.125 0.015625q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.296875 -0.203125 0.515625q-0.1875 0.21875 -0.5625 0.28125l-0.921875 7.8750076l-1.765625 0l-1.53125 -4.546875zm10.1640625 -5.5937576l0 1.703125l-1.90625 0l0 -1.703125l1.90625 0zm0.21875 3.0468826l0 5.484375l1.921875 0q0.578125 0 0.828125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-5.4375 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.921875 0l0 -3.890625l-1.296875 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.234375 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.890625 0zm7.1953125 0l0 0.53125q0.4375 -0.375 0.953125 -0.5625q0.53125 -0.1875 1.15625 -0.1875q1.421875 0 2.25 0.890625q0.65625 0.703125 0.65625 1.84375l0 2.96875q0.5 0 0.734375 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.453125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.34375 0.234375 -0.5625q0.25 -0.234375 0.75 -0.234375l0 -3.015625q0 -0.53125 -0.28125 -0.765625q-0.359375 -0.3125 -1.09375 -0.3125q-0.5625 0 -0.984375 0.21875q-0.40625 0.203125 -1.046875 0.90625l0 2.96875q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.4375 0.375 -0.671875q0.1875 -0.125 0.796875 -0.125l0 -3.890625q-0.5 0 -0.75 -0.21875q-0.234375 -0.234375 -0.234375 -0.578125q0 -0.359375 0.234375 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.53125 0zm14.8984375 -3.0468826l0 8.531258l0.265625 0q0.578125 0 0.828125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-1.875 0l0 -0.390625q-0.546875 0.3125 -1.140625 0.484375q-0.59375 0.171875 -1.234375 0.171875q-1.8125 0 -2.921875 -1.046875q-1.09375 -1.046875 -1.09375 -2.609375q0 -1.625 1.15625 -2.765625q1.15625 -1.15625 2.828125 -1.15625q0.625 0 1.21875 0.203125q0.609375 0.1875 1.1875 0.5625l0 -1.9843826l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l1.875 0zm-1.609375 6.7968826q0 -0.984375 -0.703125 -1.671875q-0.6875 -0.6875 -1.6875 -0.6875q-1.0 0 -1.703125 0.6875q-0.6875 0.6875 -0.6875 1.65625q0 0.875 0.625 1.453125q0.625 0.5625 1.765625 0.5625q1.125 0 1.75 -0.5625q0.640625 -0.578125 0.640625 -1.4375zm11.6953125 -0.078125q0 0.921875 -0.515625 1.796875q-0.515625 0.859375 -1.53125 1.375q-1.0 0.515625 -2.109375 0.515625q-1.09375 0 -2.09375 -0.5q-1.0 -0.515625 -1.53125 -1.375q-0.515625 -0.875 -0.515625 -1.828125q0 -0.953125 0.53125 -1.875q0.53125 -0.9375 1.53125 -1.46875q1.0 -0.53125 2.078125 -0.53125q1.09375 0 2.109375 0.546875q1.015625 0.546875 1.53125 1.46875q0.515625 0.90625 0.515625 1.875zm-1.609375 0.015625q0 -0.78125 -0.546875 -1.421875q-0.765625 -0.875 -2.0 -0.875q-1.078125 0 -1.8125 0.703125q-0.71875 0.6875 -0.71875 1.59375q0 0.75 0.734375 1.40625q0.734375 0.65625 1.796875 0.65625q1.078125 0 1.8125 -0.65625q0.734375 -0.65625 0.734375 -1.40625zm7.0546875 0.453125l-1.109375 2.953125l-1.5 0l-1.34375 -5.5q-0.4375 -0.015625 -0.671875 -0.234375q-0.21875 -0.234375 -0.21875 -0.5625q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.484375 0q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.28125 0.609375q-0.21875 0.1875 -0.828125 0.1875l0.609375 2.546875l0.984375 -2.609375l1.421875 0l1.0 2.609375l0.625 -2.546875q-0.59375 0 -0.78125 -0.109375q-0.375 -0.25 -0.375 -0.6875q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.5 0q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.328125 -0.21875 0.546875q-0.21875 0.21875 -0.640625 0.25l-1.3125 5.5l-1.484375 0l-1.171875 -2.953125zm11.3203125 -2.265625q-0.390625 -0.25 -0.828125 -0.359375q-0.421875 -0.125 -0.890625 -0.125q-0.921875 0 -1.46875 0.296875q-0.25 0.140625 -0.25 0.296875q0 0.171875 0.328125 0.34375q0.25 0.125 1.125 0.25q1.59375 0.21875 2.21875 0.4375q0.8125 0.28125 1.25 0.859375q0.453125 0.5625 0.453125 1.203125q0 0.859375 -0.75 1.4375q-1.09375 0.84375 -2.828125 0.84375q-0.6875 0 -1.28125 -0.125q-0.59375 -0.125 -1.078125 -0.359375q-0.125 0.09375 -0.265625 0.15625q-0.125 0.046875 -0.265625 0.046875q-0.375 0 -0.59375 -0.234375q-0.21875 -0.25 -0.21875 -0.828125l0 -0.546875q0 -0.578125 0.21875 -0.8125q0.21875 -0.25 0.578125 -0.25q0.296875 0 0.484375 0.15625q0.203125 0.15625 0.3125 0.546875q0.359375 0.3125 0.875 0.484375q0.515625 0.15625 1.1875 0.15625q1.109375 0 1.71875 -0.34375q0.28125 -0.171875 0.28125 -0.359375q0 -0.3125 -0.40625 -0.515625q-0.421875 -0.203125 -1.71875 -0.34375q-1.921875 -0.203125 -2.578125 -0.78125q-0.640625 -0.578125 -0.640625 -1.40625q0 -0.859375 0.71875 -1.4375q0.984375 -0.78125 2.578125 -0.78125q0.5625 0 1.0625 0.109375q0.515625 0.109375 0.984375 0.328125q0.15625 -0.109375 0.28125 -0.15625q0.125 -0.0625 0.234375 -0.0625q0.328125 0 0.546875 0.25q0.21875 0.234375 0.21875 0.8125l0 0.390625q0 0.53125 -0.125 0.71875q-0.25 0.359375 -0.671875 0.359375q-0.296875 0 -0.515625 -0.171875q-0.21875 -0.1875 -0.28125 -0.484375zm6.9453125 1.96875l0 1.640625l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.2656326l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.1562576q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.42188263 -1.421875 -0.42188263l-1.84375 0l0 3.0156326zm11.9765625 4.859375l0 -0.375q-0.609375 0.3125 -1.34375 0.46875q-0.71875 0.171875 -1.3125 0.171875q-1.28125 0 -2.09375 -0.6875q-0.796875 -0.6875 -0.796875 -1.515625q0 -1.0 1.015625 -1.859375q1.03125 -0.875 2.84375 -0.875q0.734375 0 1.6875 0.15625l0 -0.375q0 -0.359375 -0.3125 -0.578125q-0.3125 -0.234375 -1.171875 -0.234375q-0.71875 0 -1.84375 0.28125q-0.421875 0.09375 -0.65625 0.09375q-0.328125 0 -0.546875 -0.21875q-0.21875 -0.234375 -0.21875 -0.59375q0 -0.203125 0.078125 -0.34375q0.078125 -0.15625 0.21875 -0.25q0.140625 -0.09375 0.578125 -0.21875q0.59375 -0.15625 1.203125 -0.25q0.625 -0.109375 1.125 -0.109375q1.5 0 2.3125 0.65625q0.828125 0.640625 0.828125 1.75l0 3.296875l0.28125 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.875 0zm0 -2.875q-0.96875 -0.1875 -1.78125 -0.1875q-0.96875 0 -1.671875 0.484375q-0.4375 0.296875 -0.4375 0.609375q0 0.234375 0.203125 0.375q0.390625 0.25 1.078125 0.25q0.578125 0 1.296875 -0.21875q0.734375 -0.234375 1.3125 -0.625l0 -0.6875zm7.7578125 -2.625l0 3.21875q0 0.515625 0.21875 0.671875q0.328125 0.265625 1.171875 0.265625q1.21875 0 2.265625 -0.53125q0.390625 -0.203125 0.625 -0.203125q0.3125 0 0.53125 0.234375q0.234375 0.234375 0.234375 0.578125q0 0.3125 -0.25 0.53125q-0.375 0.375 -1.515625 0.6875q-1.125 0.3125 -1.890625 0.3125q-1.5 0 -2.25 -0.640625q-0.734375 -0.65625 -0.734375 -1.59375l0 -3.53125l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l0.578125 0l0 -1.4531326q0 -0.578125 0.21875 -0.8125q0.21875 -0.25 0.578125 -0.25q0.359375 0 0.578125 0.25q0.21875 0.234375 0.21875 0.8125l0 1.4531326l2.96875 0q0.578125 0 0.8125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-2.96875 0zm8.3515625 -4.6406326l0 3.4218826q0.5 -0.296875 1.0 -0.4375q0.515625 -0.15625 1.046875 -0.15625q0.828125 0 1.46875 0.28125q0.65625 0.28125 1.078125 0.890625q0.421875 0.609375 0.421875 1.53125l0 3.0q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.4375 0.375 -0.671875q0.203125 -0.125 0.796875 -0.125l0 -2.890625q0 -0.625 -0.28125 -0.875q-0.359375 -0.328125 -1.078125 -0.328125q-0.53125 0 -0.953125 0.203125q-0.40625 0.203125 -1.09375 0.890625l0 3.0q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.4375 0.375 -0.671875q0.1875 -0.125 0.796875 -0.125l0 -6.9218826l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.875 0z" fill-rule="nonzero"/><path fill="#ffffff" d="m203.43307 160.27034l113.98425 0l0 61.16536l-113.98425 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m203.43307 160.27034l113.98425 0l0 61.16536l-113.98425 0z" fill-rule="evenodd"/><path fill="#000000" d="m245.09708 193.46301l0 1.640625l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.265625l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.15625q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.421875 -1.421875 -0.421875l-1.84375 0l0 3.015625zm11.9765625 4.859375l0 -0.375q-0.609375 0.3125 -1.34375 0.46875q-0.71875 0.171875 -1.3125 0.171875q-1.28125 0 -2.09375 -0.6875q-0.796875 -0.6875 -0.796875 -1.515625q0 -1.0 1.015625 -1.859375q1.03125 -0.875 2.84375 -0.875q0.734375 0 1.6875 0.15625l0 -0.375q0 -0.359375 -0.3125 -0.578125q-0.3125 -0.234375 -1.171875 -0.234375q-0.71875 0 -1.84375 0.28125q-0.421875 0.09375 -0.65625 0.09375q-0.328125 0 -0.546875 -0.21875q-0.21875 -0.234375 -0.21875 -0.59375q0 -0.203125 0.078125 -0.34375q0.078125 -0.15625 0.21875 -0.25q0.140625 -0.09375 0.578125 -0.21875q0.59375 -0.15625 1.203125 -0.25q0.625 -0.109375 1.125 -0.109375q1.5 0 2.3125 0.65625q0.828125 0.640625 0.828125 1.75l0 3.296875l0.28125 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.875 0zm0 -2.875q-0.96875 -0.1875 -1.78125 -0.1875q-0.96875 0 -1.671875 0.484375q-0.4375 0.296875 -0.4375 0.609375q0 0.234375 0.203125 0.375q0.390625 0.25 1.078125 0.25q0.578125 0 1.296875 -0.21875q0.734375 -0.234375 1.3125 -0.625l0 -0.6875zm7.7578125 -2.625l0 3.21875q0 0.515625 0.21875 0.671875q0.328125 0.265625 1.171875 0.265625q1.21875 0 2.265625 -0.53125q0.390625 -0.203125 0.625 -0.203125q0.3125 0 0.53125 0.234375q0.234375 0.234375 0.234375 0.578125q0 0.3125 -0.25 0.53125q-0.375 0.375 -1.515625 0.6875q-1.125 0.3125 -1.890625 0.3125q-1.5 0 -2.25 -0.640625q-0.734375 -0.65625 -0.734375 -1.59375l0 -3.53125l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l0.578125 0l0 -1.453125q0 -0.578125 0.21875 -0.8125q0.21875 -0.25 0.578125 -0.25q0.359375 0 0.578125 0.25q0.21875 0.234375 0.21875 0.8125l0 1.453125l2.96875 0q0.578125 0 0.8125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-2.96875 0zm8.3515625 -4.640625l0 3.421875q0.5 -0.296875 1.0 -0.4375q0.515625 -0.15625 1.046875 -0.15625q0.828125 0 1.46875 0.28125q0.65625 0.28125 1.078125 0.890625q0.421875 0.609375 0.421875 1.53125l0 3.0q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.4375 0.375 -0.671875q0.203125 -0.125 0.796875 -0.125l0 -2.890625q0 -0.625 -0.28125 -0.875q-0.359375 -0.328125 -1.078125 -0.328125q-0.53125 0 -0.953125 0.203125q-0.40625 0.203125 -1.09375 0.890625l0 3.0q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.4375 0.375 -0.671875q0.1875 -0.125 0.796875 -0.125l0 -6.921875l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.875 0z" fill-rule="nonzero"/><path fill="#ffffff" d="m26.64567 221.4357l158.20471 0l0 61.165344l-158.20471 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m26.64567 221.4357l158.20471 0l0 61.165344l-158.20471 0z" fill-rule="evenodd"/><path fill="#000000" d="m66.416 254.62837l0 1.6406097l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.2656097l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.15625q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.421875 -1.421875 -0.421875l-1.84375 0l0 3.015625zm14.6953125 1.4375q0 0.921875 -0.515625 1.7968597q-0.515625 0.859375 -1.53125 1.375q-1.0 0.515625 -2.109375 0.515625q-1.09375 0 -2.09375 -0.5q-1.0 -0.515625 -1.53125 -1.375q-0.515625 -0.87498474 -0.515625 -1.8281097q0 -0.953125 0.53125 -1.875q0.53125 -0.9375 1.53125 -1.46875q1.0 -0.53125 2.078125 -0.53125q1.09375 0 2.109375 0.546875q1.015625 0.546875 1.53125 1.46875q0.515625 0.90625 0.515625 1.875zm-1.609375 0.015625q0 -0.78125 -0.546875 -1.421875q-0.765625 -0.875 -2.0 -0.875q-1.078125 0 -1.8125 0.703125q-0.71875 0.6875 -0.71875 1.59375q0 0.75 0.734375 1.40625q0.734375 0.65623474 1.796875 0.65623474q1.078125 0 1.8125 -0.65623474q0.734375 -0.65625 0.734375 -1.40625zm8.7734375 -1.8125q-0.390625 -0.25 -0.828125 -0.359375q-0.421875 -0.125 -0.890625 -0.125q-0.921875 0 -1.46875 0.296875q-0.25 0.140625 -0.25 0.296875q0 0.171875 0.328125 0.34375q0.25 0.125 1.125 0.25q1.59375 0.21875 2.21875 0.4375q0.8125 0.28125 1.25 0.859375q0.453125 0.5625 0.453125 1.203125q0 0.85935974 -0.75 1.4374847q-1.09375 0.84375 -2.828125 0.84375q-0.6875 0 -1.28125 -0.125q-0.59375 -0.125 -1.078125 -0.359375q-0.125 0.09375 -0.265625 0.15625q-0.125 0.046875 -0.265625 0.046875q-0.375 0 -0.59375 -0.234375q-0.21875 -0.25 -0.21875 -0.828125l0 -0.546875q0 -0.57810974 0.21875 -0.81248474q0.21875 -0.25 0.578125 -0.25q0.296875 0 0.484375 0.15625q0.203125 0.15625 0.3125 0.546875q0.359375 0.31248474 0.875 0.48435974q0.515625 0.15625 1.1875 0.15625q1.109375 0 1.71875 -0.34375q0.28125 -0.171875 0.28125 -0.35935974q0 -0.3125 -0.40625 -0.515625q-0.421875 -0.203125 -1.71875 -0.34375q-1.921875 -0.203125 -2.578125 -0.78125q-0.640625 -0.578125 -0.640625 -1.40625q0 -0.859375 0.71875 -1.4375q0.984375 -0.78125 2.578125 -0.78125q0.5625 0 1.0625 0.109375q0.515625 0.109375 0.984375 0.328125q0.15625 -0.109375 0.28125 -0.15625q0.125 -0.0625 0.234375 -0.0625q0.328125 0 0.546875 0.25q0.21875 0.234375 0.21875 0.8125l0 0.390625q0 0.53125 -0.125 0.71875q-0.25 0.359375 -0.671875 0.359375q-0.296875 0 -0.515625 -0.171875q-0.21875 -0.1875 -0.28125 -0.484375zm8.4453125 -4.921875l0 1.703125l-1.90625 0l0 -1.703125l1.90625 0zm0.21875 3.046875l0 5.4843597l1.921875 0q0.578125 0 0.828125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-5.4375 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.921875 0l0 -3.8906097l-1.296875 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.234375 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.890625 0zm10.0078125 3.40625l2.4375 2.0781097q0.4375 0.03125 0.65625 0.25q0.21875 0.21875 0.21875 0.5625q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-1.8125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.28125 0.171875 -0.5q0.1875 -0.21875 0.484375 -0.296875l-1.1875 -1.0312347l-1.21875 1.0312347q0.359375 0.09375 0.515625 0.296875q0.171875 0.1875 0.171875 0.5q0 0.359375 -0.25 0.59375q-0.234375 0.21875 -0.8125 0.21875l-1.8125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.328125 0.21875 -0.546875q0.21875 -0.21875 0.65625 -0.25l2.375 -2.0937347l-2.109375 -1.796875q-0.40625 -0.03125 -0.625 -0.25q-0.21875 -0.21875 -0.21875 -0.546875q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.5 0q0.578125 0 0.8125 0.21875q0.25 0.21875 0.25 0.5625q0 0.46875 -0.4375 0.75l0.96875 0.8125l0.953125 -0.828125q-0.421875 -0.296875 -0.421875 -0.703125q0 -0.375 0.234375 -0.59375q0.25 -0.21875 0.828125 -0.21875l1.484375 0q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.328125 -0.21875 0.546875q-0.21875 0.21875 -0.640625 0.25l-2.109375 1.8125zm7.4765625 0.4375l0 1.6406097l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.2656097l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.15625q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.421875 -1.421875 -0.421875l-1.84375 0l0 3.015625zm11.9765625 4.8593597l0 -0.375q-0.609375 0.3125 -1.34375 0.46875q-0.71875 0.171875 -1.3125 0.171875q-1.28125 0 -2.09375 -0.6875q-0.796875 -0.6875 -0.796875 -1.5156097q0 -1.0 1.015625 -1.859375q1.03125 -0.875 2.84375 -0.875q0.734375 0 1.6875 0.15625l0 -0.375q0 -0.359375 -0.3125 -0.578125q-0.3125 -0.234375 -1.171875 -0.234375q-0.71875 0 -1.84375 0.28125q-0.421875 0.09375 -0.65625 0.09375q-0.328125 0 -0.546875 -0.21875q-0.21875 -0.234375 -0.21875 -0.59375q0 -0.203125 0.078125 -0.34375q0.078125 -0.15625 0.21875 -0.25q0.140625 -0.09375 0.578125 -0.21875q0.59375 -0.15625 1.203125 -0.25q0.625 -0.109375 1.125 -0.109375q1.5 0 2.3125 0.65625q0.828125 0.640625 0.828125 1.75l0 3.2968597l0.28125 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.875 0zm0 -2.8749847q-0.96875 -0.1875 -1.78125 -0.1875q-0.96875 0 -1.671875 0.484375q-0.4375 0.296875 -0.4375 0.609375q0 0.23435974 0.203125 0.37498474q0.390625 0.25 1.078125 0.25q0.578125 0 1.296875 -0.21875q0.734375 -0.234375 1.3125 -0.62498474l0 -0.6875zm7.7578125 -2.625l0 3.21875q0 0.51560974 0.21875 0.67185974q0.328125 0.265625 1.171875 0.265625q1.21875 0 2.265625 -0.53125q0.390625 -0.20310974 0.625 -0.20310974q0.3125 0 0.53125 0.23435974q0.234375 0.234375 0.234375 0.578125q0 0.3125 -0.25 0.53125q-0.375 0.375 -1.515625 0.6875q-1.125 0.3125 -1.890625 0.3125q-1.5 0 -2.25 -0.640625q-0.734375 -0.65625 -0.734375 -1.5937347l0 -3.53125l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l0.578125 0l0 -1.453125q0 -0.578125 0.21875 -0.8125q0.21875 -0.25 0.578125 -0.25q0.359375 0 0.578125 0.25q0.21875 0.234375 0.21875 0.8125l0 1.453125l2.96875 0q0.578125 0 0.8125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-2.96875 0zm8.3515625 -4.640625l0 3.421875q0.5 -0.296875 1.0 -0.4375q0.515625 -0.15625 1.046875 -0.15625q0.828125 0 1.46875 0.28125q0.65625 0.28125 1.078125 0.890625q0.421875 0.609375 0.421875 1.53125l0 2.9999847q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.4375 0.375 -0.671875q0.203125 -0.125 0.796875 -0.125l0 -2.8906097q0 -0.625 -0.28125 -0.875q-0.359375 -0.328125 -1.078125 -0.328125q-0.53125 0 -0.953125 0.203125q-0.40625 0.203125 -1.09375 0.890625l0 2.9999847q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.4375 0.375 -0.671875q0.1875 -0.125 0.796875 -0.125l0 -6.9218597l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.875 0z" fill-rule="nonzero"/><path fill="#ffffff" d="m336.0 221.4357l174.04724 0l0 61.165344l-174.04724 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m336.0 221.4357l174.04724 0l0 61.165344l-174.04724 0z" fill-rule="evenodd"/><path fill="#000000" d="m375.02753 253.3315l-1.484375 4.5468597l-1.796875 0l-0.953125 -7.8749847q-0.375 -0.046875 -0.5625 -0.25q-0.1875 -0.203125 -0.1875 -0.53125q0 -0.375 0.25 -0.59375q0.25 -0.234375 0.828125 -0.234375l2.125 0.015625q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-0.828125 0l0.53125 4.484375l1.25 -3.734375l1.671875 0l1.25 3.734375l0.53125 -4.484375l-0.84375 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.21875 -0.234375 -0.578125q0 -0.359375 0.234375 -0.578125q0.25 -0.234375 0.828125 -0.234375l2.125 0.015625q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.296875 -0.203125 0.515625q-0.1875 0.21875 -0.5625 0.28125l-0.921875 7.8749847l-1.765625 0l-1.53125 -4.5468597zm10.1640625 -5.59375l0 1.703125l-1.90625 0l0 -1.703125l1.90625 0zm0.21875 3.046875l0 5.4843597l1.921875 0q0.578125 0 0.828125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-5.4375 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.921875 0l0 -3.8906097l-1.296875 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.234375 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.890625 0zm7.1953125 0l0 0.53125q0.4375 -0.375 0.953125 -0.5625q0.53125 -0.1875 1.15625 -0.1875q1.421875 0 2.25 0.890625q0.65625 0.703125 0.65625 1.84375l0 2.9687347q0.5 0 0.734375 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.453125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.34375 0.234375 -0.5625q0.25 -0.234375 0.75 -0.234375l0 -3.0156097q0 -0.53125 -0.28125 -0.765625q-0.359375 -0.3125 -1.09375 -0.3125q-0.5625 0 -0.984375 0.21875q-0.40625 0.203125 -1.046875 0.90625l0 2.9687347q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.4375 0.375 -0.671875q0.1875 -0.125 0.796875 -0.125l0 -3.8906097q-0.5 0 -0.75 -0.21875q-0.234375 -0.234375 -0.234375 -0.578125q0 -0.359375 0.234375 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.53125 0zm14.8984375 -3.046875l0 8.531235l0.265625 0q0.578125 0 0.828125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-1.875 0l0 -0.390625q-0.546875 0.3125 -1.140625 0.484375q-0.59375 0.171875 -1.234375 0.171875q-1.8125 0 -2.921875 -1.046875q-1.09375 -1.046875 -1.09375 -2.6093597q0 -1.625 1.15625 -2.765625q1.15625 -1.15625 2.828125 -1.15625q0.625 0 1.21875 0.203125q0.609375 0.1875 1.1875 0.5625l0 -1.984375l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l1.875 0zm-1.609375 6.796875q0 -0.984375 -0.703125 -1.671875q-0.6875 -0.6875 -1.6875 -0.6875q-1.0 0 -1.703125 0.6875q-0.6875 0.6875 -0.6875 1.65625q0 0.875 0.625 1.453125q0.625 0.56248474 1.765625 0.56248474q1.125 0 1.75 -0.56248474q0.640625 -0.578125 0.640625 -1.4375zm11.6953125 -0.078125q0 0.921875 -0.515625 1.7968597q-0.515625 0.859375 -1.53125 1.375q-1.0 0.515625 -2.109375 0.515625q-1.09375 0 -2.09375 -0.5q-1.0 -0.515625 -1.53125 -1.375q-0.515625 -0.87498474 -0.515625 -1.8281097q0 -0.953125 0.53125 -1.875q0.53125 -0.9375 1.53125 -1.46875q1.0 -0.53125 2.078125 -0.53125q1.09375 0 2.109375 0.546875q1.015625 0.546875 1.53125 1.46875q0.515625 0.90625 0.515625 1.875zm-1.609375 0.015625q0 -0.78125 -0.546875 -1.421875q-0.765625 -0.875 -2.0 -0.875q-1.078125 0 -1.8125 0.703125q-0.71875 0.6875 -0.71875 1.59375q0 0.75 0.734375 1.40625q0.734375 0.65623474 1.796875 0.65623474q1.078125 0 1.8125 -0.65623474q0.734375 -0.65625 0.734375 -1.40625zm7.0546875 0.453125l-1.109375 2.9531097l-1.5 0l-1.34375 -5.4999847q-0.4375 -0.015625 -0.671875 -0.234375q-0.21875 -0.234375 -0.21875 -0.5625q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.484375 0q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.28125 0.609375q-0.21875 0.1875 -0.828125 0.1875l0.609375 2.546875l0.984375 -2.609375l1.421875 0l1.0 2.609375l0.625 -2.546875q-0.59375 0 -0.78125 -0.109375q-0.375 -0.25 -0.375 -0.6875q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.5 0q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.328125 -0.21875 0.546875q-0.21875 0.21875 -0.640625 0.25l-1.3125 5.4999847l-1.484375 0l-1.171875 -2.9531097zm11.3203125 -2.265625q-0.390625 -0.25 -0.828125 -0.359375q-0.421875 -0.125 -0.890625 -0.125q-0.921875 0 -1.46875 0.296875q-0.25 0.140625 -0.25 0.296875q0 0.171875 0.328125 0.34375q0.25 0.125 1.125 0.25q1.59375 0.21875 2.21875 0.4375q0.8125 0.28125 1.25 0.859375q0.453125 0.5625 0.453125 1.203125q0 0.85935974 -0.75 1.4374847q-1.09375 0.84375 -2.828125 0.84375q-0.6875 0 -1.28125 -0.125q-0.59375 -0.125 -1.078125 -0.359375q-0.125 0.09375 -0.265625 0.15625q-0.125 0.046875 -0.265625 0.046875q-0.375 0 -0.59375 -0.234375q-0.21875 -0.25 -0.21875 -0.828125l0 -0.546875q0 -0.57810974 0.21875 -0.81248474q0.21875 -0.25 0.578125 -0.25q0.296875 0 0.484375 0.15625q0.203125 0.15625 0.3125 0.546875q0.359375 0.31248474 0.875 0.48435974q0.515625 0.15625 1.1875 0.15625q1.109375 0 1.71875 -0.34375q0.28125 -0.171875 0.28125 -0.35935974q0 -0.3125 -0.40625 -0.515625q-0.421875 -0.203125 -1.71875 -0.34375q-1.921875 -0.203125 -2.578125 -0.78125q-0.640625 -0.578125 -0.640625 -1.40625q0 -0.859375 0.71875 -1.4375q0.984375 -0.78125 2.578125 -0.78125q0.5625 0 1.0625 0.109375q0.515625 0.109375 0.984375 0.328125q0.15625 -0.109375 0.28125 -0.15625q0.125 -0.0625 0.234375 -0.0625q0.328125 0 0.546875 0.25q0.21875 0.234375 0.21875 0.8125l0 0.390625q0 0.53125 -0.125 0.71875q-0.25 0.359375 -0.671875 0.359375q-0.296875 0 -0.515625 -0.171875q-0.21875 -0.1875 -0.28125 -0.484375zm6.9453125 1.96875l0 1.6406097l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.2656097l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.15625q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.421875 -1.421875 -0.421875l-1.84375 0l0 3.015625zm11.9765625 4.8593597l0 -0.375q-0.609375 0.3125 -1.34375 0.46875q-0.71875 0.171875 -1.3125 0.171875q-1.28125 0 -2.09375 -0.6875q-0.796875 -0.6875 -0.796875 -1.5156097q0 -1.0 1.015625 -1.859375q1.03125 -0.875 2.84375 -0.875q0.734375 0 1.6875 0.15625l0 -0.375q0 -0.359375 -0.3125 -0.578125q-0.3125 -0.234375 -1.171875 -0.234375q-0.71875 0 -1.84375 0.28125q-0.421875 0.09375 -0.65625 0.09375q-0.328125 0 -0.546875 -0.21875q-0.21875 -0.234375 -0.21875 -0.59375q0 -0.203125 0.078125 -0.34375q0.078125 -0.15625 0.21875 -0.25q0.140625 -0.09375 0.578125 -0.21875q0.59375 -0.15625 1.203125 -0.25q0.625 -0.109375 1.125 -0.109375q1.5 0 2.3125 0.65625q0.828125 0.640625 0.828125 1.75l0 3.2968597l0.28125 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.875 0zm0 -2.8749847q-0.96875 -0.1875 -1.78125 -0.1875q-0.96875 0 -1.671875 0.484375q-0.4375 0.296875 -0.4375 0.609375q0 0.23435974 0.203125 0.37498474q0.390625 0.25 1.078125 0.25q0.578125 0 1.296875 -0.21875q0.734375 -0.234375 1.3125 -0.62498474l0 -0.6875zm7.7578125 -2.625l0 3.21875q0 0.51560974 0.21875 0.67185974q0.328125 0.265625 1.171875 0.265625q1.21875 0 2.265625 -0.53125q0.390625 -0.20310974 0.625 -0.20310974q0.3125 0 0.53125 0.23435974q0.234375 0.234375 0.234375 0.578125q0 0.3125 -0.25 0.53125q-0.375 0.375 -1.515625 0.6875q-1.125 0.3125 -1.890625 0.3125q-1.5 0 -2.25 -0.640625q-0.734375 -0.65625 -0.734375 -1.5937347l0 -3.53125l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l0.578125 0l0 -1.453125q0 -0.578125 0.21875 -0.8125q0.21875 -0.25 0.578125 -0.25q0.359375 0 0.578125 0.25q0.21875 0.234375 0.21875 0.8125l0 1.453125l2.96875 0q0.578125 0 0.8125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-2.96875 0zm8.3515625 -4.640625l0 3.421875q0.5 -0.296875 1.0 -0.4375q0.515625 -0.15625 1.046875 -0.15625q0.828125 0 1.46875 0.28125q0.65625 0.28125 1.078125 0.890625q0.421875 0.609375 0.421875 1.53125l0 2.9999847q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.4375 0.375 -0.671875q0.203125 -0.125 0.796875 -0.125l0 -2.8906097q0 -0.625 -0.28125 -0.875q-0.359375 -0.328125 -1.078125 -0.328125q-0.53125 0 -0.953125 0.203125q-0.40625 0.203125 -1.09375 0.890625l0 2.9999847q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.4375 0.375 -0.671875q0.1875 -0.125 0.796875 -0.125l0 -6.9218597l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.875 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m105.74803 99.10499l97.70079 -30.58268" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m105.74803 99.10499l91.97476 -28.79029" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m198.21622 71.891l3.8374481 -2.9319763l-4.824295 -0.22064209z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m423.02362 99.10499l-105.60629 -30.58268" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m423.02362 99.10499l-99.84308 -28.913704" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m323.63998 68.60474l-4.818451 0.32421875l3.8995361 2.848877z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m105.74803 221.4357l0 -61.16536" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m105.74803 221.4357l0 -55.16536" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m107.399765 166.27034l-1.6517334 -4.538101l-1.6517334 4.538101z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m423.02362 221.4357l0 -61.16536" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m423.02362 221.4357l0 -55.16536" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m424.67535 166.27034l-1.6517334 -4.538101l-1.6517334 4.538101z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m260.4252 160.27034l0 -61.16535" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m260.4252 160.27034l0 -55.16535" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m262.07693 105.10499l-1.6517334 -4.538101l-1.6517334 4.538101z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m105.74803 221.4357l97.70079 -30.582687" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m105.74803 221.4357l91.97476 -28.790298" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m198.21622 194.22171l3.8374481 -2.9319763l-4.824295 -0.22064209z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m423.02362 221.4357l-105.60629 -30.582687" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m423.02362 221.4357l-99.84308 -28.913696" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m323.63998 190.93544l-4.818451 0.32421875l3.8995361 2.848877z" fill-rule="evenodd"/></g></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" version="1.1" viewBox="0 0 539.005 319.409"><clipPath id="p.0"><path d="m0 0l539.00525 0l0 319.40945l-539.00525 0l0 -319.40945z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000" fill-opacity="0" fill-rule="evenodd" d="m0 0l539.00525 0l0 319.40945l-539.00525 0z"/><path fill="#fff" fill-rule="evenodd" d="m203.43307 37.929134l113.98425 0l0 61.165356l-113.98425 0z"/><path fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1" d="m203.43307 37.929134l113.98425 0l0 61.165356l-113.98425 0z"/><path fill="#000" fill-rule="nonzero" d="m225.89395 71.12181l0 1.640625l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.265625l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.15625q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.421875 -1.421875 -0.421875l-1.84375 0l0 3.015625zm13.9296875 -2.234375l0 5.484375q0.515625 0 0.75 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-1.515625 0l0 -0.375q-0.6875 0.3125 -1.3125 0.46875q-0.625 0.171875 -1.1875 0.171875q-0.796875 0 -1.375 -0.328125q-0.578125 -0.34375 -0.90625 -0.9375q-0.25 -0.421875 -0.25 -1.046875l0 -3.453125l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.875 0l0 4.765625q0 0.5 0.234375 0.75q0.25 0.234375 0.765625 0.234375q0.484375 0 1.03125 -0.1875q0.5625 -0.203125 1.390625 -0.703125l0 -3.265625l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.171875 0zm5.8671875 0l0 1.0q1.015625 -0.734375 1.59375 -0.96875q0.578125 -0.25 1.09375 -0.25q0.78125 0 1.515625 0.578125q0.5 0.390625 0.5 0.796875q0 0.34375 -0.25 0.59375q-0.234375 0.234375 -0.5625 0.234375q-0.296875 0 -0.625 -0.296875q-0.328125 -0.296875 -0.59375 -0.296875q-0.328125 0 -1.0 0.421875q-0.671875 0.421875 -1.671875 1.265625l0 2.40625l2.28125 0q0.578125 0 0.828125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-4.828125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.953125 0l0 -3.890625l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.171875 0zm13.9609375 4.359375l-6.578125 0q0.25 0.625 0.890625 1.015625q0.640625 0.375 1.71875 0.375q0.890625 0 2.375 -0.390625q0.609375 -0.15625 0.84375 -0.15625q0.3125 0 0.53125 0.234375q0.21875 0.21875 0.21875 0.5625q0 0.3125 -0.234375 0.53125q-0.3125 0.296875 -1.53125 0.5625q-1.203125 0.265625 -2.3125 0.265625q-1.921875 0 -3.078125 -1.09375q-1.15625 -1.09375 -1.15625 -2.671875q0 -1.6875 1.25 -2.75q1.25 -1.0625 2.875 -1.0625q0.96875 0 1.78125 0.34375q0.828125 0.34375 1.21875 0.75q0.5625 0.578125 0.9375 1.421875q0.25 0.59375 0.25 1.375l0 0.6875zm-1.78125 -1.609375q-0.359375 -0.6875 -0.953125 -1.015625q-0.59375 -0.34375 -1.421875 -0.34375q-0.8125 0 -1.40625 0.34375q-0.59375 0.328125 -0.96875 1.015625l4.75 0zm6.4296875 1.09375l0 1.640625l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.265625l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.15625q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.421875 -1.421875 -0.421875l-1.84375 0l0 3.015625zm11.9765625 4.859375l0 -0.375q-0.609375 0.3125 -1.34375 0.46875q-0.71875 0.171875 -1.3125 0.171875q-1.28125 0 -2.09375 -0.6875q-0.796875 -0.6875 -0.796875 -1.515625q0 -1.0 1.015625 -1.859375q1.03125 -0.875 2.84375 -0.875q0.734375 0 1.6875 0.15625l0 -0.375q0 -0.359375 -0.3125 -0.578125q-0.3125 -0.234375 -1.171875 -0.234375q-0.71875 0 -1.84375 0.28125q-0.421875 0.09375 -0.65625 0.09375q-0.328125 0 -0.546875 -0.21875q-0.21875 -0.234375 -0.21875 -0.59375q0 -0.203125 0.078125 -0.34375q0.078125 -0.15625 0.21875 -0.25q0.140625 -0.09375 0.578125 -0.21875q0.59375 -0.15625 1.203125 -0.25q0.625 -0.109375 1.125 -0.109375q1.5 0 2.3125 0.65625q0.828125 0.640625 0.828125 1.75l0 3.296875l0.28125 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.875 0zm0 -2.875q-0.96875 -0.1875 -1.78125 -0.1875q-0.96875 0 -1.671875 0.484375q-0.4375 0.296875 -0.4375 0.609375q0 0.234375 0.203125 0.375q0.390625 0.25 1.078125 0.25q0.578125 0 1.296875 -0.21875q0.734375 -0.234375 1.3125 -0.625l0 -0.6875zm7.7578125 -2.625l0 3.21875q0 0.515625 0.21875 0.671875q0.328125 0.265625 1.171875 0.265625q1.21875 0 2.265625 -0.53125q0.390625 -0.203125 0.625 -0.203125q0.3125 0 0.53125 0.234375q0.234375 0.234375 0.234375 0.578125q0 0.3125 -0.25 0.53125q-0.375 0.375 -1.515625 0.6875q-1.125 0.3125 -1.890625 0.3125q-1.5 0 -2.25 -0.640625q-0.734375 -0.65625 -0.734375 -1.59375l0 -3.53125l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l0.578125 0l0 -1.453125q0 -0.578125 0.21875 -0.8125q0.21875 -0.25 0.578125 -0.25q0.359375 0 0.578125 0.25q0.21875 0.234375 0.21875 0.8125l0 1.453125l2.96875 0q0.578125 0 0.8125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-2.96875 0zm8.3515625 -4.640625l0 3.421875q0.5 -0.296875 1.0 -0.4375q0.515625 -0.15625 1.046875 -0.15625q0.828125 0 1.46875 0.28125q0.65625 0.28125 1.078125 0.890625q0.421875 0.609375 0.421875 1.53125l0 3.0q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.4375 0.375 -0.671875q0.203125 -0.125 0.796875 -0.125l0 -2.890625q0 -0.625 -0.28125 -0.875q-0.359375 -0.328125 -1.078125 -0.328125q-0.53125 0 -0.953125 0.203125q-0.40625 0.203125 -1.09375 0.890625l0 3.0q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.4375 0.375 -0.671875q0.1875 -0.125 0.796875 -0.125l0 -6.921875l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.875 0z"/><path fill="#fff" fill-rule="evenodd" d="m26.64567 99.10499l158.20471 0l0 61.16535l-158.20471 0z"/><path fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1" d="m26.64567 99.10499l158.20471 0l0 61.16535l-158.20471 0z"/><path fill="#000" fill-rule="nonzero" d="m47.212875 132.29767l0 1.640625l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.2656326l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.1562576q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.42188263 -1.421875 -0.42188263l-1.84375 0l0 3.0156326zm13.9296875 -2.234375l0 5.484375q0.515625 0 0.75 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-1.515625 0l0 -0.375q-0.6875 0.3125 -1.3125 0.46875q-0.625 0.171875 -1.1875 0.171875q-0.796875 0 -1.375 -0.328125q-0.578125 -0.34375 -0.90625 -0.9375q-0.25 -0.421875 -0.25 -1.046875l0 -3.453125l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.875 0l0 4.765625q0 0.5 0.234375 0.75q0.25 0.234375 0.765625 0.234375q0.484375 0 1.03125 -0.1875q0.5625 -0.203125 1.390625 -0.703125l0 -3.265625l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.171875 0zm5.8671875 0l0 1.0q1.015625 -0.734375 1.59375 -0.96875q0.578125 -0.25 1.09375 -0.25q0.78125 0 1.515625 0.578125q0.5 0.390625 0.5 0.796875q0 0.34375 -0.25 0.59375q-0.234375 0.234375 -0.5625 0.234375q-0.296875 0 -0.625 -0.296875q-0.328125 -0.296875 -0.59375 -0.296875q-0.328125 0 -1.0 0.421875q-0.671875 0.421875 -1.671875 1.265625l0 2.40625l2.28125 0q0.578125 0 0.828125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-4.828125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.953125 0l0 -3.890625l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.171875 0zm13.9609375 4.359375l-6.578125 0q0.25 0.625 0.890625 1.015625q0.640625 0.375 1.71875 0.375q0.890625 0 2.375 -0.390625q0.609375 -0.15625 0.84375 -0.15625q0.3125 0 0.53125 0.234375q0.21875 0.21875 0.21875 0.5625q0 0.3125 -0.234375 0.53125q-0.3125 0.296875 -1.53125 0.5625q-1.203125 0.265625 -2.3125 0.265625q-1.921875 0 -3.078125 -1.09375q-1.15625 -1.09375 -1.15625 -2.671875q0 -1.6875 1.25 -2.75q1.25 -1.0625 2.875 -1.0625q0.96875 0 1.78125 0.34375q0.828125 0.34375 1.21875 0.75q0.5625 0.578125 0.9375 1.421875q0.25 0.59375 0.25 1.375l0 0.6875zm-1.78125 -1.609375q-0.359375 -0.6875 -0.953125 -1.015625q-0.59375 -0.34375 -1.421875 -0.34375q-0.8125 0 -1.40625 0.34375q-0.59375 0.328125 -0.96875 1.015625l4.75 0zm6.4296875 1.09375l0 1.640625l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.2656326l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.1562576q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.42188263 -1.421875 -0.42188263l-1.84375 0l0 3.0156326zm14.6953125 1.4375q0 0.921875 -0.515625 1.796875q-0.515625 0.859375 -1.53125 1.375q-1.0 0.515625 -2.109375 0.515625q-1.09375 0 -2.09375 -0.5q-1.0 -0.515625 -1.53125 -1.375q-0.515625 -0.875 -0.515625 -1.828125q0 -0.953125 0.53125 -1.875q0.53125 -0.9375 1.53125 -1.46875q1.0 -0.53125 2.078125 -0.53125q1.09375 0 2.109375 0.546875q1.015625 0.546875 1.53125 1.46875q0.515625 0.90625 0.515625 1.875zm-1.609375 0.015625q0 -0.78125 -0.546875 -1.421875q-0.765625 -0.875 -2.0 -0.875q-1.078125 0 -1.8125 0.703125q-0.71875 0.6875 -0.71875 1.59375q0 0.75 0.734375 1.40625q0.734375 0.65625 1.796875 0.65625q1.078125 0 1.8125 -0.65625q0.734375 -0.65625 0.734375 -1.40625zm8.7734375 -1.8125q-0.390625 -0.25 -0.828125 -0.359375q-0.421875 -0.125 -0.890625 -0.125q-0.921875 0 -1.46875 0.296875q-0.25 0.140625 -0.25 0.296875q0 0.171875 0.328125 0.34375q0.25 0.125 1.125 0.25q1.59375 0.21875 2.21875 0.4375q0.8125 0.28125 1.25 0.859375q0.453125 0.5625 0.453125 1.203125q0 0.859375 -0.75 1.4375q-1.09375 0.84375 -2.828125 0.84375q-0.6875 0 -1.28125 -0.125q-0.59375 -0.125 -1.078125 -0.359375q-0.125 0.09375 -0.265625 0.15625q-0.125 0.046875 -0.265625 0.046875q-0.375 0 -0.59375 -0.234375q-0.21875 -0.25 -0.21875 -0.828125l0 -0.546875q0 -0.578125 0.21875 -0.8125q0.21875 -0.25 0.578125 -0.25q0.296875 0 0.484375 0.15625q0.203125 0.15625 0.3125 0.546875q0.359375 0.3125 0.875 0.484375q0.515625 0.15625 1.1875 0.15625q1.109375 0 1.71875 -0.34375q0.28125 -0.171875 0.28125 -0.359375q0 -0.3125 -0.40625 -0.515625q-0.421875 -0.203125 -1.71875 -0.34375q-1.921875 -0.203125 -2.578125 -0.78125q-0.640625 -0.578125 -0.640625 -1.40625q0 -0.859375 0.71875 -1.4375q0.984375 -0.78125 2.578125 -0.78125q0.5625 0 1.0625 0.109375q0.515625 0.109375 0.984375 0.328125q0.15625 -0.109375 0.28125 -0.15625q0.125 -0.0625 0.234375 -0.0625q0.328125 0 0.546875 0.25q0.21875 0.234375 0.21875 0.8125l0 0.390625q0 0.53125 -0.125 0.71875q-0.25 0.359375 -0.671875 0.359375q-0.296875 0 -0.515625 -0.171875q-0.21875 -0.1875 -0.28125 -0.484375zm8.4453125 -4.9218826l0 1.703125l-1.90625 0l0 -1.703125l1.90625 0zm0.21875 3.0468826l0 5.484375l1.921875 0q0.578125 0 0.828125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-5.4375 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.921875 0l0 -3.890625l-1.296875 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.234375 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.890625 0zm10.0078125 3.40625l2.4375 2.078125q0.4375 0.03125 0.65625 0.25q0.21875 0.21875 0.21875 0.5625q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-1.8125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.28125 0.171875 -0.5q0.1875 -0.21875 0.484375 -0.296875l-1.1875 -1.03125l-1.21875 1.03125q0.359375 0.09375 0.515625 0.296875q0.171875 0.1875 0.171875 0.5q0 0.359375 -0.25 0.59375q-0.234375 0.21875 -0.8125 0.21875l-1.8125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.328125 0.21875 -0.546875q0.21875 -0.21875 0.65625 -0.25l2.375 -2.09375l-2.109375 -1.796875q-0.40625 -0.03125 -0.625 -0.25q-0.21875 -0.21875 -0.21875 -0.546875q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.5 0q0.578125 0 0.8125 0.21875q0.25 0.21875 0.25 0.5625q0 0.46875 -0.4375 0.75l0.96875 0.8125l0.953125 -0.828125q-0.421875 -0.296875 -0.421875 -0.703125q0 -0.375 0.234375 -0.59375q0.25 -0.21875 0.828125 -0.21875l1.484375 0q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.328125 -0.21875 0.546875q-0.21875 0.21875 -0.640625 0.25l-2.109375 1.8125zm7.4765625 0.4375l0 1.640625l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.2656326l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.1562576q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.42188263 -1.421875 -0.42188263l-1.84375 0l0 3.0156326zm11.9765625 4.859375l0 -0.375q-0.609375 0.3125 -1.34375 0.46875q-0.71875 0.171875 -1.3125 0.171875q-1.28125 0 -2.09375 -0.6875q-0.796875 -0.6875 -0.796875 -1.515625q0 -1.0 1.015625 -1.859375q1.03125 -0.875 2.84375 -0.875q0.734375 0 1.6875 0.15625l0 -0.375q0 -0.359375 -0.3125 -0.578125q-0.3125 -0.234375 -1.171875 -0.234375q-0.71875 0 -1.84375 0.28125q-0.421875 0.09375 -0.65625 0.09375q-0.328125 0 -0.546875 -0.21875q-0.21875 -0.234375 -0.21875 -0.59375q0 -0.203125 0.078125 -0.34375q0.078125 -0.15625 0.21875 -0.25q0.140625 -0.09375 0.578125 -0.21875q0.59375 -0.15625 1.203125 -0.25q0.625 -0.109375 1.125 -0.109375q1.5 0 2.3125 0.65625q0.828125 0.640625 0.828125 1.75l0 3.296875l0.28125 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.875 0zm0 -2.875q-0.96875 -0.1875 -1.78125 -0.1875q-0.96875 0 -1.671875 0.484375q-0.4375 0.296875 -0.4375 0.609375q0 0.234375 0.203125 0.375q0.390625 0.25 1.078125 0.25q0.578125 0 1.296875 -0.21875q0.734375 -0.234375 1.3125 -0.625l0 -0.6875zm7.7578125 -2.625l0 3.21875q0 0.515625 0.21875 0.671875q0.328125 0.265625 1.171875 0.265625q1.21875 0 2.265625 -0.53125q0.390625 -0.203125 0.625 -0.203125q0.3125 0 0.53125 0.234375q0.234375 0.234375 0.234375 0.578125q0 0.3125 -0.25 0.53125q-0.375 0.375 -1.515625 0.6875q-1.125 0.3125 -1.890625 0.3125q-1.5 0 -2.25 -0.640625q-0.734375 -0.65625 -0.734375 -1.59375l0 -3.53125l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l0.578125 0l0 -1.4531326q0 -0.578125 0.21875 -0.8125q0.21875 -0.25 0.578125 -0.25q0.359375 0 0.578125 0.25q0.21875 0.234375 0.21875 0.8125l0 1.4531326l2.96875 0q0.578125 0 0.8125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-2.96875 0zm8.3515625 -4.6406326l0 3.4218826q0.5 -0.296875 1.0 -0.4375q0.515625 -0.15625 1.046875 -0.15625q0.828125 0 1.46875 0.28125q0.65625 0.28125 1.078125 0.890625q0.421875 0.609375 0.421875 1.53125l0 3.0q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.4375 0.375 -0.671875q0.203125 -0.125 0.796875 -0.125l0 -2.890625q0 -0.625 -0.28125 -0.875q-0.359375 -0.328125 -1.078125 -0.328125q-0.53125 0 -0.953125 0.203125q-0.40625 0.203125 -1.09375 0.890625l0 3.0q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.4375 0.375 -0.671875q0.1875 -0.125 0.796875 -0.125l0 -6.9218826l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.875 0z"/><path fill="#fff" fill-rule="evenodd" d="m336.0 99.10499l174.04724 0l0 61.16535l-174.04724 0z"/><path fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1" d="m336.0 99.10499l174.04724 0l0 61.16535l-174.04724 0z"/><path fill="#000" fill-rule="nonzero" d="m354.8869 132.29767l0 1.640625l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.2656326l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.1562576q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.42188263 -1.421875 -0.42188263l-1.84375 0l0 3.0156326zm13.9296875 -2.234375l0 5.484375q0.515625 0 0.75 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-1.515625 0l0 -0.375q-0.6875 0.3125 -1.3125 0.46875q-0.625 0.171875 -1.1875 0.171875q-0.796875 0 -1.375 -0.328125q-0.578125 -0.34375 -0.90625 -0.9375q-0.25 -0.421875 -0.25 -1.046875l0 -3.453125l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.875 0l0 4.765625q0 0.5 0.234375 0.75q0.25 0.234375 0.765625 0.234375q0.484375 0 1.03125 -0.1875q0.5625 -0.203125 1.390625 -0.703125l0 -3.265625l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.171875 0zm5.8671875 0l0 1.0q1.015625 -0.734375 1.59375 -0.96875q0.578125 -0.25 1.09375 -0.25q0.78125 0 1.515625 0.578125q0.5 0.390625 0.5 0.796875q0 0.34375 -0.25 0.59375q-0.234375 0.234375 -0.5625 0.234375q-0.296875 0 -0.625 -0.296875q-0.328125 -0.296875 -0.59375 -0.296875q-0.328125 0 -1.0 0.421875q-0.671875 0.421875 -1.671875 1.265625l0 2.40625l2.28125 0q0.578125 0 0.828125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-4.828125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.953125 0l0 -3.890625l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.171875 0zm13.9609375 4.359375l-6.578125 0q0.25 0.625 0.890625 1.015625q0.640625 0.375 1.71875 0.375q0.890625 0 2.375 -0.390625q0.609375 -0.15625 0.84375 -0.15625q0.3125 0 0.53125 0.234375q0.21875 0.21875 0.21875 0.5625q0 0.3125 -0.234375 0.53125q-0.3125 0.296875 -1.53125 0.5625q-1.203125 0.265625 -2.3125 0.265625q-1.921875 0 -3.078125 -1.09375q-1.15625 -1.09375 -1.15625 -2.671875q0 -1.6875 1.25 -2.75q1.25 -1.0625 2.875 -1.0625q0.96875 0 1.78125 0.34375q0.828125 0.34375 1.21875 0.75q0.5625 0.578125 0.9375 1.421875q0.25 0.59375 0.25 1.375l0 0.6875zm-1.78125 -1.609375q-0.359375 -0.6875 -0.953125 -1.015625q-0.59375 -0.34375 -1.421875 -0.34375q-0.8125 0 -1.40625 0.34375q-0.59375 0.328125 -0.96875 1.015625l4.75 0zm7.3671875 -0.203125l-1.484375 4.546875l-1.796875 0l-0.953125 -7.8750076q-0.375 -0.046875 -0.5625 -0.25q-0.1875 -0.203125 -0.1875 -0.53125q0 -0.375 0.25 -0.59375q0.25 -0.234375 0.828125 -0.234375l2.125 0.015625q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-0.828125 0l0.53125 4.4843826l1.25 -3.734375l1.671875 0l1.25 3.734375l0.53125 -4.4843826l-0.84375 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.21875 -0.234375 -0.578125q0 -0.359375 0.234375 -0.578125q0.25 -0.234375 0.828125 -0.234375l2.125 0.015625q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.296875 -0.203125 0.515625q-0.1875 0.21875 -0.5625 0.28125l-0.921875 7.8750076l-1.765625 0l-1.53125 -4.546875zm10.1640625 -5.5937576l0 1.703125l-1.90625 0l0 -1.703125l1.90625 0zm0.21875 3.0468826l0 5.484375l1.921875 0q0.578125 0 0.828125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-5.4375 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.921875 0l0 -3.890625l-1.296875 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.234375 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.890625 0zm7.1953125 0l0 0.53125q0.4375 -0.375 0.953125 -0.5625q0.53125 -0.1875 1.15625 -0.1875q1.421875 0 2.25 0.890625q0.65625 0.703125 0.65625 1.84375l0 2.96875q0.5 0 0.734375 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.453125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.34375 0.234375 -0.5625q0.25 -0.234375 0.75 -0.234375l0 -3.015625q0 -0.53125 -0.28125 -0.765625q-0.359375 -0.3125 -1.09375 -0.3125q-0.5625 0 -0.984375 0.21875q-0.40625 0.203125 -1.046875 0.90625l0 2.96875q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.4375 0.375 -0.671875q0.1875 -0.125 0.796875 -0.125l0 -3.890625q-0.5 0 -0.75 -0.21875q-0.234375 -0.234375 -0.234375 -0.578125q0 -0.359375 0.234375 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.53125 0zm14.8984375 -3.0468826l0 8.531258l0.265625 0q0.578125 0 0.828125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-1.875 0l0 -0.390625q-0.546875 0.3125 -1.140625 0.484375q-0.59375 0.171875 -1.234375 0.171875q-1.8125 0 -2.921875 -1.046875q-1.09375 -1.046875 -1.09375 -2.609375q0 -1.625 1.15625 -2.765625q1.15625 -1.15625 2.828125 -1.15625q0.625 0 1.21875 0.203125q0.609375 0.1875 1.1875 0.5625l0 -1.9843826l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l1.875 0zm-1.609375 6.7968826q0 -0.984375 -0.703125 -1.671875q-0.6875 -0.6875 -1.6875 -0.6875q-1.0 0 -1.703125 0.6875q-0.6875 0.6875 -0.6875 1.65625q0 0.875 0.625 1.453125q0.625 0.5625 1.765625 0.5625q1.125 0 1.75 -0.5625q0.640625 -0.578125 0.640625 -1.4375zm11.6953125 -0.078125q0 0.921875 -0.515625 1.796875q-0.515625 0.859375 -1.53125 1.375q-1.0 0.515625 -2.109375 0.515625q-1.09375 0 -2.09375 -0.5q-1.0 -0.515625 -1.53125 -1.375q-0.515625 -0.875 -0.515625 -1.828125q0 -0.953125 0.53125 -1.875q0.53125 -0.9375 1.53125 -1.46875q1.0 -0.53125 2.078125 -0.53125q1.09375 0 2.109375 0.546875q1.015625 0.546875 1.53125 1.46875q0.515625 0.90625 0.515625 1.875zm-1.609375 0.015625q0 -0.78125 -0.546875 -1.421875q-0.765625 -0.875 -2.0 -0.875q-1.078125 0 -1.8125 0.703125q-0.71875 0.6875 -0.71875 1.59375q0 0.75 0.734375 1.40625q0.734375 0.65625 1.796875 0.65625q1.078125 0 1.8125 -0.65625q0.734375 -0.65625 0.734375 -1.40625zm7.0546875 0.453125l-1.109375 2.953125l-1.5 0l-1.34375 -5.5q-0.4375 -0.015625 -0.671875 -0.234375q-0.21875 -0.234375 -0.21875 -0.5625q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.484375 0q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.28125 0.609375q-0.21875 0.1875 -0.828125 0.1875l0.609375 2.546875l0.984375 -2.609375l1.421875 0l1.0 2.609375l0.625 -2.546875q-0.59375 0 -0.78125 -0.109375q-0.375 -0.25 -0.375 -0.6875q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.5 0q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.328125 -0.21875 0.546875q-0.21875 0.21875 -0.640625 0.25l-1.3125 5.5l-1.484375 0l-1.171875 -2.953125zm11.3203125 -2.265625q-0.390625 -0.25 -0.828125 -0.359375q-0.421875 -0.125 -0.890625 -0.125q-0.921875 0 -1.46875 0.296875q-0.25 0.140625 -0.25 0.296875q0 0.171875 0.328125 0.34375q0.25 0.125 1.125 0.25q1.59375 0.21875 2.21875 0.4375q0.8125 0.28125 1.25 0.859375q0.453125 0.5625 0.453125 1.203125q0 0.859375 -0.75 1.4375q-1.09375 0.84375 -2.828125 0.84375q-0.6875 0 -1.28125 -0.125q-0.59375 -0.125 -1.078125 -0.359375q-0.125 0.09375 -0.265625 0.15625q-0.125 0.046875 -0.265625 0.046875q-0.375 0 -0.59375 -0.234375q-0.21875 -0.25 -0.21875 -0.828125l0 -0.546875q0 -0.578125 0.21875 -0.8125q0.21875 -0.25 0.578125 -0.25q0.296875 0 0.484375 0.15625q0.203125 0.15625 0.3125 0.546875q0.359375 0.3125 0.875 0.484375q0.515625 0.15625 1.1875 0.15625q1.109375 0 1.71875 -0.34375q0.28125 -0.171875 0.28125 -0.359375q0 -0.3125 -0.40625 -0.515625q-0.421875 -0.203125 -1.71875 -0.34375q-1.921875 -0.203125 -2.578125 -0.78125q-0.640625 -0.578125 -0.640625 -1.40625q0 -0.859375 0.71875 -1.4375q0.984375 -0.78125 2.578125 -0.78125q0.5625 0 1.0625 0.109375q0.515625 0.109375 0.984375 0.328125q0.15625 -0.109375 0.28125 -0.15625q0.125 -0.0625 0.234375 -0.0625q0.328125 0 0.546875 0.25q0.21875 0.234375 0.21875 0.8125l0 0.390625q0 0.53125 -0.125 0.71875q-0.25 0.359375 -0.671875 0.359375q-0.296875 0 -0.515625 -0.171875q-0.21875 -0.1875 -0.28125 -0.484375zm6.9453125 1.96875l0 1.640625l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.2656326l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.1562576q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.42188263 -1.421875 -0.42188263l-1.84375 0l0 3.0156326zm11.9765625 4.859375l0 -0.375q-0.609375 0.3125 -1.34375 0.46875q-0.71875 0.171875 -1.3125 0.171875q-1.28125 0 -2.09375 -0.6875q-0.796875 -0.6875 -0.796875 -1.515625q0 -1.0 1.015625 -1.859375q1.03125 -0.875 2.84375 -0.875q0.734375 0 1.6875 0.15625l0 -0.375q0 -0.359375 -0.3125 -0.578125q-0.3125 -0.234375 -1.171875 -0.234375q-0.71875 0 -1.84375 0.28125q-0.421875 0.09375 -0.65625 0.09375q-0.328125 0 -0.546875 -0.21875q-0.21875 -0.234375 -0.21875 -0.59375q0 -0.203125 0.078125 -0.34375q0.078125 -0.15625 0.21875 -0.25q0.140625 -0.09375 0.578125 -0.21875q0.59375 -0.15625 1.203125 -0.25q0.625 -0.109375 1.125 -0.109375q1.5 0 2.3125 0.65625q0.828125 0.640625 0.828125 1.75l0 3.296875l0.28125 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.875 0zm0 -2.875q-0.96875 -0.1875 -1.78125 -0.1875q-0.96875 0 -1.671875 0.484375q-0.4375 0.296875 -0.4375 0.609375q0 0.234375 0.203125 0.375q0.390625 0.25 1.078125 0.25q0.578125 0 1.296875 -0.21875q0.734375 -0.234375 1.3125 -0.625l0 -0.6875zm7.7578125 -2.625l0 3.21875q0 0.515625 0.21875 0.671875q0.328125 0.265625 1.171875 0.265625q1.21875 0 2.265625 -0.53125q0.390625 -0.203125 0.625 -0.203125q0.3125 0 0.53125 0.234375q0.234375 0.234375 0.234375 0.578125q0 0.3125 -0.25 0.53125q-0.375 0.375 -1.515625 0.6875q-1.125 0.3125 -1.890625 0.3125q-1.5 0 -2.25 -0.640625q-0.734375 -0.65625 -0.734375 -1.59375l0 -3.53125l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l0.578125 0l0 -1.4531326q0 -0.578125 0.21875 -0.8125q0.21875 -0.25 0.578125 -0.25q0.359375 0 0.578125 0.25q0.21875 0.234375 0.21875 0.8125l0 1.4531326l2.96875 0q0.578125 0 0.8125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-2.96875 0zm8.3515625 -4.6406326l0 3.4218826q0.5 -0.296875 1.0 -0.4375q0.515625 -0.15625 1.046875 -0.15625q0.828125 0 1.46875 0.28125q0.65625 0.28125 1.078125 0.890625q0.421875 0.609375 0.421875 1.53125l0 3.0q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.4375 0.375 -0.671875q0.203125 -0.125 0.796875 -0.125l0 -2.890625q0 -0.625 -0.28125 -0.875q-0.359375 -0.328125 -1.078125 -0.328125q-0.53125 0 -0.953125 0.203125q-0.40625 0.203125 -1.09375 0.890625l0 3.0q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.4375 0.375 -0.671875q0.1875 -0.125 0.796875 -0.125l0 -6.9218826l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.875 0z"/><path fill="#fff" fill-rule="evenodd" d="m203.43307 160.27034l113.98425 0l0 61.16536l-113.98425 0z"/><path fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1" d="m203.43307 160.27034l113.98425 0l0 61.16536l-113.98425 0z"/><path fill="#000" fill-rule="nonzero" d="m245.09708 193.46301l0 1.640625l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.265625l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.15625q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.421875 -1.421875 -0.421875l-1.84375 0l0 3.015625zm11.9765625 4.859375l0 -0.375q-0.609375 0.3125 -1.34375 0.46875q-0.71875 0.171875 -1.3125 0.171875q-1.28125 0 -2.09375 -0.6875q-0.796875 -0.6875 -0.796875 -1.515625q0 -1.0 1.015625 -1.859375q1.03125 -0.875 2.84375 -0.875q0.734375 0 1.6875 0.15625l0 -0.375q0 -0.359375 -0.3125 -0.578125q-0.3125 -0.234375 -1.171875 -0.234375q-0.71875 0 -1.84375 0.28125q-0.421875 0.09375 -0.65625 0.09375q-0.328125 0 -0.546875 -0.21875q-0.21875 -0.234375 -0.21875 -0.59375q0 -0.203125 0.078125 -0.34375q0.078125 -0.15625 0.21875 -0.25q0.140625 -0.09375 0.578125 -0.21875q0.59375 -0.15625 1.203125 -0.25q0.625 -0.109375 1.125 -0.109375q1.5 0 2.3125 0.65625q0.828125 0.640625 0.828125 1.75l0 3.296875l0.28125 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.875 0zm0 -2.875q-0.96875 -0.1875 -1.78125 -0.1875q-0.96875 0 -1.671875 0.484375q-0.4375 0.296875 -0.4375 0.609375q0 0.234375 0.203125 0.375q0.390625 0.25 1.078125 0.25q0.578125 0 1.296875 -0.21875q0.734375 -0.234375 1.3125 -0.625l0 -0.6875zm7.7578125 -2.625l0 3.21875q0 0.515625 0.21875 0.671875q0.328125 0.265625 1.171875 0.265625q1.21875 0 2.265625 -0.53125q0.390625 -0.203125 0.625 -0.203125q0.3125 0 0.53125 0.234375q0.234375 0.234375 0.234375 0.578125q0 0.3125 -0.25 0.53125q-0.375 0.375 -1.515625 0.6875q-1.125 0.3125 -1.890625 0.3125q-1.5 0 -2.25 -0.640625q-0.734375 -0.65625 -0.734375 -1.59375l0 -3.53125l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l0.578125 0l0 -1.453125q0 -0.578125 0.21875 -0.8125q0.21875 -0.25 0.578125 -0.25q0.359375 0 0.578125 0.25q0.21875 0.234375 0.21875 0.8125l0 1.453125l2.96875 0q0.578125 0 0.8125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-2.96875 0zm8.3515625 -4.640625l0 3.421875q0.5 -0.296875 1.0 -0.4375q0.515625 -0.15625 1.046875 -0.15625q0.828125 0 1.46875 0.28125q0.65625 0.28125 1.078125 0.890625q0.421875 0.609375 0.421875 1.53125l0 3.0q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.4375 0.375 -0.671875q0.203125 -0.125 0.796875 -0.125l0 -2.890625q0 -0.625 -0.28125 -0.875q-0.359375 -0.328125 -1.078125 -0.328125q-0.53125 0 -0.953125 0.203125q-0.40625 0.203125 -1.09375 0.890625l0 3.0q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.4375 0.375 -0.671875q0.1875 -0.125 0.796875 -0.125l0 -6.921875l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.875 0z"/><path fill="#fff" fill-rule="evenodd" d="m26.64567 221.4357l158.20471 0l0 61.165344l-158.20471 0z"/><path fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1" d="m26.64567 221.4357l158.20471 0l0 61.165344l-158.20471 0z"/><path fill="#000" fill-rule="nonzero" d="m66.416 254.62837l0 1.6406097l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.2656097l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.15625q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.421875 -1.421875 -0.421875l-1.84375 0l0 3.015625zm14.6953125 1.4375q0 0.921875 -0.515625 1.7968597q-0.515625 0.859375 -1.53125 1.375q-1.0 0.515625 -2.109375 0.515625q-1.09375 0 -2.09375 -0.5q-1.0 -0.515625 -1.53125 -1.375q-0.515625 -0.87498474 -0.515625 -1.8281097q0 -0.953125 0.53125 -1.875q0.53125 -0.9375 1.53125 -1.46875q1.0 -0.53125 2.078125 -0.53125q1.09375 0 2.109375 0.546875q1.015625 0.546875 1.53125 1.46875q0.515625 0.90625 0.515625 1.875zm-1.609375 0.015625q0 -0.78125 -0.546875 -1.421875q-0.765625 -0.875 -2.0 -0.875q-1.078125 0 -1.8125 0.703125q-0.71875 0.6875 -0.71875 1.59375q0 0.75 0.734375 1.40625q0.734375 0.65623474 1.796875 0.65623474q1.078125 0 1.8125 -0.65623474q0.734375 -0.65625 0.734375 -1.40625zm8.7734375 -1.8125q-0.390625 -0.25 -0.828125 -0.359375q-0.421875 -0.125 -0.890625 -0.125q-0.921875 0 -1.46875 0.296875q-0.25 0.140625 -0.25 0.296875q0 0.171875 0.328125 0.34375q0.25 0.125 1.125 0.25q1.59375 0.21875 2.21875 0.4375q0.8125 0.28125 1.25 0.859375q0.453125 0.5625 0.453125 1.203125q0 0.85935974 -0.75 1.4374847q-1.09375 0.84375 -2.828125 0.84375q-0.6875 0 -1.28125 -0.125q-0.59375 -0.125 -1.078125 -0.359375q-0.125 0.09375 -0.265625 0.15625q-0.125 0.046875 -0.265625 0.046875q-0.375 0 -0.59375 -0.234375q-0.21875 -0.25 -0.21875 -0.828125l0 -0.546875q0 -0.57810974 0.21875 -0.81248474q0.21875 -0.25 0.578125 -0.25q0.296875 0 0.484375 0.15625q0.203125 0.15625 0.3125 0.546875q0.359375 0.31248474 0.875 0.48435974q0.515625 0.15625 1.1875 0.15625q1.109375 0 1.71875 -0.34375q0.28125 -0.171875 0.28125 -0.35935974q0 -0.3125 -0.40625 -0.515625q-0.421875 -0.203125 -1.71875 -0.34375q-1.921875 -0.203125 -2.578125 -0.78125q-0.640625 -0.578125 -0.640625 -1.40625q0 -0.859375 0.71875 -1.4375q0.984375 -0.78125 2.578125 -0.78125q0.5625 0 1.0625 0.109375q0.515625 0.109375 0.984375 0.328125q0.15625 -0.109375 0.28125 -0.15625q0.125 -0.0625 0.234375 -0.0625q0.328125 0 0.546875 0.25q0.21875 0.234375 0.21875 0.8125l0 0.390625q0 0.53125 -0.125 0.71875q-0.25 0.359375 -0.671875 0.359375q-0.296875 0 -0.515625 -0.171875q-0.21875 -0.1875 -0.28125 -0.484375zm8.4453125 -4.921875l0 1.703125l-1.90625 0l0 -1.703125l1.90625 0zm0.21875 3.046875l0 5.4843597l1.921875 0q0.578125 0 0.828125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-5.4375 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.921875 0l0 -3.8906097l-1.296875 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.234375 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.890625 0zm10.0078125 3.40625l2.4375 2.0781097q0.4375 0.03125 0.65625 0.25q0.21875 0.21875 0.21875 0.5625q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-1.8125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.28125 0.171875 -0.5q0.1875 -0.21875 0.484375 -0.296875l-1.1875 -1.0312347l-1.21875 1.0312347q0.359375 0.09375 0.515625 0.296875q0.171875 0.1875 0.171875 0.5q0 0.359375 -0.25 0.59375q-0.234375 0.21875 -0.8125 0.21875l-1.8125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.328125 0.21875 -0.546875q0.21875 -0.21875 0.65625 -0.25l2.375 -2.0937347l-2.109375 -1.796875q-0.40625 -0.03125 -0.625 -0.25q-0.21875 -0.21875 -0.21875 -0.546875q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.5 0q0.578125 0 0.8125 0.21875q0.25 0.21875 0.25 0.5625q0 0.46875 -0.4375 0.75l0.96875 0.8125l0.953125 -0.828125q-0.421875 -0.296875 -0.421875 -0.703125q0 -0.375 0.234375 -0.59375q0.25 -0.21875 0.828125 -0.21875l1.484375 0q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.328125 -0.21875 0.546875q-0.21875 0.21875 -0.640625 0.25l-2.109375 1.8125zm7.4765625 0.4375l0 1.6406097l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.2656097l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.15625q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.421875 -1.421875 -0.421875l-1.84375 0l0 3.015625zm11.9765625 4.8593597l0 -0.375q-0.609375 0.3125 -1.34375 0.46875q-0.71875 0.171875 -1.3125 0.171875q-1.28125 0 -2.09375 -0.6875q-0.796875 -0.6875 -0.796875 -1.5156097q0 -1.0 1.015625 -1.859375q1.03125 -0.875 2.84375 -0.875q0.734375 0 1.6875 0.15625l0 -0.375q0 -0.359375 -0.3125 -0.578125q-0.3125 -0.234375 -1.171875 -0.234375q-0.71875 0 -1.84375 0.28125q-0.421875 0.09375 -0.65625 0.09375q-0.328125 0 -0.546875 -0.21875q-0.21875 -0.234375 -0.21875 -0.59375q0 -0.203125 0.078125 -0.34375q0.078125 -0.15625 0.21875 -0.25q0.140625 -0.09375 0.578125 -0.21875q0.59375 -0.15625 1.203125 -0.25q0.625 -0.109375 1.125 -0.109375q1.5 0 2.3125 0.65625q0.828125 0.640625 0.828125 1.75l0 3.2968597l0.28125 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.875 0zm0 -2.8749847q-0.96875 -0.1875 -1.78125 -0.1875q-0.96875 0 -1.671875 0.484375q-0.4375 0.296875 -0.4375 0.609375q0 0.23435974 0.203125 0.37498474q0.390625 0.25 1.078125 0.25q0.578125 0 1.296875 -0.21875q0.734375 -0.234375 1.3125 -0.62498474l0 -0.6875zm7.7578125 -2.625l0 3.21875q0 0.51560974 0.21875 0.67185974q0.328125 0.265625 1.171875 0.265625q1.21875 0 2.265625 -0.53125q0.390625 -0.20310974 0.625 -0.20310974q0.3125 0 0.53125 0.23435974q0.234375 0.234375 0.234375 0.578125q0 0.3125 -0.25 0.53125q-0.375 0.375 -1.515625 0.6875q-1.125 0.3125 -1.890625 0.3125q-1.5 0 -2.25 -0.640625q-0.734375 -0.65625 -0.734375 -1.5937347l0 -3.53125l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l0.578125 0l0 -1.453125q0 -0.578125 0.21875 -0.8125q0.21875 -0.25 0.578125 -0.25q0.359375 0 0.578125 0.25q0.21875 0.234375 0.21875 0.8125l0 1.453125l2.96875 0q0.578125 0 0.8125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-2.96875 0zm8.3515625 -4.640625l0 3.421875q0.5 -0.296875 1.0 -0.4375q0.515625 -0.15625 1.046875 -0.15625q0.828125 0 1.46875 0.28125q0.65625 0.28125 1.078125 0.890625q0.421875 0.609375 0.421875 1.53125l0 2.9999847q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.4375 0.375 -0.671875q0.203125 -0.125 0.796875 -0.125l0 -2.8906097q0 -0.625 -0.28125 -0.875q-0.359375 -0.328125 -1.078125 -0.328125q-0.53125 0 -0.953125 0.203125q-0.40625 0.203125 -1.09375 0.890625l0 2.9999847q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.4375 0.375 -0.671875q0.1875 -0.125 0.796875 -0.125l0 -6.9218597l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.875 0z"/><path fill="#fff" fill-rule="evenodd" d="m336.0 221.4357l174.04724 0l0 61.165344l-174.04724 0z"/><path fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1" d="m336.0 221.4357l174.04724 0l0 61.165344l-174.04724 0z"/><path fill="#000" fill-rule="nonzero" d="m375.02753 253.3315l-1.484375 4.5468597l-1.796875 0l-0.953125 -7.8749847q-0.375 -0.046875 -0.5625 -0.25q-0.1875 -0.203125 -0.1875 -0.53125q0 -0.375 0.25 -0.59375q0.25 -0.234375 0.828125 -0.234375l2.125 0.015625q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-0.828125 0l0.53125 4.484375l1.25 -3.734375l1.671875 0l1.25 3.734375l0.53125 -4.484375l-0.84375 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.21875 -0.234375 -0.578125q0 -0.359375 0.234375 -0.578125q0.25 -0.234375 0.828125 -0.234375l2.125 0.015625q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.296875 -0.203125 0.515625q-0.1875 0.21875 -0.5625 0.28125l-0.921875 7.8749847l-1.765625 0l-1.53125 -4.5468597zm10.1640625 -5.59375l0 1.703125l-1.90625 0l0 -1.703125l1.90625 0zm0.21875 3.046875l0 5.4843597l1.921875 0q0.578125 0 0.828125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-5.4375 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.921875 0l0 -3.8906097l-1.296875 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.234375 -0.578125q0.25 -0.21875 0.828125 -0.21875l2.890625 0zm7.1953125 0l0 0.53125q0.4375 -0.375 0.953125 -0.5625q0.53125 -0.1875 1.15625 -0.1875q1.421875 0 2.25 0.890625q0.65625 0.703125 0.65625 1.84375l0 2.9687347q0.5 0 0.734375 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.453125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.34375 0.234375 -0.5625q0.25 -0.234375 0.75 -0.234375l0 -3.0156097q0 -0.53125 -0.28125 -0.765625q-0.359375 -0.3125 -1.09375 -0.3125q-0.5625 0 -0.984375 0.21875q-0.40625 0.203125 -1.046875 0.90625l0 2.9687347q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.4375 0.375 -0.671875q0.1875 -0.125 0.796875 -0.125l0 -3.8906097q-0.5 0 -0.75 -0.21875q-0.234375 -0.234375 -0.234375 -0.578125q0 -0.359375 0.234375 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.53125 0zm14.8984375 -3.046875l0 8.531235l0.265625 0q0.578125 0 0.828125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.25 0.21875 -0.828125 0.21875l-1.875 0l0 -0.390625q-0.546875 0.3125 -1.140625 0.484375q-0.59375 0.171875 -1.234375 0.171875q-1.8125 0 -2.921875 -1.046875q-1.09375 -1.046875 -1.09375 -2.6093597q0 -1.625 1.15625 -2.765625q1.15625 -1.15625 2.828125 -1.15625q0.625 0 1.21875 0.203125q0.609375 0.1875 1.1875 0.5625l0 -1.984375l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l1.875 0zm-1.609375 6.796875q0 -0.984375 -0.703125 -1.671875q-0.6875 -0.6875 -1.6875 -0.6875q-1.0 0 -1.703125 0.6875q-0.6875 0.6875 -0.6875 1.65625q0 0.875 0.625 1.453125q0.625 0.56248474 1.765625 0.56248474q1.125 0 1.75 -0.56248474q0.640625 -0.578125 0.640625 -1.4375zm11.6953125 -0.078125q0 0.921875 -0.515625 1.7968597q-0.515625 0.859375 -1.53125 1.375q-1.0 0.515625 -2.109375 0.515625q-1.09375 0 -2.09375 -0.5q-1.0 -0.515625 -1.53125 -1.375q-0.515625 -0.87498474 -0.515625 -1.8281097q0 -0.953125 0.53125 -1.875q0.53125 -0.9375 1.53125 -1.46875q1.0 -0.53125 2.078125 -0.53125q1.09375 0 2.109375 0.546875q1.015625 0.546875 1.53125 1.46875q0.515625 0.90625 0.515625 1.875zm-1.609375 0.015625q0 -0.78125 -0.546875 -1.421875q-0.765625 -0.875 -2.0 -0.875q-1.078125 0 -1.8125 0.703125q-0.71875 0.6875 -0.71875 1.59375q0 0.75 0.734375 1.40625q0.734375 0.65623474 1.796875 0.65623474q1.078125 0 1.8125 -0.65623474q0.734375 -0.65625 0.734375 -1.40625zm7.0546875 0.453125l-1.109375 2.9531097l-1.5 0l-1.34375 -5.4999847q-0.4375 -0.015625 -0.671875 -0.234375q-0.21875 -0.234375 -0.21875 -0.5625q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.484375 0q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.28125 0.609375q-0.21875 0.1875 -0.828125 0.1875l0.609375 2.546875l0.984375 -2.609375l1.421875 0l1.0 2.609375l0.625 -2.546875q-0.59375 0 -0.78125 -0.109375q-0.375 -0.25 -0.375 -0.6875q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l1.5 0q0.578125 0 0.828125 0.21875q0.25 0.21875 0.25 0.578125q0 0.328125 -0.21875 0.546875q-0.21875 0.21875 -0.640625 0.25l-1.3125 5.4999847l-1.484375 0l-1.171875 -2.9531097zm11.3203125 -2.265625q-0.390625 -0.25 -0.828125 -0.359375q-0.421875 -0.125 -0.890625 -0.125q-0.921875 0 -1.46875 0.296875q-0.25 0.140625 -0.25 0.296875q0 0.171875 0.328125 0.34375q0.25 0.125 1.125 0.25q1.59375 0.21875 2.21875 0.4375q0.8125 0.28125 1.25 0.859375q0.453125 0.5625 0.453125 1.203125q0 0.85935974 -0.75 1.4374847q-1.09375 0.84375 -2.828125 0.84375q-0.6875 0 -1.28125 -0.125q-0.59375 -0.125 -1.078125 -0.359375q-0.125 0.09375 -0.265625 0.15625q-0.125 0.046875 -0.265625 0.046875q-0.375 0 -0.59375 -0.234375q-0.21875 -0.25 -0.21875 -0.828125l0 -0.546875q0 -0.57810974 0.21875 -0.81248474q0.21875 -0.25 0.578125 -0.25q0.296875 0 0.484375 0.15625q0.203125 0.15625 0.3125 0.546875q0.359375 0.31248474 0.875 0.48435974q0.515625 0.15625 1.1875 0.15625q1.109375 0 1.71875 -0.34375q0.28125 -0.171875 0.28125 -0.35935974q0 -0.3125 -0.40625 -0.515625q-0.421875 -0.203125 -1.71875 -0.34375q-1.921875 -0.203125 -2.578125 -0.78125q-0.640625 -0.578125 -0.640625 -1.40625q0 -0.859375 0.71875 -1.4375q0.984375 -0.78125 2.578125 -0.78125q0.5625 0 1.0625 0.109375q0.515625 0.109375 0.984375 0.328125q0.15625 -0.109375 0.28125 -0.15625q0.125 -0.0625 0.234375 -0.0625q0.328125 0 0.546875 0.25q0.21875 0.234375 0.21875 0.8125l0 0.390625q0 0.53125 -0.125 0.71875q-0.25 0.359375 -0.671875 0.359375q-0.296875 0 -0.515625 -0.171875q-0.21875 -0.1875 -0.28125 -0.484375zm6.9453125 1.96875l0 1.6406097l1.625 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-3.46875 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l0.25 0l0 -6.2656097l-0.25 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.234375 0.828125 -0.234375l3.6875 0.015625q1.625 0 2.5625 0.890625q0.953125 0.875 0.953125 2.15625q0 0.703125 -0.3125 1.328125q-0.25 0.46875 -0.8125 0.921875q-0.5625 0.453125 -1.15625 0.6875q-0.59375 0.234375 -1.5625 0.234375l-1.515625 0zm0 -1.609375l1.484375 0q1.046875 0 1.65625 -0.46875q0.625 -0.46875 0.625 -1.140625q0 -0.5625 -0.5 -0.984375q-0.5 -0.421875 -1.421875 -0.421875l-1.84375 0l0 3.015625zm11.9765625 4.8593597l0 -0.375q-0.609375 0.3125 -1.34375 0.46875q-0.71875 0.171875 -1.3125 0.171875q-1.28125 0 -2.09375 -0.6875q-0.796875 -0.6875 -0.796875 -1.5156097q0 -1.0 1.015625 -1.859375q1.03125 -0.875 2.84375 -0.875q0.734375 0 1.6875 0.15625l0 -0.375q0 -0.359375 -0.3125 -0.578125q-0.3125 -0.234375 -1.171875 -0.234375q-0.71875 0 -1.84375 0.28125q-0.421875 0.09375 -0.65625 0.09375q-0.328125 0 -0.546875 -0.21875q-0.21875 -0.234375 -0.21875 -0.59375q0 -0.203125 0.078125 -0.34375q0.078125 -0.15625 0.21875 -0.25q0.140625 -0.09375 0.578125 -0.21875q0.59375 -0.15625 1.203125 -0.25q0.625 -0.109375 1.125 -0.109375q1.5 0 2.3125 0.65625q0.828125 0.640625 0.828125 1.75l0 3.2968597l0.28125 0q0.578125 0 0.8125 0.234375q0.25 0.21875 0.25 0.578125q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.875 0zm0 -2.8749847q-0.96875 -0.1875 -1.78125 -0.1875q-0.96875 0 -1.671875 0.484375q-0.4375 0.296875 -0.4375 0.609375q0 0.23435974 0.203125 0.37498474q0.390625 0.25 1.078125 0.25q0.578125 0 1.296875 -0.21875q0.734375 -0.234375 1.3125 -0.62498474l0 -0.6875zm7.7578125 -2.625l0 3.21875q0 0.51560974 0.21875 0.67185974q0.328125 0.265625 1.171875 0.265625q1.21875 0 2.265625 -0.53125q0.390625 -0.20310974 0.625 -0.20310974q0.3125 0 0.53125 0.23435974q0.234375 0.234375 0.234375 0.578125q0 0.3125 -0.25 0.53125q-0.375 0.375 -1.515625 0.6875q-1.125 0.3125 -1.890625 0.3125q-1.5 0 -2.25 -0.640625q-0.734375 -0.65625 -0.734375 -1.5937347l0 -3.53125l-0.578125 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.21875 -0.25 -0.578125q0 -0.359375 0.25 -0.578125q0.25 -0.21875 0.828125 -0.21875l0.578125 0l0 -1.453125q0 -0.578125 0.21875 -0.8125q0.21875 -0.25 0.578125 -0.25q0.359375 0 0.578125 0.25q0.21875 0.234375 0.21875 0.8125l0 1.453125l2.96875 0q0.578125 0 0.8125 0.21875q0.25 0.21875 0.25 0.578125q0 0.359375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-2.96875 0zm8.3515625 -4.640625l0 3.421875q0.5 -0.296875 1.0 -0.4375q0.515625 -0.15625 1.046875 -0.15625q0.828125 0 1.46875 0.28125q0.65625 0.28125 1.078125 0.890625q0.421875 0.609375 0.421875 1.53125l0 2.9999847q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.5625 0 -0.8125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.4375 0.375 -0.671875q0.203125 -0.125 0.796875 -0.125l0 -2.8906097q0 -0.625 -0.28125 -0.875q-0.359375 -0.328125 -1.078125 -0.328125q-0.53125 0 -0.953125 0.203125q-0.40625 0.203125 -1.09375 0.890625l0 2.9999847q0.609375 0 0.796875 0.125q0.375 0.234375 0.375 0.6875q0 0.34375 -0.25 0.578125q-0.234375 0.21875 -0.8125 0.21875l-1.828125 0q-0.578125 0 -0.828125 -0.21875q-0.234375 -0.234375 -0.234375 -0.59375q0 -0.4375 0.375 -0.671875q0.1875 -0.125 0.796875 -0.125l0 -6.9218597l-0.265625 0q-0.578125 0 -0.828125 -0.21875q-0.25 -0.234375 -0.25 -0.59375q0 -0.34375 0.25 -0.5625q0.25 -0.234375 0.828125 -0.234375l1.875 0z"/><path fill="#000" fill-opacity="0" fill-rule="evenodd" d="m105.74803 99.10499l97.70079 -30.58268"/><path fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1" d="m105.74803 99.10499l91.97476 -28.79029"/><path fill="#000" fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-width="1" d="m198.21622 71.891l3.8374481 -2.9319763l-4.824295 -0.22064209z"/><path fill="#000" fill-opacity="0" fill-rule="evenodd" d="m423.02362 99.10499l-105.60629 -30.58268"/><path fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1" d="m423.02362 99.10499l-99.84308 -28.913704"/><path fill="#000" fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-width="1" d="m323.63998 68.60474l-4.818451 0.32421875l3.8995361 2.848877z"/><path fill="#000" fill-opacity="0" fill-rule="evenodd" d="m105.74803 221.4357l0 -61.16536"/><path fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1" d="m105.74803 221.4357l0 -55.16536"/><path fill="#000" fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-width="1" d="m107.399765 166.27034l-1.6517334 -4.538101l-1.6517334 4.538101z"/><path fill="#000" fill-opacity="0" fill-rule="evenodd" d="m423.02362 221.4357l0 -61.16536"/><path fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1" d="m423.02362 221.4357l0 -55.16536"/><path fill="#000" fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-width="1" d="m424.67535 166.27034l-1.6517334 -4.538101l-1.6517334 4.538101z"/><path fill="#000" fill-opacity="0" fill-rule="evenodd" d="m260.4252 160.27034l0 -61.16535"/><path fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1" d="m260.4252 160.27034l0 -55.16535"/><path fill="#000" fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-width="1" d="m262.07693 105.10499l-1.6517334 -4.538101l-1.6517334 4.538101z"/><path fill="#000" fill-opacity="0" fill-rule="evenodd" d="m105.74803 221.4357l97.70079 -30.582687"/><path fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1" d="m105.74803 221.4357l91.97476 -28.790298"/><path fill="#000" fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-width="1" d="m198.21622 194.22171l3.8374481 -2.9319763l-4.824295 -0.22064209z"/><path fill="#000" fill-opacity="0" fill-rule="evenodd" d="m423.02362 221.4357l-105.60629 -30.582687"/><path fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-linejoin="round" stroke-width="1" d="m423.02362 221.4357l-99.84308 -28.913696"/><path fill="#000" fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-width="1" d="m323.63998 190.93544l-4.818451 0.32421875l3.8995361 2.848877z"/></g></svg>
\ No newline at end of file
index 0ffb8ff0b969c982fcd900813e2092d0876c8bc6..9e6950652ebc2c0be8424340f6d249a672301064 100644 (file)
@@ -17,7 +17,7 @@ SQLite for internal data storage.  It's also possible to prototype an
 application using SQLite and then port the code to a larger database such as
 PostgreSQL or Oracle.
 
-The sqlite3 module was written by Gerhard Häring.  It provides a SQL interface
+The sqlite3 module was written by Gerhard Häring.  It provides an SQL interface
 compliant with the DB-API 2.0 specification described by :pep:`249`.
 
 To use the module, start by creating a :class:`Connection` object that
@@ -254,14 +254,28 @@ Module functions and constants
    for the connection, you can set the *cached_statements* parameter. The currently
    implemented default is to cache 100 statements.
 
-   If *uri* is true, *database* is interpreted as a URI. This allows you
-   to specify options. For example, to open a database in read-only mode
-   you can use::
+   If *uri* is :const:`True`, *database* is interpreted as a
+   :abbr:`URI (Uniform Resource Identifier)` with a file path and an optional
+   query string.  The scheme part *must* be ``"file:"``.  The path can be a
+   relative or absolute file path.  The query string allows us to pass
+   parameters to SQLite. Some useful URI tricks include::
 
-       db = sqlite3.connect('file:path/to/database?mode=ro', uri=True)
+       # Open a database in read-only mode.
+       con = sqlite3.connect("file:template.db?mode=ro", uri=True)
 
-   More information about this feature, including a list of recognized options, can
-   be found in the `SQLite URI documentation <https://www.sqlite.org/uri.html>`_.
+       # Don't implicitly create a new database file if it does not already exist.
+       # Will raise sqlite3.OperationalError if unable to open a database file.
+       con = sqlite3.connect("file:nosuchdb.db?mode=rw", uri=True)
+
+       # Create a shared named in-memory database.
+       con1 = sqlite3.connect("file:mem1?mode=memory&cache=shared", uri=True)
+       con2 = sqlite3.connect("file:mem1?mode=memory&cache=shared", uri=True)
+       con1.executescript("create table t(t); insert into t values(28);")
+       rows = con2.execute("select * from t").fetchall()
+
+   More information about this feature, including a list of recognized
+   parameters, can be found in the
+   `SQLite URI documentation <https://www.sqlite.org/uri.html>`_.
 
    .. audit-event:: sqlite3.connect database sqlite3.connect
 
@@ -318,7 +332,7 @@ Connection Objects
 
 .. class:: Connection
 
-   A SQLite database connection has the following attributes and methods:
+   An SQLite database connection has the following attributes and methods:
 
    .. attribute:: isolation_level
 
@@ -520,7 +534,7 @@ Connection Objects
 
    .. method:: load_extension(path)
 
-      This routine loads a SQLite extension from a shared library.  You have to
+      This routine loads an SQLite extension from a shared library.  You have to
       enable extension loading with :meth:`enable_load_extension` before you can
       use this routine.
 
@@ -591,7 +605,7 @@ Connection Objects
 
    .. method:: backup(target, *, pages=-1, progress=None, name="main", sleep=0.250)
 
-      This method makes a backup of a SQLite database even while it's being accessed
+      This method makes a backup of an SQLite database even while it's being accessed
       by other clients, or concurrently by the same connection.  The copy will be
       written into the mandatory argument *target*, that must be another
       :class:`Connection` instance.
@@ -730,11 +744,11 @@ Cursor Objects
 
    .. method:: setinputsizes(sizes)
 
-      Required by the DB-API. Is a no-op in :mod:`sqlite3`.
+      Required by the DB-API. Does nothing in :mod:`sqlite3`.
 
    .. method:: setoutputsize(size [, column])
 
-      Required by the DB-API. Is a no-op in :mod:`sqlite3`.
+      Required by the DB-API. Does nothing in :mod:`sqlite3`.
 
    .. attribute:: rowcount
 
@@ -951,7 +965,7 @@ This is how SQLite types are converted to Python types by default:
 +-------------+----------------------------------------------+
 
 The type system of the :mod:`sqlite3` module is extensible in two ways: you can
-store additional Python types in a SQLite database via object adaptation, and
+store additional Python types in an SQLite database via object adaptation, and
 you can let the :mod:`sqlite3` module convert SQLite types to different Python
 types via converters.
 
index 0b231f170aa0515a437bb300a52373b5687242a5..c3acf61d2b527a9a69f329a3b879374a8a9bcd56 100644 (file)
@@ -1719,10 +1719,10 @@ to speed up repeated connections from the same clients.
    Due to the early negotiation phase of the TLS connection, only limited
    methods and attributes are usable like
    :meth:`SSLSocket.selected_alpn_protocol` and :attr:`SSLSocket.context`.
-   :meth:`SSLSocket.getpeercert`, :meth:`SSLSocket.getpeercert`,
-   :meth:`SSLSocket.cipher` and :meth:`SSLSocket.compress` methods require that
+   The :meth:`SSLSocket.getpeercert`,
+   :meth:`SSLSocket.cipher` and :meth:`SSLSocket.compression` methods require that
    the TLS connection has progressed beyond the TLS Client Hello and therefore
-   will not contain return meaningful values nor can they be called safely.
+   will not return meaningful values nor can they be called safely.
 
    The *sni_callback* function must return ``None`` to allow the
    TLS negotiation to continue.  If a TLS failure is required, a constant
index bfa0e744f2c4fd7e7bd9aa01ae8f94611587a554..b10909d81af0a98118d5c205aa1d703dad758dc2 100644 (file)
@@ -4740,33 +4740,54 @@ Generic Alias Type
    object: GenericAlias
    pair: Generic; Alias
 
-``GenericAlias`` objects are created by subscripting a class (usually a
-container), such as ``list[int]``.  They are intended primarily for
+``GenericAlias`` objects are generally created by
+:ref:`subscripting <subscriptions>` a class. They are most often used with
+:ref:`container classes <sequence-types>`, such as :class:`list` or
+:class:`dict`. For example, ``list[int]`` is a ``GenericAlias`` object created
+by subscripting the ``list`` class with the argument :class:`int`.
+``GenericAlias`` objects are intended primarily for use with
 :term:`type annotations <annotation>`.
 
-Usually, the :ref:`subscription <subscriptions>` of container objects calls the
-method :meth:`__getitem__` of the object.  However, the subscription of some
-containers' classes may call the classmethod :meth:`__class_getitem__` of the
-class instead. The classmethod :meth:`__class_getitem__` should return a
-``GenericAlias`` object.
-
 .. note::
-   If the :meth:`__getitem__` of the class' metaclass is present, it will take
-   precedence over the :meth:`__class_getitem__` defined in the class (see
-   :pep:`560` for more details).
 
-The ``GenericAlias`` object acts as a proxy for :term:`generic types
-<generic type>`, implementing *parameterized generics* - a specific instance
-of a generic which provides the types for container elements.
+   It is generally only possible to subscript a class if the class implements
+   the special method :meth:`~object.__class_getitem__`.
+
+A ``GenericAlias`` object acts as a proxy for a :term:`generic type`,
+implementing *parameterized generics*.
+
+For a container class, the
+argument(s) supplied to a :ref:`subscription <subscriptions>` of the class may
+indicate the type(s) of the elements an object contains. For example,
+``set[bytes]`` can be used in type annotations to signify a :class:`set` in
+which all the elements are of type :class:`bytes`.
+
+For a class which defines :meth:`~object.__class_getitem__` but is not a
+container, the argument(s) supplied to a subscription of the class will often
+indicate the return type(s) of one or more methods defined on an object. For
+example, :mod:`regular expressions <re>` can be used on both the :class:`str` data
+type and the :class:`bytes` data type:
+
+* If ``x = re.search('foo', 'foo')``, ``x`` will be a
+  :ref:`re.Match <match-objects>` object where the return values of
+  ``x.group(0)`` and ``x[0]`` will both be of type :class:`str`. We can
+  represent this kind of object in type annotations with the ``GenericAlias``
+  ``re.Match[str]``.
+
+* If ``y = re.search(b'bar', b'bar')``, (note the ``b`` for :class:`bytes`),
+  ``y`` will also be an instance of ``re.Match``, but the return
+  values of ``y.group(0)`` and ``y[0]`` will both be of type
+  :class:`bytes`. In type annotations, we would represent this
+  variety of :ref:`re.Match <match-objects>` objects with ``re.Match[bytes]``.
 
-The user-exposed type for the ``GenericAlias`` object can be accessed from
-:class:`types.GenericAlias` and used for :func:`isinstance` checks.  It can
-also be used to create ``GenericAlias`` objects directly.
+``GenericAlias`` objects are instances of the class
+:class:`types.GenericAlias`, which can also be used to create ``GenericAlias``
+objects directly.
 
 .. describe:: T[X, Y, ...]
 
-   Creates a ``GenericAlias`` representing a type ``T`` containing elements
-   of types *X*, *Y*, and more depending on the ``T`` used.
+   Creates a ``GenericAlias`` representing a type ``T`` parameterized by types
+   *X*, *Y*, and more depending on the ``T`` used.
    For example, a function expecting a :class:`list` containing
    :class:`float` elements::
 
@@ -4791,7 +4812,7 @@ The builtin functions :func:`isinstance` and :func:`issubclass` do not accept
 
 The Python runtime does not enforce :term:`type annotations <annotation>`.
 This extends to generic types and their type parameters. When creating
-an object from a ``GenericAlias``, container elements are not checked
+a container object from a ``GenericAlias``, the elements in the container are not checked
 against their type. For example, the following code is discouraged, but will
 run without errors::
 
@@ -4818,8 +4839,8 @@ Calling :func:`repr` or :func:`str` on a generic shows the parameterized type::
    >>> str(list[int])
    'list[int]'
 
-The :meth:`__getitem__` method of generics will raise an exception to disallow
-mistakes like ``dict[str][str]``::
+The :meth:`~object.__getitem__` method of generic containers will raise an
+exception to disallow mistakes like ``dict[str][str]``::
 
    >>> dict[str][str]
    Traceback (most recent call last):
@@ -4828,7 +4849,7 @@ mistakes like ``dict[str][str]``::
 
 However, such expressions are valid when :ref:`type variables <generics>` are
 used.  The index must have as many elements as there are type variable items
-in the ``GenericAlias`` object's :attr:`__args__ <genericalias.__args__>`. ::
+in the ``GenericAlias`` object's :attr:`~genericalias.__args__`. ::
 
    >>> from typing import TypeVar
    >>> Y = TypeVar('Y')
@@ -4836,10 +4857,11 @@ in the ``GenericAlias`` object's :attr:`__args__ <genericalias.__args__>`. ::
    dict[str, int]
 
 
-Standard Generic Collections
-----------------------------
+Standard Generic Classes
+------------------------
 
-These standard library collections support parameterized generics.
+The following standard library classes support parameterized generics. This
+list is non-exhaustive.
 
 * :class:`tuple`
 * :class:`list`
@@ -4877,12 +4899,29 @@ These standard library collections support parameterized generics.
 * :class:`collections.abc.ValuesView`
 * :class:`contextlib.AbstractContextManager`
 * :class:`contextlib.AbstractAsyncContextManager`
+* :class:`dataclasses.Field`
+* :class:`functools.cached_property`
+* :class:`functools.partialmethod`
+* :class:`os.PathLike`
+* :class:`queue.LifoQueue`
+* :class:`queue.Queue`
+* :class:`queue.PriorityQueue`
+* :class:`queue.SimpleQueue`
 * :ref:`re.Pattern <re-objects>`
 * :ref:`re.Match <match-objects>`
+* :class:`shelve.BsdDbShelf`
+* :class:`shelve.DbfilenameShelf`
+* :class:`shelve.Shelf`
+* :class:`types.MappingProxyType`
+* :class:`weakref.WeakKeyDictionary`
+* :class:`weakref.WeakMethod`
+* :class:`weakref.WeakSet`
+* :class:`weakref.WeakValueDictionary`
 
 
-Special Attributes of Generic Alias
------------------------------------
+
+Special Attributes of ``GenericAlias`` objects
+----------------------------------------------
 
 All parameterized generics implement special read-only attributes.
 
@@ -4897,8 +4936,8 @@ All parameterized generics implement special read-only attributes.
 .. attribute:: genericalias.__args__
 
    This attribute is a :class:`tuple` (possibly of length 1) of generic
-   types passed to the original :meth:`__class_getitem__`
-   of the generic container::
+   types passed to the original :meth:`~object.__class_getitem__` of the
+   generic class::
 
       >>> dict[str, list[int]].__args__
       (<class 'str'>, list[int])
@@ -4918,9 +4957,17 @@ All parameterized generics implement special read-only attributes.
 
 .. seealso::
 
-   * :pep:`585` -- "Type Hinting Generics In Standard Collections"
-   * :meth:`__class_getitem__` -- Used to implement parameterized generics.
-   * :ref:`generics` -- Generics in the :mod:`typing` module.
+   :pep:`484` - Type Hints
+      Introducing Python's framework for type annotations.
+
+   :pep:`585` - Type Hinting Generics In Standard Collections
+      Introducing the ability to natively parameterize standard-library
+      classes, provided they implement the special class method
+      :meth:`~object.__class_getitem__`.
+
+   :ref:`Generics`, :ref:`user-defined generics <user-defined-generics>` and :class:`typing.Generic`
+      Documentation on how to implement generic classes that can be
+      parameterized at runtime and understood by static type-checkers.
 
 .. versionadded:: 3.9
 
index d1bdf4347de19231c56f0300f2274c23a48a8a8b..3ecae27b3857778e3c91150768beddf439c9f64b 100644 (file)
@@ -424,12 +424,13 @@ When no explicit alignment is given, preceding the *width* field by a zero
 sign-aware zero-padding for numeric types.  This is equivalent to a *fill*
 character of ``'0'`` with an *alignment* type of ``'='``.
 
-The *precision* is a decimal number indicating how many digits should be
-displayed after the decimal point for a floating point value formatted with
-``'f'`` and ``'F'``, or before and after the decimal point for a floating point
-value formatted with ``'g'`` or ``'G'``.  For non-number types the field
+The *precision* is a decimal integer indicating how many digits should be
+displayed after the decimal point for presentation types
+``'f'`` and ``'F'``, or before and after the decimal point for presentation
+types ``'g'`` or ``'G'``.  For string presentation types the field
 indicates the maximum field size - in other words, how many characters will be
-used from the field content. The *precision* is not allowed for integer values.
+used from the field content.  The *precision* is not allowed for integer
+presentation types.
 
 Finally, the *type* determines how the data should be presented.
 
index 55dcc172bbc2830fccb5d2527ddca738f7de1a1e..f9e9f63f2151e6a3065e5c9fb4684c0bcaf9ec9a 100644 (file)
@@ -264,13 +264,14 @@ default values. The arguments that are most commonly needed are:
    *stdin*, *stdout* and *stderr* specify the executed program's standard input,
    standard output and standard error file handles, respectively.  Valid values
    are :data:`PIPE`, :data:`DEVNULL`, an existing file descriptor (a positive
-   integer), an existing file object, and ``None``.  :data:`PIPE` indicates
-   that a new pipe to the child should be created.  :data:`DEVNULL` indicates
-   that the special file :data:`os.devnull` will be used.  With the default
-   settings of ``None``, no redirection will occur; the child's file handles
-   will be inherited from the parent.  Additionally, *stderr* can be
-   :data:`STDOUT`, which indicates that the stderr data from the child
-   process should be captured into the same file handle as for *stdout*.
+   integer), an existing file object with a valid file descriptor, and ``None``.
+   :data:`PIPE` indicates that a new pipe to the child should be created.
+   :data:`DEVNULL` indicates that the special file :data:`os.devnull` will
+   be used.  With the default settings of ``None``, no redirection will occur;
+   the child's file handles will be inherited from the parent.
+   Additionally, *stderr* can be :data:`STDOUT`, which indicates that the
+   stderr data from the child process should be captured into the same file
+   handle as for *stdout*.
 
    .. index::
       single: universal newlines; subprocess module
@@ -463,13 +464,14 @@ functions.
    *stdin*, *stdout* and *stderr* specify the executed program's standard input,
    standard output and standard error file handles, respectively.  Valid values
    are :data:`PIPE`, :data:`DEVNULL`, an existing file descriptor (a positive
-   integer), an existing :term:`file object`, and ``None``.  :data:`PIPE`
-   indicates that a new pipe to the child should be created.  :data:`DEVNULL`
-   indicates that the special file :data:`os.devnull` will be used. With the
-   default settings of ``None``, no redirection will occur; the child's file
-   handles will be inherited from the parent.  Additionally, *stderr* can be
-   :data:`STDOUT`, which indicates that the stderr data from the applications
-   should be captured into the same file handle as for stdout.
+   integer), an existing :term:`file object` with a valid file descriptor,
+   and ``None``.  :data:`PIPE` indicates that a new pipe to the child should
+   be created.  :data:`DEVNULL` indicates that the special file
+   :data:`os.devnull` will be used. With the default settings of ``None``,
+   no redirection will occur; the child's file handles will be inherited from
+   the parent.  Additionally, *stderr* can be :data:`STDOUT`, which indicates
+   that the stderr data from the applications should be captured into the same
+   file handle as for stdout.
 
    If *preexec_fn* is set to a callable object, this object will be called in the
    child process just before the child is executed.
index 9e182826b734319ed42e4041dee5a4c4b42ab002..03986db16a78c7d1fbf9b05c71bdf0ce3b6f0040 100644 (file)
@@ -412,10 +412,7 @@ always available.
 
 .. function:: exit([arg])
 
-   Exit from Python.  This is implemented by raising the :exc:`SystemExit`
-   exception, so cleanup actions specified by finally clauses of :keyword:`try`
-   statements are honored, and it is possible to intercept the exit attempt at
-   an outer level.
+   Raise a :exc:`SystemExit` exception, signaling an intention to exit the interpreter.
 
    The optional argument *arg* can be an integer giving the exit status
    (defaulting to zero), or another type of object.  If it is an integer, zero
@@ -432,7 +429,8 @@ always available.
 
    Since :func:`exit` ultimately "only" raises an exception, it will only exit
    the process when called from the main thread, and the exception is not
-   intercepted.
+   intercepted. Cleanup actions specified by finally clauses of :keyword:`try` statements
+   are honored, and it is possible to intercept the exit attempt at an outer level.
 
    .. versionchanged:: 3.6
       If an error occurs in the cleanup after the Python interpreter
index 915489fadd401908241aa1f1e171326e6ed76c7b..6bd7d003f5290be94020b6bf7fad1e0ed031e9d6 100644 (file)
@@ -62,6 +62,9 @@ The module defines the following user-callable items:
    The :py:data:`os.O_TMPFILE` flag is used if it is available and works
    (Linux-specific, requires Linux kernel 3.11 or later).
 
+   On platforms that are neither Posix nor Cygwin, TemporaryFile is an alias
+   for NamedTemporaryFile.
+
    .. audit-event:: tempfile.mkstemp fullpath tempfile.TemporaryFile
 
    .. versionchanged:: 3.5
index 11aba5dd842c56bb81de989e5c235dc557f2066d..45f2ef14b4bf4a8ba3a7de40978f7de40d335c5b 100644 (file)
@@ -253,6 +253,12 @@ Functions
    :const:`None`, the current time as returned by :func:`.time` is used.  The dst
    flag is set to ``1`` when DST applies to the given time.
 
+   :func:`localtime` may raise :exc:`OverflowError`, if the timestamp is
+   outside the range of values supported by the platform C :c:func:`localtime`
+   or :c:func:`gmtime` functions, and :exc:`OSError` on :c:func:`localtime` or
+   :c:func:`gmtime` failure. It's common for this to be restricted to years
+   between 1970 and 2038.
+
 
 .. function:: mktime(t)
 
@@ -434,10 +440,10 @@ Functions
    |           | negative time difference from UTC/GMT of the   |       |
    |           | form +HHMM or -HHMM, where H represents decimal|       |
    |           | hour digits and M represents decimal minute    |       |
-   |           | digits [-23:59, +23:59].                       |       |
+   |           | digits [-23:59, +23:59]. [1]_                  |       |
    +-----------+------------------------------------------------+-------+
    | ``%Z``    | Time zone name (no characters if no time zone  |       |
-   |           | exists).                                       |       |
+   |           | exists). Deprecated. [1]_                      |       |
    +-----------+------------------------------------------------+-------+
    | ``%%``    | A literal ``'%'`` character.                   |       |
    +-----------+------------------------------------------------+-------+
@@ -458,7 +464,7 @@ Functions
       calculations when the day of the week and the year are specified.
 
    Here is an example, a format for dates compatible with that specified  in the
-   :rfc:`2822` Internet email standard.  [#]_ ::
+   :rfc:`2822` Internet email standard.  [1]_ ::
 
       >>> from time import gmtime, strftime
       >>> strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
@@ -879,10 +885,9 @@ Timezone Constants
 
 .. rubric:: Footnotes
 
-.. [#] The use of ``%Z`` is now deprecated, but the ``%z`` escape that expands to the
-   preferred  hour/minute offset is not supported by all ANSI C libraries. Also, a
+.. [1] The use of ``%Z`` is now deprecated, but the ``%z`` escape that expands to the
+   preferred hour/minute offset is not supported by all ANSI C libraries. Also, a
    strict reading of the original 1982 :rfc:`822` standard calls for a two-digit
-   year (%y rather than %Y), but practice moved to 4-digit years long before the
+   year (``%y`` rather than ``%Y``), but practice moved to 4-digit years long before the
    year 2000.  After that, :rfc:`822` became obsolete and the 4-digit year has
    been first recommended by :rfc:`1123` and then mandated by :rfc:`2822`.
-
index d4e8b749db48087324851aff0cb476a391b3d98d..ca21fe622323ffb7e9605bc9cb34992b323943ba 100644 (file)
@@ -282,6 +282,13 @@ It is possible to provide a setup statement that is executed only once at the be
    $ python -m timeit -s 'text = "sample string"; char = "g"'  'text.find(char)'
    1000000 loops, best of 5: 0.342 usec per loop
 
+In the output, there are three fields. The loop count, which tells you how many
+times the statement body was run per timing loop repetition. The repetition
+count ('best of 5') which tells you how many times the timing loop was
+repeated, and finally the time the statement body took on average within the
+best repetition of the timing loop. That is, the time the fastest repetition
+took divided by the loop count.
+
 ::
 
    >>> import timeit
index c122d8f8ae5ba94f876479caa175a16d8b482ca7..6495e63e84650dd16cb50a6da3c51d5c9eca2c57 100644 (file)
Binary files a/Doc/library/tk_msg.png and b/Doc/library/tk_msg.png differ
index e1b2a87b0ff2e4f3a88abf7ae50cf5703dea905c..999852a58cf6a76321717b648fa1ab62ae2138b9 100644 (file)
@@ -644,8 +644,8 @@ callback
 
 color
    Colors can be given as the names of X colors in the rgb.txt file, or as strings
-   representing RGB values in 4 bit: ``"#RGB"``, 8 bit: ``"#RRGGBB"``, 12 bit"
-   ``"#RRRGGGBBB"``, or 16 bit ``"#RRRRGGGGBBBB"`` ranges, where R,G,B here
+   representing RGB values in 4 bit: ``"#RGB"``, 8 bit: ``"#RRGGBB"``, 12 bit:
+   ``"#RRRGGGBBB"``, or 16 bit: ``"#RRRRGGGGBBBB"`` ranges, where R,G,B here
    represent any legal hex digit.  See page 160 of Ousterhout's book for details.
 
 cursor
index 2da544884db1dac9e03e7bf1d0f31558f43f2141..13fc418e9274b46eaafbd9c5af17600893d77da3 100644 (file)
@@ -32,6 +32,10 @@ In the function ``greeting``, the argument ``name`` is expected to be of type
 :class:`str` and the return type :class:`str`. Subtypes are accepted as
 arguments.
 
+New features are frequently added to the ``typing`` module.
+The `typing_extensions <https://pypi.org/project/typing-extensions/>`_ package
+provides backports of these new features to older versions of Python.
+
 .. _relevant-peps:
 
 Relevant PEPs
@@ -1052,26 +1056,120 @@ These are not used in annotations. They are building blocks for declaring types.
 
       assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
 
-   The type info for introspection can be accessed via ``Point2D.__annotations__``
-   and ``Point2D.__total__``.  To allow using this feature with older versions
-   of Python that do not support :pep:`526`, ``TypedDict`` supports two additional
-   equivalent syntactic forms::
+   To allow using this feature with older versions of Python that do not
+   support :pep:`526`, ``TypedDict`` supports two additional equivalent
+   syntactic forms:
+
+   * Using a literal :class:`dict` as the second argument::
 
-      Point2D = TypedDict('Point2D', x=int, y=int, label=str)
       Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
 
-   By default, all keys must be present in a TypedDict. It is possible
-   to override this by specifying totality.
+   * Using keyword arguments::
+
+      Point2D = TypedDict('Point2D', x=int, y=int, label=str)
+
+   The functional syntax should also be used when any of the keys are not valid
+   :ref:`identifiers`, for example because they are keywords or contain hyphens.
+   Example::
+
+      # raises SyntaxError
+      class Point2D(TypedDict):
+          in: int  # 'in' is a keyword
+          x-y: int  # name with hyphens
+
+      # OK, functional syntax
+      Point2D = TypedDict('Point2D', {'in': int, 'x-y': int})
+
+   By default, all keys must be present in a ``TypedDict``. It is possible to
+   override this by specifying totality.
+   Usage::
+
+      class Point2D(TypedDict, total=False):
+          x: int
+          y: int
+
+      # Alternative syntax
+      Point2D = TypedDict('Point2D', {'x': int, 'y': int}, total=False)
+
+   This means that a ``Point2D`` ``TypedDict`` can have any of the keys
+   omitted. A type checker is only expected to support a literal ``False`` or
+   ``True`` as the value of the ``total`` argument. ``True`` is the default,
+   and makes all items defined in the class body required.
+
+   It is possible for a ``TypedDict`` type to inherit from one or more other ``TypedDict`` types
+   using the class-based syntax.
    Usage::
 
-      class point2D(TypedDict, total=False):
+      class Point3D(Point2D):
+          z: int
+
+   ``Point3D`` has three items: ``x``, ``y`` and ``z``. It is equivalent to this
+   definition::
+
+      class Point3D(TypedDict):
+          x: int
+          y: int
+          z: int
+
+   A ``TypedDict`` cannot inherit from a non-TypedDict class,
+   notably including :class:`Generic`. For example::
+
+      class X(TypedDict):
           x: int
+
+      class Y(TypedDict):
           y: int
 
-   This means that a point2D TypedDict can have any of the keys omitted. A type
-   checker is only expected to support a literal False or True as the value of
-   the total argument. True is the default, and makes all items defined in the
-   class body be required.
+      class Z(object): pass  # A non-TypedDict class
+
+      class XY(X, Y): pass  # OK
+
+      class XZ(X, Z): pass  # raises TypeError
+
+      T = TypeVar('T')
+      class XT(X, Generic[T]): pass  # raises TypeError
+
+   A ``TypedDict`` can be introspected via :attr:`__annotations__`,
+   :attr:`__total__`, :attr:`__required_keys__`, and :attr:`__optional_keys__`.
+
+   .. attribute:: __total__
+
+      ``Point2D.__total__`` gives the value of the ``total`` argument.
+      Example::
+
+         >>> from typing import TypedDict
+         >>> class Point2D(TypedDict): pass
+         >>> Point2D.__total__
+         True
+         >>> class Point2D(TypedDict, total=False): pass
+         >>> Point2D.__total__
+         False
+         >>> class Point3D(Point2D): pass
+         >>> Point3D.__total__
+         True
+
+   .. attribute:: __required_keys__
+   .. attribute:: __optional_keys__
+
+      ``Point2D.__required_keys__`` and ``Point2D.__optional_keys__`` return
+      :class:`frozenset` objects containing required and non-required keys, respectively.
+      Currently the only way to declare both required and non-required keys in the
+      same ``TypedDict`` is mixed inheritance, declaring a ``TypedDict`` with one value
+      for the ``total`` argument and then inheriting it from another ``TypedDict`` with
+      a different value for ``total``.
+      Usage::
+
+         >>> class Point2D(TypedDict, total=False):
+         ...     x: int
+         ...     y: int
+         ...
+         >>> class Point3D(Point2D):
+         ...     z: int
+         ...
+         >>> Point3D.__required_keys__ == frozenset({'z'})
+         True
+         >>> Point3D.__optional_keys__ == frozenset({'x', 'y'})
+         True
 
    See :pep:`589` for more examples and detailed rules of using ``TypedDict``.
 
index 415e25bef6de7d07d7106e004fd1ea4a59e743d4..ddfbbda279e35dffd69e3af779de7d45dba1fd6e 100644 (file)
@@ -118,7 +118,7 @@ which relays any information about the UUID's safety, using this enumeration:
 
 .. attribute:: UUID.hex
 
-   The UUID as a 32-character hexadecimal string.
+   The UUID as a 32-character lowercase hexadecimal string.
 
 
 .. attribute:: UUID.int
index 98454e18ff1f8795c79d688854ed6654d3ff349b..b387240a3716ccc5a3551196e37630efa5604246 100644 (file)
@@ -73,7 +73,7 @@ implementations are free to support the strict mapping from IDL).  See section
    `Document Object Model (DOM) Level 1 Specification <https://www.w3.org/TR/REC-DOM-Level-1/>`_
       The W3C recommendation for the DOM supported by :mod:`xml.dom.minidom`.
 
-   `Python Language Mapping Specification <http://www.omg.org/cgi-bin/doc?formal/02-11-05.pdf>`_
+   `Python Language Mapping Specification <https://www.omg.org/spec/PYTH/1.2/PDF>`_
       This specifies the mapping from OMG IDL to Python.
 
 
index 967308b95ffcbe569adac039940e04ba7f85b62e..f4320db60c92ad70d7ca557a106712656b3302b7 100644 (file)
@@ -1895,7 +1895,7 @@ Customizing class creation
 --------------------------
 
 Whenever a class inherits from another class, :meth:`~object.__init_subclass__` is
-called on that class. This way, it is possible to write classes which
+called on the parent class. This way, it is possible to write classes which
 change the behavior of subclasses. This is closely related to class
 decorators, but where class decorators only affect the specific class they're
 applied to, ``__init_subclass__`` solely applies to future subclasses of the
index 606e773456032945059e0453f53d5f496d87cc97..4ffb6512107f219a8d6227e24a4d938890d37056 100644 (file)
@@ -802,30 +802,44 @@ Subscriptions
    object: dictionary
    pair: sequence; item
 
-Subscription of a sequence (string, tuple or list) or mapping (dictionary)
-object usually selects an item from the collection:
+The subscription of an instance of a :ref:`container class <sequence-types>`
+will generally select an element from the container. The subscription of a
+:term:`generic class <generic type>` will generally return a
+:ref:`GenericAlias <types-genericalias>` object.
 
 .. productionlist:: python-grammar
    subscription: `primary` "[" `expression_list` "]"
 
-The primary must evaluate to an object that supports subscription (lists or
-dictionaries for example).  User-defined objects can support subscription by
-defining a :meth:`__getitem__` method.
+When an object is subscripted, the interpreter will evaluate the primary and
+the expression list.
 
-For built-in objects, there are two types of objects that support subscription:
+The primary must evaluate to an object that supports subscription. An object
+may support subscription through defining one or both of
+:meth:`~object.__getitem__` and :meth:`~object.__class_getitem__`. When the
+primary is subscripted, the evaluated result of the expression list will be
+passed to one of these methods. For more details on when ``__class_getitem__``
+is called instead of ``__getitem__``, see :ref:`classgetitem-versus-getitem`.
 
-If the primary is a mapping, the expression list must evaluate to an object
-whose value is one of the keys of the mapping, and the subscription selects the
-value in the mapping that corresponds to that key.  (The expression list is a
-tuple except if it has exactly one item.)
+If the expression list contains at least one comma, it will evaluate to a
+:class:`tuple` containing the items of the expression list. Otherwise, the
+expression list will evaluate to the value of the list's sole member.
 
-If the primary is a sequence, the expression list must evaluate to an integer
-or a slice (as discussed in the following section).
+For built-in objects, there are two types of objects that support subscription
+via :meth:`~object.__getitem__`:
+
+1. Mappings. If the primary is a :term:`mapping`, the expression list must
+   evaluate to an object whose value is one of the keys of the mapping, and the
+   subscription selects the value in the mapping that corresponds to that key.
+   An example of a builtin mapping class is the :class:`dict` class.
+2. Sequences. If the primary is a :term:`sequence`, the expression list must
+   evaluate to an :class:`int` or a :class:`slice` (as discussed in the
+   following section). Examples of builtin sequence classes include the
+   :class:`str`, :class:`list` and :class:`tuple` classes.
 
 The formal syntax makes no special provision for negative indices in
-sequences; however, built-in sequences all provide a :meth:`__getitem__`
+:term:`sequences <sequence>`. However, built-in sequences all provide a :meth:`~object.__getitem__`
 method that interprets negative indices by adding the length of the sequence
-to the index (so that ``x[-1]`` selects the last item of ``x``).  The
+to the index so that, for example, ``x[-1]`` selects the last item of ``x``. The
 resulting value must be a nonnegative integer less than the number of items in
 the sequence, and the subscription selects the item whose index is that value
 (counting from zero). Since the support for negative indices and slicing
@@ -836,14 +850,10 @@ this method will need to explicitly add that support.
    single: character
    pair: string; item
 
-A string's items are characters.  A character is not a separate data type but a
+A :class:`string <str>` is a special kind of sequence whose items are
+*characters*. A character is not a separate data type but a
 string of exactly one character.
 
-Subscription of certain :term:`classes <class>` or :term:`types <type>`
-creates a :ref:`generic alias <types-genericalias>`.
-In this case, user-defined classes can support subscription by providing a
-:meth:`__class_getitem__` classmethod.
-
 
 .. _slicings:
 
index c5952426fdcf8d1800678885fe0b2353222dbe2c..2c84a97a2677569be5db54ba8b55ed62525136a5 100644 (file)
@@ -84,9 +84,9 @@ considered a package.
 
 All modules have a name.  Subpackage names are separated from their parent
 package name by a dot, akin to Python's standard attribute access syntax.  Thus
-you might have a module called :mod:`sys` and a package called :mod:`email`,
-which in turn has a subpackage called :mod:`email.mime` and a module within
-that subpackage called :mod:`email.mime.text`.
+you might have a package called :mod:`email`, which in turn has a subpackage
+called :mod:`email.mime` and a module within that subpackage called
+:mod:`email.mime.text`.
 
 
 Regular packages
index fcca12dcf5c4ba98fbbeca5f955d7d260e6d4348..79f4011307ed8e9de2c093f5291ebeb508f72b66 100644 (file)
@@ -563,10 +563,10 @@ The :keyword:`!raise` statement
 .. productionlist:: python-grammar
    raise_stmt: "raise" [`expression` ["from" `expression`]]
 
-If no expressions are present, :keyword:`raise` re-raises the last exception
-that was active in the current scope.  If no exception is active in the current
-scope, a :exc:`RuntimeError` exception is raised indicating that this is an
-error.
+If no expressions are present, :keyword:`raise` re-raises the
+exception that is currently being handled, which is also known as the *active exception*.
+If there isn't currently an active exception, a :exc:`RuntimeError` exception is raised
+indicating that this is an error.
 
 Otherwise, :keyword:`raise` evaluates the first expression as the exception
 object.  It must be either a subclass or an instance of :class:`BaseException`.
@@ -581,8 +581,8 @@ The :dfn:`type` of the exception is the exception instance's class, the
 A traceback object is normally created automatically when an exception is raised
 and attached to it as the :attr:`__traceback__` attribute, which is writable.
 You can create an exception and set your own traceback in one step using the
-:meth:`with_traceback` exception method (which returns the same exception
-instance, with its traceback set to its argument), like so::
+:meth:`~BaseException.with_traceback` exception method (which returns the
+same exception instance, with its traceback set to its argument), like so::
 
    raise Exception("foo occurred").with_traceback(tracebackobj)
 
@@ -614,8 +614,10 @@ exceptions will be printed::
      File "<stdin>", line 4, in <module>
    RuntimeError: Something bad happened
 
-A similar mechanism works implicitly if an exception is raised inside an
-exception handler or a :keyword:`finally` clause: the previous exception is then
+A similar mechanism works implicitly if a new exception is raised when
+an exception is already being handled.  An exception may be handled
+when an :keyword:`except` or :keyword:`finally` clause, or a
+:keyword:`with` statement, is used.  The previous exception is then
 attached as the new exception's :attr:`__context__` attribute::
 
    >>> try:
index e999971625173412e22997b4bf27e7a792eecd8f..89970975b9032bcba19ffe44c0c5a0e2854154a5 100644 (file)
@@ -5,6 +5,7 @@ effect on some MBCS Windows systems.
 https://bugs.python.org/issue32174
 """
 
+import pathlib
 import re
 from html.entities import codepoint2name
 
@@ -39,12 +40,12 @@ def fixup_keywords(app, exception):
         return
 
     getLogger(__name__).info('fixing HTML escapes in keywords file...')
-    outdir = app.builder.outdir
+    outdir = pathlib.Path(app.builder.outdir)
     outname = app.builder.config.htmlhelp_basename
-    with app.builder.open_file(outdir, outname + '.hhk', 'r') as f:
+    with open(outdir / (outname + '.hhk'), 'rb') as f:
         index = f.read()
-    with app.builder.open_file(outdir, outname + '.hhk', 'w') as f:
-        f.write(index.replace('&#x27;', '&#39;'))
+    with open(outdir / (outname + '.hhk'), 'wb') as f:
+        f.write(index.replace(b'&#x27;', b'&#39;'))
 
 def setup(app):
     # `html-page-context` event emitted when the HTML builder has
index 8bc24670fbe0abe5020c6055f7bea80bb8ab25de..4262687d95b9d02c3445dc116defde53fe8aad31 100644 (file)
@@ -45,8 +45,8 @@ class PEGLexer(RegexLexer):
         ],
         "variables": [(_name + _text_ws + "(=)", bygroups(None, None, None),),],
         "invalids": [
-            (r"^(\s+\|\s+invalid_\w+\s*\n)", bygroups(None)),
-            (r"^(\s+\|\s+incorrect_\w+\s*\n)", bygroups(None)),
+            (r"^(\s+\|\s+.*invalid_\w+.*\n)", bygroups(None)),
+            (r"^(\s+\|\s+.*incorrect_\w+.*\n)", bygroups(None)),
             (r"^(#.*invalid syntax.*(?:.|\n)*)", bygroups(None),),
         ],
         "root": [
index 02fe9175278c57a3ae01a88e2806da1e29783b7d..48480ed567713a24a4b6c4b09e5e8c5f6a152956 100644 (file)
@@ -213,7 +213,10 @@ library/socket,,:can,"return (can_id, can_dlc, data[:can_dlc])"
 library/socket,,:len,fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
 library/sqlite3,,:year,"cur.execute(""select * from lang where first_appeared=:year"", {""year"": 1972})"
 library/sqlite3,,:memory,
-library/sqlite3,,:path,"db = sqlite3.connect('file:path/to/database?mode=ro', uri=True)"
+library/sqlite3,,:template,"con = sqlite3.connect(""file:template.db?mode=ro"", uri=True)"
+library/sqlite3,,:nosuchdb,"con = sqlite3.connect(""file:nosuchdb.db?mode=rw"", uri=True)"
+library/sqlite3,,:mem1,"con1 = sqlite3.connect(""file:mem1?mode=memory&cache=shared"", uri=True)"
+library/sqlite3,,:mem1,"con2 = sqlite3.connect(""file:mem1?mode=memory&cache=shared"", uri=True)"
 library/ssl,,:My,"Organizational Unit Name (eg, section) []:My Group"
 library/ssl,,:My,"Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization, Inc."
 library/ssl,,:myserver,"Common Name (eg, YOUR name) []:myserver.mygroup.myorganization.com"
index 08202f0344ea34166fa60eea0e7797bfa117aa1e..289d44239822b95105225700371f263565f9d152 100644 (file)
@@ -710,7 +710,7 @@ zero or more normal arguments may occur. ::
        file.write(separator.join(args))
 
 
-Normally, these ``variadic`` arguments will be last in the list of formal
+Normally, these *variadic* arguments will be last in the list of formal
 parameters, because they scoop up all remaining input arguments that are
 passed to the function. Any formal parameters which occur after the ``*args``
 parameter are 'keyword-only' arguments, meaning that they can only be used as
index 9c18ff19cf5e81f8fadf55aac01ce1e41148c846..03bf2d7b16c599b1f2d1d2cea577ba60fbc4570f 100644 (file)
Binary files a/Doc/using/win_installer.png and b/Doc/using/win_installer.png differ
index c04a34a62f62e2b3d344bd29859509e98eef5926..be21b55fe801f05f78d74c691869c0af5dbcea84 100644 (file)
@@ -129,8 +129,8 @@ suppressing the UI in order to change some of the defaults.
 To completely hide the installer UI and install Python silently, pass the
 ``/quiet`` option. To skip past the user interaction but still display
 progress and errors, pass the ``/passive`` option. The ``/uninstall``
-option may be passed to immediately begin removing Python - no prompt will be
-displayed.
+option may be passed to immediately begin removing Python - no confirmation
+prompt will be displayed.
 
 All other options are passed as ``name=value``, where the value is usually
 ``0`` to disable a feature, ``1`` to enable a feature, or a path. The full list
index 9204cc7fbf8c47235baeb9d9885488784e491fb9..7a00e37624185081b36a43b96276787520871b67 100644 (file)
@@ -537,7 +537,7 @@ Other Language Changes
 * The new :option:`-X` ``importtime`` option or the
   :envvar:`PYTHONPROFILEIMPORTTIME` environment variable can be used to show
   the timing of each module import.
-  (Contributed by Victor Stinner in :issue:`31415`.)
+  (Contributed by Inada Naoki in :issue:`31415`.)
 
 
 New Modules
index 0662adba7d4af5fe63c5a4bef70eb27c82a19c37..6aed8d2b5f984df6aa8862100bea942adf91ac38 100644 (file)
@@ -484,8 +484,25 @@ Najera in :issue:`38944`.)
 Added keywords to module name completion list.  (Contributed by Terry J.
 Reedy in :issue:`37765`.)
 
+New in 3.9 maintenance releases
+
+Make IDLE invoke :func:`sys.excepthook` (when started without '-n').
+User hooks were previously ignored.  (Contributed by Ken Hilton in
+:issue:`43008`.)
+
 The changes above have been backported to 3.8 maintenance releases.
 
+Rearrange the settings dialog.  Split the General tab into Windows
+and Shell/Ed tabs.  Move help sources, which extend the Help menu, to the
+Extensions tab.  Make space for new options and shorten the dialog. The
+latter makes the dialog better fit small screens.  (Contributed by Terry Jan
+Reedy in :issue:`40468`.)  Move the indent space setting from the Font tab to
+the new Windows tab.  (Contributed by Mark Roseman and Terry Jan Reedy in
+:issue:`33962`.)
+
+Apply syntax highlighting to `.pyi` files. (Contributed by Alex
+Waygood and Terry Jan Reedy in :issue:`45447`.)
+
 imaplib
 -------
 
index 23fbd55ffcd66d78f006814cb111d4743788a057..bf343ad960b8cc22d4ac73ae5165eb2dd7aac87c 100644 (file)
 /*--start constants--*/
 #define PY_MAJOR_VERSION        3
 #define PY_MINOR_VERSION        9
-#define PY_MICRO_VERSION        10
+#define PY_MICRO_VERSION        11
 #define PY_RELEASE_LEVEL        PY_RELEASE_LEVEL_FINAL
 #define PY_RELEASE_SERIAL       0
 
 /* Version as a string */
-#define PY_VERSION              "3.9.10"
+#define PY_VERSION              "3.9.11"
 /*--end constants--*/
 
 /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2.
index acfaff802f5063625ab3f7b72c4617534d3627d5..023ac7cf0369583971f34686c6c3c76056c3663a 100644 (file)
@@ -816,7 +816,7 @@ class KeysView(MappingView, Set):
     __slots__ = ()
 
     @classmethod
-    def _from_iterable(self, it):
+    def _from_iterable(cls, it):
         return set(it)
 
     def __contains__(self, key):
@@ -834,7 +834,7 @@ class ItemsView(MappingView, Set):
     __slots__ = ()
 
     @classmethod
-    def _from_iterable(self, it):
+    def _from_iterable(cls, it):
         return set(it)
 
     def __contains__(self, item):
index 4804ed27cd14d628eef56df32cc69722d49d94ea..7a9a2779fcee72ff2e575c4a3e14ddf5282a0e98 100644 (file)
@@ -314,8 +314,7 @@ except AttributeError:
 
 class IOBase(metaclass=abc.ABCMeta):
 
-    """The abstract base class for all I/O classes, acting on streams of
-    bytes. There is no public constructor.
+    """The abstract base class for all I/O classes.
 
     This class provides dummy implementations for many methods that
     derived classes can override selectively; the default implementations
@@ -1821,7 +1820,7 @@ class TextIOBase(IOBase):
     """Base class for text I/O.
 
     This class provides a character and line based interface to stream
-    I/O. There is no public constructor.
+    I/O.
     """
 
     def read(self, size=-1):
index 40569437ac62b6155ec5e19d518ce20b6436790f..fbdfd5172fb35b6ae0f6903829e352eda954ba45 100644 (file)
@@ -878,7 +878,7 @@ class BooleanOptionalAction(Action):
                 option_string = '--no-' + option_string[2:]
                 _option_strings.append(option_string)
 
-        if help is not None and default is not None:
+        if help is not None and default is not None and default is not SUPPRESS:
             help += " (default: %(default)s)"
 
         super().__init__(
index 8c1fb496948750e5adb312503591bce61974974b..7a14e5e139f029c33f3abd55fbf35e6d2985a534 100644 (file)
@@ -49,7 +49,7 @@ from . import trsock
 from .log import logger
 
 
-__all__ = 'BaseEventLoop',
+__all__ = 'BaseEventLoop','Server',
 
 
 # Minimum number of _scheduled timer handles before cleanup of
@@ -202,6 +202,11 @@ else:
         pass
 
 
+def _check_ssl_socket(sock):
+    if ssl is not None and isinstance(sock, ssl.SSLSocket):
+        raise TypeError("Socket cannot be of type SSLSocket")
+
+
 class _SendfileFallbackProtocol(protocols.Protocol):
     def __init__(self, transp):
         if not isinstance(transp, transports._FlowControlMixin):
@@ -864,6 +869,7 @@ class BaseEventLoop(events.AbstractEventLoop):
                             *, fallback=True):
         if self._debug and sock.gettimeout() != 0:
             raise ValueError("the socket must be non-blocking")
+        _check_ssl_socket(sock)
         self._check_sendfile_params(sock, file, offset, count)
         try:
             return await self._sock_sendfile_native(sock, file,
@@ -1005,6 +1011,9 @@ class BaseEventLoop(events.AbstractEventLoop):
             raise ValueError(
                 'ssl_handshake_timeout is only meaningful with ssl')
 
+        if sock is not None:
+            _check_ssl_socket(sock)
+
         if happy_eyeballs_delay is not None and interleave is None:
             # If using happy eyeballs, default to interleave addresses by family
             interleave = 1
@@ -1438,6 +1447,9 @@ class BaseEventLoop(events.AbstractEventLoop):
             raise ValueError(
                 'ssl_handshake_timeout is only meaningful with ssl')
 
+        if sock is not None:
+            _check_ssl_socket(sock)
+
         if host is not None or port is not None:
             if sock is not None:
                 raise ValueError(
@@ -1540,6 +1552,9 @@ class BaseEventLoop(events.AbstractEventLoop):
             raise ValueError(
                 'ssl_handshake_timeout is only meaningful with ssl')
 
+        if sock is not None:
+            _check_ssl_socket(sock)
+
         transport, protocol = await self._create_connection_transport(
             sock, protocol_factory, ssl, '', server_side=True,
             ssl_handshake_timeout=ssl_handshake_timeout)
index bed4da52fd4d98b9413be0f92541d41f86cead46..aaab09c28e6b5f1b91b11573237009e89c53752e 100644 (file)
@@ -8,6 +8,7 @@ import concurrent.futures
 import contextvars
 import logging
 import sys
+from types import GenericAlias
 
 from . import base_futures
 from . import events
@@ -106,8 +107,7 @@ class Future:
             context['source_traceback'] = self._source_traceback
         self._loop.call_exception_handler(context)
 
-    def __class_getitem__(cls, type):
-        return cls
+    __class_getitem__ = classmethod(GenericAlias)
 
     @property
     def _log_traceback(self):
index b4cd414b82d72798a03553732ba47109df6c92aa..e3f95cf21d6179bd0188e185b4dbeb3ee76eb4b2 100644 (file)
@@ -158,7 +158,7 @@ class _ProactorBasePipeTransport(transports._FlowControlMixin,
             # end then it may fail with ERROR_NETNAME_DELETED if we
             # just close our end.  First calling shutdown() seems to
             # cure it, but maybe using DisconnectEx() would be better.
-            if hasattr(self._sock, 'shutdown'):
+            if hasattr(self._sock, 'shutdown') and self._sock.fileno() != -1:
                 self._sock.shutdown(socket.SHUT_RDWR)
             self._sock.close()
             self._sock = None
@@ -450,7 +450,8 @@ class _ProactorWritePipeTransport(_ProactorBaseWritePipeTransport):
             self.close()
 
 
-class _ProactorDatagramTransport(_ProactorBasePipeTransport):
+class _ProactorDatagramTransport(_ProactorBasePipeTransport,
+                                 transports.DatagramTransport):
     max_size = 256 * 1024
     def __init__(self, loop, sock, protocol, address=None,
                  waiter=None, extra=None):
index 69fa43e8b6511a9599f467eb522e03e6a72e4862..09987b164c66e57f8bd12190899a86947cd065b6 100644 (file)
@@ -109,10 +109,6 @@ class Protocol(BaseProtocol):
 class BufferedProtocol(BaseProtocol):
     """Interface for stream protocol with manual buffer control.
 
-    Important: this has been added to asyncio in Python 3.7
-    *on a provisional basis*!  Consider it as an experimental API that
-    might be changed or removed in Python 3.8.
-
     Event methods, such as `create_server` and `create_connection`,
     accept factories that return protocols that implement this interface.
 
index cd3f7c6a56789152052a2d00143b852bca384e0e..14ae87e0a2dd2d14c9cf06904baf46fa36ec84e4 100644 (file)
@@ -3,6 +3,7 @@ __all__ = ('Queue', 'PriorityQueue', 'LifoQueue', 'QueueFull', 'QueueEmpty')
 import collections
 import heapq
 import warnings
+from types import GenericAlias
 
 from . import events
 from . import locks
@@ -76,8 +77,7 @@ class Queue:
     def __str__(self):
         return f'<{type(self).__name__} {self._format()}>'
 
-    def __class_getitem__(cls, type):
-        return cls
+    __class_getitem__ = classmethod(GenericAlias)
 
     def _format(self):
         result = f'maxsize={self._maxsize!r}'
index 59cb6b1babec54d5e2e53659e982a49afd2ca9ff..71080b8ad16c619f678c7f49292c116350f258d6 100644 (file)
@@ -40,11 +40,6 @@ def _test_selector_event(selector, fd, event):
         return bool(key.events & event)
 
 
-def _check_ssl_socket(sock):
-    if ssl is not None and isinstance(sock, ssl.SSLSocket):
-        raise TypeError("Socket cannot be of type SSLSocket")
-
-
 class BaseSelectorEventLoop(base_events.BaseEventLoop):
     """Selector event loop.
 
@@ -357,7 +352,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop):
         The maximum amount of data to be received at once is specified by
         nbytes.
         """
-        _check_ssl_socket(sock)
+        base_events._check_ssl_socket(sock)
         if self._debug and sock.gettimeout() != 0:
             raise ValueError("the socket must be non-blocking")
         try:
@@ -398,7 +393,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop):
         The received data is written into *buf* (a writable buffer).
         The return value is the number of bytes written.
         """
-        _check_ssl_socket(sock)
+        base_events._check_ssl_socket(sock)
         if self._debug and sock.gettimeout() != 0:
             raise ValueError("the socket must be non-blocking")
         try:
@@ -439,7 +434,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop):
         raised, and there is no way to determine how much data, if any, was
         successfully processed by the receiving end of the connection.
         """
-        _check_ssl_socket(sock)
+        base_events._check_ssl_socket(sock)
         if self._debug and sock.gettimeout() != 0:
             raise ValueError("the socket must be non-blocking")
         try:
@@ -488,13 +483,15 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop):
 
         This method is a coroutine.
         """
-        _check_ssl_socket(sock)
+        base_events._check_ssl_socket(sock)
         if self._debug and sock.gettimeout() != 0:
             raise ValueError("the socket must be non-blocking")
 
         if not hasattr(socket, 'AF_UNIX') or sock.family != socket.AF_UNIX:
             resolved = await self._ensure_resolved(
-                address, family=sock.family, proto=sock.proto, loop=self)
+                address, family=sock.family, type=sock.type, proto=sock.proto,
+                loop=self,
+            )
             _, _, _, _, address = resolved[0]
 
         fut = self.create_future()
@@ -553,7 +550,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop):
         object usable to send and receive data on the connection, and address
         is the address bound to the socket on the other end of the connection.
         """
-        _check_ssl_socket(sock)
+        base_events._check_ssl_socket(sock)
         if self._debug and sock.gettimeout() != 0:
             raise ValueError("the socket must be non-blocking")
         fut = self.create_future()
index cad25b26539f5aa930684eb664b1bdf9fd4c9f82..00fc16c014c9b2d666e81d7085860df8a62dd67c 100644 (file)
@@ -367,6 +367,12 @@ class _SSLProtocolTransport(transports._FlowControlMixin,
         """Return the current size of the write buffer."""
         return self._ssl_protocol._transport.get_write_buffer_size()
 
+    def get_write_buffer_limits(self):
+        """Get the high and low watermarks for write flow control. 
+        Return a tuple (low, high) where low and high are 
+        positive number of bytes."""
+        return self._ssl_protocol._transport.get_write_buffer_limits()
+
     @property
     def _protocol_paused(self):
         # Required for sendfile fallback pause_writing/resume_writing logic
index 27a3c8c5a88df45cdfa8871b405660bfb189b87f..53252f2079d7ce8db3fb79473dec0cba8ba8d8f6 100644 (file)
@@ -17,6 +17,7 @@ import itertools
 import types
 import warnings
 import weakref
+from types import GenericAlias
 
 from . import base_tasks
 from . import coroutines
@@ -147,8 +148,7 @@ class Task(futures._PyFuture):  # Inherit Python Task implementation
             self._loop.call_exception_handler(context)
         super().__del__()
 
-    def __class_getitem__(cls, type):
-        return cls
+    __class_getitem__ = classmethod(GenericAlias)
 
     def _repr_info(self):
         return base_tasks._task_repr_info(self)
@@ -768,7 +768,7 @@ def _gather(*coros_or_futures, loop=None, return_exceptions=False):
         nonlocal nfinished
         nfinished += 1
 
-        if outer.done():
+        if outer is None or outer.done():
             if not fut.cancelled():
                 # Mark exception retrieved.
                 fut.exception()
@@ -823,6 +823,7 @@ def _gather(*coros_or_futures, loop=None, return_exceptions=False):
     children = []
     nfuts = 0
     nfinished = 0
+    outer = None  # bpo-46672
     for arg in coros_or_futures:
         if arg not in arg_to_fut:
             fut = ensure_future(arg, loop=loop)
index 45e155c94cad1b31fb48e12a2098ba41138f4d31..73b1fa2de416c7012518df6306ba0845e49d3eaf 100644 (file)
@@ -99,6 +99,12 @@ class WriteTransport(BaseTransport):
         """Return the current size of the write buffer."""
         raise NotImplementedError
 
+    def get_write_buffer_limits(self):
+        """Get the high and low watermarks for write flow control. 
+        Return a tuple (low, high) where low and high are 
+        positive number of bytes."""
+        raise NotImplementedError
+
     def write(self, data):
         """Write some data bytes to the transport.
 
index 992b8c4da3a7767ef33acca80d86203a8b066356..66acd62e6851a12e1a7d4b34f9f3b083e3fa9a0d 100644 (file)
@@ -1,5 +1,6 @@
 from ctypes import *
 from ctypes.test import need_symbol
+from test import support
 import unittest
 import os
 
@@ -39,6 +40,8 @@ class C_Test(unittest.TestCase):
                 setattr(b, name, i)
                 self.assertEqual(getattr(b, name), func(byref(b), name.encode('ascii')))
 
+    # bpo-46913: _ctypes/cfield.c h_get() has an undefined behavior
+    @support.skip_if_sanitizer(ub=True)
     def test_shorts(self):
         b = BITS()
         name = "M"
index 9c137469c3b5a53acb3a82a372efc9a8e8dfab23..49571f97bbe152675c87af0712d475579a523c92 100644 (file)
@@ -1,5 +1,5 @@
 from ctypes import *
-import unittest, sys
+import unittest
 from test import support
 
 ################################################################
@@ -10,10 +10,6 @@ from _ctypes import PyObj_FromPtr
 ################################################################
 
 from sys import getrefcount as grc
-if sys.version_info > (2, 4):
-    c_py_ssize_t = c_size_t
-else:
-    c_py_ssize_t = c_int
 
 class PythonAPITestCase(unittest.TestCase):
 
@@ -21,7 +17,7 @@ class PythonAPITestCase(unittest.TestCase):
         PyBytes_FromStringAndSize = pythonapi.PyBytes_FromStringAndSize
 
         PyBytes_FromStringAndSize.restype = py_object
-        PyBytes_FromStringAndSize.argtypes = c_char_p, c_py_ssize_t
+        PyBytes_FromStringAndSize.argtypes = c_char_p, c_size_t
 
         self.assertEqual(PyBytes_FromStringAndSize(b"abcdefghi", 3), b"abc")
 
index 2a140a2624d461e872941f033acd0beeb0954edc..e510cc7fb2bafdb158d690e07fb7b7dd4ea297e3 100644 (file)
@@ -12,7 +12,7 @@ from . import _bundled
 
 __all__ = ["version", "bootstrap"]
 _SETUPTOOLS_VERSION = "58.1.0"
-_PIP_VERSION = "21.2.4"
+_PIP_VERSION = "22.0.4"
 _PROJECTS = [
     ("setuptools", _SETUPTOOLS_VERSION, "py3"),
     ("pip", _PIP_VERSION, "py3"),
diff --git a/Lib/ensurepip/_bundled/pip-21.2.4-py3-none-any.whl b/Lib/ensurepip/_bundled/pip-21.2.4-py3-none-any.whl
deleted file mode 100644 (file)
index 46d3012..0000000
Binary files a/Lib/ensurepip/_bundled/pip-21.2.4-py3-none-any.whl and /dev/null differ
diff --git a/Lib/ensurepip/_bundled/pip-22.0.4-py3-none-any.whl b/Lib/ensurepip/_bundled/pip-22.0.4-py3-none-any.whl
new file mode 100644 (file)
index 0000000..7ba048e
Binary files /dev/null and b/Lib/ensurepip/_bundled/pip-22.0.4-py3-none-any.whl differ
index d7cce20432ead4b8497d7658117b175f49791427..2d2300c2aeab3c6506cdcec656a092e2eb47de02 100644 (file)
@@ -103,8 +103,6 @@ import socketserver
 import sys
 import time
 import urllib.parse
-import contextlib
-from functools import partial
 
 from http import HTTPStatus
 
@@ -1240,7 +1238,6 @@ def test(HandlerClass=BaseHTTPRequestHandler,
 
     """
     ServerClass.address_family, addr = _get_best_family(bind, port)
-
     HandlerClass.protocol_version = protocol
     with ServerClass(addr, HandlerClass) as httpd:
         host, port = httpd.socket.getsockname()[:2]
@@ -1257,29 +1254,29 @@ def test(HandlerClass=BaseHTTPRequestHandler,
 
 if __name__ == '__main__':
     import argparse
+    import contextlib
 
     parser = argparse.ArgumentParser()
     parser.add_argument('--cgi', action='store_true',
-                       help='Run as CGI Server')
+                        help='run as CGI server')
     parser.add_argument('--bind', '-b', metavar='ADDRESS',
-                        help='Specify alternate bind address '
-                             '[default: all interfaces]')
+                        help='specify alternate bind address '
+                             '(default: all interfaces)')
     parser.add_argument('--directory', '-d', default=os.getcwd(),
-                        help='Specify alternative directory '
-                        '[default:current directory]')
-    parser.add_argument('port', action='store',
-                        default=8000, type=int,
+                        help='specify alternate directory '
+                             '(default: current directory)')
+    parser.add_argument('port', action='store', default=8000, type=int,
                         nargs='?',
-                        help='Specify alternate port [default: 8000]')
+                        help='specify alternate port (default: 8000)')
     args = parser.parse_args()
     if args.cgi:
         handler_class = CGIHTTPRequestHandler
     else:
-        handler_class = partial(SimpleHTTPRequestHandler,
-                                directory=args.directory)
+        handler_class = SimpleHTTPRequestHandler
 
     # ensure dual-stack is not disabled; ref #38907
     class DualStackServer(ThreadingHTTPServer):
+
         def server_bind(self):
             # suppress exception when protocol is IPv4
             with contextlib.suppress(Exception):
@@ -1287,6 +1284,10 @@ if __name__ == '__main__':
                     socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
             return super().server_bind()
 
+        def finish_request(self, request, client_address):
+            self.RequestHandlerClass(request, client_address, self,
+                                     directory=args.directory)
+
     test(
         HandlerClass=handler_class,
         ServerClass=DualStackServer,
index 9f001b1d79cf697bb81bde59a5bc2f8341f74ba6..bcedcd640039063616da52d222e949a4b737280f 100644 (file)
Binary files a/Lib/idlelib/Icons/idle_16.gif and b/Lib/idlelib/Icons/idle_16.gif differ
index 6abde0af90cb6bc9dfc71cc4d8fd17abc3c7bf53..77d8f711804f954d15520c8f9e40720fd6fb5e64 100644 (file)
Binary files a/Lib/idlelib/Icons/idle_16.png and b/Lib/idlelib/Icons/idle_16.png differ
index 99ffa6fad4a92ddbc68d7def4e82d11a11da4d42..64f276b40d23b7937c95746bff1a1ce73543c5b0 100644 (file)
Binary files a/Lib/idlelib/Icons/idle_256.png and b/Lib/idlelib/Icons/idle_256.png differ
index af5b2d52cce8951a47ac1604b9332b9032c0ce2d..a1b12a0531d64a9118dd7ac8fbdcc2907dfe2a29 100644 (file)
Binary files a/Lib/idlelib/Icons/idle_32.gif and b/Lib/idlelib/Icons/idle_32.gif differ
index 41b70dbc37766a9f229f4e0b88ddc2f13d22e3db..2aaa55805ed5305d9f7a55db870db7fd398ae751 100644 (file)
Binary files a/Lib/idlelib/Icons/idle_32.png and b/Lib/idlelib/Icons/idle_32.png differ
index e5fa9280e21f86b0e5e750b02279b93e36009589..705eec42e8a64e9f69c5cafca63536deb18ebc68 100644 (file)
Binary files a/Lib/idlelib/Icons/idle_48.png and b/Lib/idlelib/Icons/idle_48.png differ
index c72e46ff863e4786a3aa39f0d60266f8c9bf2534..173e97095913ae40d771c3eef47328fca8cdf84e 100644 (file)
Binary files a/Lib/idlelib/Icons/minusnode.gif and b/Lib/idlelib/Icons/minusnode.gif differ
index 13ace90eb3269a14e363ca3646b08c4c3581d026..abedde047f2e2bb307ba903645755a451b7e4f23 100644 (file)
Binary files a/Lib/idlelib/Icons/plusnode.gif and b/Lib/idlelib/Icons/plusnode.gif differ
index b189c2c2d22c120800daefebf9b8bb26f60857a0..01b13e35834038ead38c7e872c2b652a86915d5d 100644 (file)
Binary files a/Lib/idlelib/Icons/python.gif and b/Lib/idlelib/Icons/python.gif differ
index a603f5ecb08a95bd6b90a72adc42208cc2687f64..03bf3832abb7f6b1ca5cad39ff548260e8c8f511 100644 (file)
Binary files a/Lib/idlelib/Icons/tk.gif and b/Lib/idlelib/Icons/tk.gif differ
index f68e144d256100e72a487574b40a3c6168c45918..5605c564f903228bc58d697527ba6d0d8a46f991 100644 (file)
@@ -1,8 +1,43 @@
 What's New in IDLE 3.9.z
-(since 3.9.0)
+after 3.9.0 until 3.9.12
+Released on 2022-05-16
 =========================
 
 
+bpo-28950: Apply IDLE syntax highlighting to `.pyi` files.  Add util.py
+for common components.  Patch by Alex Waygood and Terry Jan Reedy.
+
+bpo-46630: Make query dialogs on Windows start with a cursor in the
+entry box.
+
+bpo-46591: Make the IDLE doc URL on the About IDLE dialog clickable.
+
+bpo-45296: Clarify close, quit, and exit in IDLE.  In the File menu,
+'Close' and 'Exit' are now 'Close Window' (the current one) and 'Exit'
+is now 'Exit IDLE' (by closing all windows).  In Shell, 'quit()' and
+'exit()' mean 'close Shell'.  If there are no other windows,
+this also exits IDLE.
+
+bpo-45296: On Windows, change exit/quit message to suggest Ctrl-D, which
+works, instead of <Ctrl-Z Return>, which does not work in IDLE.
+
+bpo-40128: Mostly fix completions on macOS when not using tcl/tk 8.6.11
+(as with 3.9).
+
+bpo-33962: Move the indent space setting from the Font tab to the new Windows
+tab. Patch by Mark Roseman and Terry Jan Reedy.
+
+bpo-40468: Split the settings dialog General tab into Windows and Shell/ED
+tabs. Move help sources, which extend the Help menu, to the Extensions tab.
+Make space for new options and shorten the dialog. The latter makes the dialog
+better fit small screens.
+
+bpo-41611: Avoid occasional uncaught exceptions and freezing when using
+completions on macOS.
+
+bpo-42225: Document that IDLE can fail on Unix either from misconfigured IP
+masquerade rules or failure displaying complex colored (non-ascii) characters.
+
 bpo-43283: Document why printing to IDLE's Shell is often slower than
 printing to a system terminal and that it can be made faster by
 pre-formatting a single string before printing.
@@ -30,6 +65,12 @@ by using inspect.getdoc.
 bpo-33987: Mostly finish using ttk widgets, mainly for editor,
 settings, and searches.  Some patches by Mark Roseman.
 
+bpo-40511: Stop unnecessary "flashing" when typing opening and closing
+parentheses inside the parentheses of a function call.
+
+bpo-38439: Add a 256×256 pixel IDLE icon to the Windows .ico file. Created by
+Andrew Clover. Remove the low-color gif variations from the .ico file.
+
 bpo-41775: Make 'IDLE Shell' the shell title.
 
 bpo-35764: Rewrite the Calltips doc section.
index bc3d978f43f1ad263e2a2b2e1c4088209fa0f81f..8870fda315e392562f7b127272b7aa0a0354e776 100644 (file)
@@ -82,6 +82,7 @@ tabbedpages.py    # Define tabbed pages widget (nim).
 textview.py       # Define read-only text widget (nim).
 tree.py           # Define tree widget, used in browsers (nim).
 undo.py           # Manage undo stack.
+util.py           # Define objects imported elsewhere with no dependencies (nim)
 windows.py        # Manage window list and define listed top level.
 zoomheight.py     # Zoom window to full height of screen.
 
index b9cb50264ff06f22a36cf6cf405ba27aa1f4305d..3bd0a0cd39c8e0c39164118cfcadc4d39ca12e3e 100644 (file)
@@ -27,6 +27,7 @@ from idlelib import query
 from idlelib import replace
 from idlelib import search
 from idlelib.tree import wheel_event
+from idlelib.util import py_extensions
 from idlelib import window
 
 # The default tab setting for a Text widget, in average-width characters.
@@ -757,7 +758,7 @@ class EditorWindow:
         if not filename or os.path.isdir(filename):
             return True
         base, ext = os.path.splitext(os.path.basename(filename))
-        if os.path.normcase(ext) in (".py", ".pyw"):
+        if os.path.normcase(ext) in py_extensions:
             return True
         line = self.text.get('1.0', '1.0 lineend')
         return line.startswith('#!') and 'python' in line
index edc539cd62875a09f1b1d63b58860ea20772358c..d48622dbd17dab1895f18061336e972f0802fd17 100644 (file)
@@ -5,7 +5,7 @@
   <head>
     <meta charset="utf-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>IDLE &#8212; Python 3.11.0a0 documentation</title>
+    <title>IDLE &#8212; Python 3.11.0a4 documentation</title>
     <link rel="stylesheet" href="../_static/pydoctheme.css" type="text/css" />
     <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
 
@@ -18,7 +18,7 @@
     <script src="../_static/sidebar.js"></script>
 
     <link rel="search" type="application/opensearchdescription+xml"
-          title="Search within Python 3.11.0a0 documentation"
+          title="Search within Python 3.11.0a4 documentation"
           href="../_static/opensearch.xml"/>
     <link rel="author" title="About these documents" href="../about.html" />
     <link rel="index" title="Index" href="../genindex.html" />
@@ -71,7 +71,7 @@
 
 
     <li id="cpython-language-and-version">
-      <a href="../index.html">3.11.0a0 Documentation</a> &#187;
+      <a href="../index.html">3.11.0a4 Documentation</a> &#187;
     </li>
 
           <li class="nav-item nav-item-1"><a href="index.html" >The Python Standard Library</a> &#187;</li>
@@ -163,9 +163,11 @@ file.</p>
 </dd>
 <dt>Print Window</dt><dd><p>Print the current window to the default printer.</p>
 </dd>
-<dt>Close</dt><dd><p>Close the current window (ask to save if unsaved).</p>
+<dt>Close Window</dt><dd><p>Close the current window (if an unsaved editor, ask to save; if an unsaved
+Shell, ask to quit execution).  Calling <code class="docutils literal notranslate"><span class="pre">exit()</span></code> or <code class="docutils literal notranslate"><span class="pre">close()</span></code> in the Shell
+window also closes Shell.  If this is the only window, also exit IDLE.</p>
 </dd>
-<dt>Exit</dt><dd><p>Close all windows and quit IDLE (ask to save unsaved windows).</p>
+<dt>Exit IDLE</dt><dd><p>Close all windows and quit IDLE (ask to save unsaved edit windows).</p>
 </dd>
 </dl>
 </div>
@@ -971,7 +973,7 @@ also used for testing.</p>
 
 
     <li id="cpython-language-and-version">
-      <a href="../index.html">3.11.0a0 Documentation</a> &#187;
+      <a href="../index.html">3.11.0a4 Documentation</a> &#187;
     </li>
 
           <li class="nav-item nav-item-1"><a href="index.html" >The Python Standard Library</a> &#187;</li>
@@ -995,7 +997,7 @@ also used for testing.</p>
       </ul>
     </div>
     <div class="footer">
-    &copy; <a href="../copyright.html">Copyright</a> 2001-2021, Python Software Foundation.
+    &copy; <a href="../copyright.html">Copyright</a> 2001-2022, Python Software Foundation.
     <br />
 
     The Python Software Foundation is a non-profit corporation.
@@ -1003,8 +1005,8 @@ also used for testing.</p>
 <br />
     <br />
 
-    Last updated on Sep 06, 2021.
-    <a href="https://docs.python.org/3/bugs.html">Found a bug</a>?
+    Last updated on Jan 26, 2022.
+    <a href="/bugs.html">Found a bug</a>?
     <br />
 
     Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
index 019aacbd0faa20711bb9a2617a1f5f9751304959..c59f49459980680f00497830f5c20f7b8ec47825 100644 (file)
@@ -3,6 +3,7 @@
 """
 import os
 import sys
+import webbrowser
 from platform import python_version, architecture
 
 from tkinter import Toplevel, Frame, Label, Button, PhotoImage
@@ -94,6 +95,7 @@ class AboutDialog(Toplevel):
                      f"{version[:version.rindex('.')]}/library/idle.html",
                      justify=LEFT, fg=self.fg, bg=self.bg)
         docs.grid(row=7, column=0, columnspan=2, sticky=W, padx=10, pady=0)
+        docs.bind("<Button-1>", lambda event: webbrowser.open(docs['text']))
 
         Frame(frame_background, borderwidth=1, relief=SUNKEN,
               height=2, bg=self.bg).grid(row=8, column=0, sticky=EW,
diff --git a/Lib/idlelib/idle_test/example_noext b/Lib/idlelib/idle_test/example_noext
new file mode 100644 (file)
index 0000000..7d2510e
--- /dev/null
@@ -0,0 +1,4 @@
+#!usr/bin/env python
+
+def example_function(some_argument):
+    pass
diff --git a/Lib/idlelib/idle_test/example_stub.pyi b/Lib/idlelib/idle_test/example_stub.pyi
new file mode 100644 (file)
index 0000000..a9811a7
--- /dev/null
@@ -0,0 +1,2 @@
+class Example:
+    def method(self, argument1: str, argument2: list[int]) -> None: ...
index 666ff4cb8485106640afd38014df66ab957b5322..d297f8aa0094ee9424bbc3f60ccc7d2eb0b6d2ef 100644 (file)
@@ -77,8 +77,8 @@ AboutDialog_spec = {
     'kwds': {'title': 'help_about test',
              '_htest': True,
              },
-    'msg': "Test every button. Ensure Python, TK and IDLE versions "
-           "are correctly displayed.\n [Close] to exit.",
+    'msg': "Click on URL to open in default browser.\n"
+           "Verify x.y.z versions and test each button, including Close.\n "
     }
 
 # TODO implement ^\; adding '<Control-Key-\\>' to function does not work.
index b23915c5ab7849d5ccd8d23524fe8670f6f86649..e8d2bd17cb681170e7dbbe57d571ff4007b6db87 100644 (file)
@@ -106,7 +106,7 @@ subclasses to override in order to tweak the default behaviour.
 If you want to completely replace the main wrapping algorithm,
 you\'ll probably have to override _wrap_chunks().''')
 
-    def test_properly_formated(self):
+    def test_properly_formatted(self):
 
         def foo(s='a'*100):
             pass
index 99f40487967124aa81c70c0e8135167ba1a91ee4..e338893c09e6a14c12e873d449a492b024373dac 100644 (file)
@@ -1,6 +1,6 @@
 "Test , coverage 17%."
 
-from idlelib import iomenu
+from idlelib import iomenu, util
 import unittest
 from test.support import requires
 from tkinter import Tk
@@ -45,5 +45,27 @@ class IOBindingTest(unittest.TestCase):
         eq(fix(), 'a'+io.eol_convention)
 
 
+def _extension_in_filetypes(extension):
+    return any(
+        f'*{extension}' in filetype_tuple[1]
+        for filetype_tuple in iomenu.IOBinding.filetypes
+    )
+
+
+class FiletypesTest(unittest.TestCase):
+    def test_python_source_files(self):
+        for extension in util.py_extensions:
+            with self.subTest(extension=extension):
+                self.assertTrue(
+                    _extension_in_filetypes(extension)
+                )
+
+    def test_text_files(self):
+        self.assertTrue(_extension_in_filetypes('.txt'))
+
+    def test_all_files(self):
+        self.assertTrue(_extension_in_filetypes(''))
+
+
 if __name__ == '__main__':
     unittest.main(verbosity=2)
diff --git a/Lib/idlelib/idle_test/test_util.py b/Lib/idlelib/idle_test/test_util.py
new file mode 100644 (file)
index 0000000..20721fe
--- /dev/null
@@ -0,0 +1,14 @@
+"""Test util, coverage 100%"""
+
+import unittest
+from idlelib import util
+
+
+class UtilTest(unittest.TestCase):
+    def test_extensions(self):
+        for extension in {'.pyi', '.py', '.pyw'}:
+            self.assertIn(extension, util.py_extensions)
+
+
+if __name__ == '__main__':
+    unittest.main(verbosity=2)
index 5ebf7089fb9abede84b41c504f4d95cac0923de0..ad3109df84096a815c89e931590ddfa973ac0e5a 100644 (file)
@@ -11,6 +11,9 @@ from tkinter.simpledialog import askstring
 
 import idlelib
 from idlelib.config import idleConf
+from idlelib.util import py_extensions
+
+py_extensions = ' '.join("*"+ext for ext in py_extensions)
 
 encoding = 'utf-8'
 if sys.platform == 'win32':
@@ -348,7 +351,7 @@ class IOBinding:
     savedialog = None
 
     filetypes = (
-        ("Python files", "*.py *.pyw", "TEXT"),
+        ("Python files", py_extensions, "TEXT"),
         ("Text files", "*.txt", "TEXT"),
         ("All files", "*"),
         )
index 74edce234838292859c4e5e17e5ac0f428b7dffd..a1b169176cba92fb18055a994d060642a2f16a88 100644 (file)
@@ -34,8 +34,8 @@ menudefs = [
    None,
    ('Prin_t Window', '<<print-window>>'),
    None,
-   ('_Close', '<<close-window>>'),
-   ('E_xit', '<<close-all-windows>>'),
+   ('_Close Window', '<<close-window>>'),
+   ('E_xit IDLE', '<<close-all-windows>>'),
    ]),
 
  ('edit', [
index d34872b4396e1e2abdc399de1a9e91e76ceadd35..8545c63e1435d46c8534c5a24d01834c392257d7 100644 (file)
@@ -179,14 +179,10 @@ class Parser:
         # Peeking back worked; look forward until _synchre no longer
         # matches.
         i = pos + 1
-        while 1:
-            m = _synchre(code, i)
-            if m:
-                s, i = m.span()
-                if not is_char_in_string(s):
-                    pos = s
-            else:
-                break
+        while m := _synchre(code, i):
+            s, i = m.span()
+            if not is_char_in_string(s):
+                pos = s
         return pos
 
     def set_lo(self, lo):
index fefa5aac1b7f58a78931339719817d22a4ae35b0..df02f2123ab02f3462ece73259c13e1ba1153be0 100644 (file)
@@ -83,6 +83,7 @@ class Query(Toplevel):
 
         if not _utest:
             self.deiconify()  # Unhide now that geometry set.
+            self.entry.focus_set()
             self.wait_window()
 
     def create_widgets(self, ok_text='OK'):  # Do not replace.
@@ -100,7 +101,6 @@ class Query(Toplevel):
                            text=self.message)
         self.entryvar = StringVar(self, self.text0)
         self.entry = Entry(frame, width=30, textvariable=self.entryvar)
-        self.entry.focus_set()
         self.error_font = Font(name='TkCaptionFont',
                                exists=True, root=self.parent)
         self.entry_error = Label(frame, text=' ', foreground='red',
index 6be034af9626b30a7d7b54085fb651b24183aad3..7e55a4a43a44bb07dd46fa1c33029f8db27109de 100644 (file)
@@ -156,11 +156,8 @@ class ReplaceDialog(SearchDialogBase):
         first = last = None
         # XXX ought to replace circular instead of top-to-bottom when wrapping
         text.undo_block_start()
-        while True:
-            res = self.engine.search_forward(text, prog, line, col,
-                                             wrap=False, ok=ok)
-            if not res:
-                break
+        while res := self.engine.search_forward(
+                text, prog, line, col, wrap=False, ok=ok):
             line, m = res
             chars = text.get("%d.0" % line, "%d.0" % (line+1))
             orig = m.group()
index dda9711dcf7aed859656b5b67887e4541b18494f..d6f1049612f71bd37d3c3a06f36ad0e2648bb308 100644 (file)
@@ -468,9 +468,7 @@ class StdInputFile(StdioFile):
         result = self._line_buffer
         self._line_buffer = ''
         if size < 0:
-            while True:
-                line = self.shell.readline()
-                if not line: break
+            while line := self.shell.readline():
                 result += line
         else:
             while len(result) < size:
diff --git a/Lib/idlelib/util.py b/Lib/idlelib/util.py
new file mode 100644 (file)
index 0000000..5480219
--- /dev/null
@@ -0,0 +1,22 @@
+"""
+Idlelib objects with no external idlelib dependencies
+which are needed in more than one idlelib module.
+
+They are included here because
+    a) they don't particularly belong elsewhere; or
+    b) because inclusion here simplifies the idlelib dependency graph.
+
+TODO:
+    * Python versions (editor and help_about),
+    * tk version and patchlevel (pyshell, help_about, maxos?, editor?),
+    * std streams (pyshell, run),
+    * warning stuff (pyshell, run).
+"""
+from os import path
+
+# .pyw is for Windows; .pyi is for stub files.
+py_extensions = ('.py', '.pyw', '.pyi')  # Order needed for open/save dialogs.
+
+if __name__ == '__main__':
+    from unittest import main
+    main('idlelib.idle_test.test_util', verbosity=2)
index fe31f437dac2ab0abb624c328c592ea349157ef6..f3828b10e1c1ba82132cedf2c3c22df5c2af861a 100644 (file)
@@ -1209,10 +1209,15 @@ class _NamespacePath:
     using path_finder.  For top-level modules, the parent module's path
     is sys.path."""
 
+    # When invalidate_caches() is called, this epoch is incremented
+    # https://bugs.python.org/issue45703
+    _epoch = 0
+
     def __init__(self, name, path, path_finder):
         self._name = name
         self._path = path
         self._last_parent_path = tuple(self._get_parent_path())
+        self._last_epoch = self._epoch
         self._path_finder = path_finder
 
     def _find_parent_path_names(self):
@@ -1232,7 +1237,7 @@ class _NamespacePath:
     def _recalculate(self):
         # If the parent's path has changed, recalculate _path
         parent_path = tuple(self._get_parent_path()) # Make a copy
-        if parent_path != self._last_parent_path:
+        if parent_path != self._last_parent_path or self._epoch != self._last_epoch:
             spec = self._path_finder(self._name, parent_path)
             # Note that no changes are made if a loader is returned, but we
             #  do remember the new parent path
@@ -1240,6 +1245,7 @@ class _NamespacePath:
                 if spec.submodule_search_locations:
                     self._path = spec.submodule_search_locations
             self._last_parent_path = parent_path     # Save the copy
+            self._last_epoch = self._epoch
         return self._path
 
     def __iter__(self):
@@ -1320,6 +1326,9 @@ class PathFinder:
                 del sys.path_importer_cache[name]
             elif hasattr(finder, 'invalidate_caches'):
                 finder.invalidate_caches()
+        # Also invalidate the caches of _NamespacePaths
+        # https://bugs.python.org/issue45703
+        _NamespacePath._epoch += 1
 
     @classmethod
     def _path_hooks(cls, path):
index 594986ce23efab31b0c307e8497c64423bca46b6..647fd3e4dbf8baeca76bc3b1fe2ebeb3387cb1c4 100644 (file)
@@ -45,12 +45,21 @@ class EntryPoint(
     See `the packaging docs on entry points
     <https://packaging.python.org/specifications/entry-points/>`_
     for more information.
+
+    >>> ep = EntryPoint(
+    ...     name=None, group=None, value='package.module:attr [extra1, extra2]')
+    >>> ep.module
+    'package.module'
+    >>> ep.attr
+    'attr'
+    >>> ep.extras
+    ['extra1', 'extra2']
     """
 
     pattern = re.compile(
         r'(?P<module>[\w.]+)\s*'
-        r'(:\s*(?P<attr>[\w.]+))?\s*'
-        r'(?P<extras>\[.*\])?\s*$'
+        r'(:\s*(?P<attr>[\w.]+)\s*)?'
+        r'((?P<extras>\[.*\])\s*)?$'
         )
     """
     A regular expression describing the syntax for an entry point,
@@ -91,7 +100,7 @@ class EntryPoint(
     @property
     def extras(self):
         match = self.pattern.match(self.value)
-        return list(re.finditer(r'\w+', match.group('extras') or ''))
+        return re.findall(r'\w+', match.group('extras') or '')
 
     @classmethod
     def _from_config(cls, config):
@@ -308,7 +317,7 @@ class Distribution:
 
     def _read_egg_info_reqs(self):
         source = self.read_text('requires.txt')
-        return source and self._deps_from_requires_text(source)
+        return None if source is None else self._deps_from_requires_text(source)
 
     @classmethod
     def _deps_from_requires_text(cls, source):
index 10b5d14eb37bf5c3d80f212ff6e5761ad31001d1..6f91435541b8a1bb378a0d52535555e703c6357b 100644 (file)
@@ -2379,9 +2379,9 @@ def _signature_from_callable(obj, *,
                     pass
                 else:
                     if text_sig:
-                        # If 'obj' class has a __text_signature__ attribute:
+                        # If 'base' class has a __text_signature__ attribute:
                         # return a signature based on it
-                        return _signature_fromstr(sigcls, obj, text_sig)
+                        return _signature_fromstr(sigcls, base, text_sig)
 
             # No '__text_signature__' was found for the 'obj' class.
             # Last option is to check if its '__init__' is
index 2a6ef2ef5240a2b1aa9eecb5162368d5649b624c..729023df0284e15ad8d7ac9f30cf7ed8d42db272 100644 (file)
@@ -720,8 +720,8 @@ class WildcardPattern(BasePattern):
                         r[self.name] = nodes[:count]
                     yield count, r
             except RuntimeError:
-                # We fall back to the iterative pattern matching scheme if the recursive
-                # scheme hits the recursion limit.
+                # Fall back to the iterative pattern matching scheme if the
+                # recursive scheme hits the recursion limit (RecursionError).
                 for count, r in self._iterative_matches(nodes):
                     if self.name:
                         r[self.name] = nodes[:count]
index 71715ef29dc488a6d96725d3b450970fb75127f9..acc62ed4f1a44cda268cf20f00bfece4b878e6a0 100644 (file)
@@ -1,5 +1,5 @@
-# This file is used to verify that 2to3 falls back to a slower, iterative pattern matching
-# scheme in the event that the faster recursive system fails due to infinite recursion.
+# Verify that 2to3 falls back from the recursive pattern matching scheme to a
+# slower, iterative scheme in the event of a RecursionError.
 from ctypes import *
 STRING = c_char_p
 
index c0507cf3fbcbfe0270d39ad376761988af470e68..a265941490d5dc7bffd9837af66a54d45c201c0f 100644 (file)
@@ -6,8 +6,10 @@ running time.
 # Author: Collin Winter
 
 # Python imports
-import unittest
+import os.path
+import sys
 import test.support
+import unittest
 
 # Local imports
 from . import support
@@ -19,9 +21,22 @@ class Test_all(support.TestCase):
     def setUp(self):
         self.refactor = support.get_refactorer()
 
+    def refactor_file(self, filepath):
+        if test.support.verbose:
+            print(f"Refactor file: {filepath}")
+        if os.path.basename(filepath) == 'infinite_recursion.py':
+            # bpo-46542: Processing infinite_recursion.py can crash Python
+            # if Python is built in debug mode: lower the recursion limit
+            # to prevent a crash.
+            with test.support.infinite_recursion(150):
+                self.refactor.refactor_file(filepath)
+        else:
+            self.refactor.refactor_file(filepath)
+
     def test_all_project_files(self):
         for filepath in support.all_project_files():
-            self.refactor.refactor_file(filepath)
+            with self.subTest(filepath=filepath):
+                self.refactor_file(filepath)
 
 if __name__ == '__main__':
     unittest.main()
index 034b5039cf00c4b143d5f6c9c441a749c03b2447..3884872437c47753474052a0a54cf7ea6548cc14 100644 (file)
@@ -20,6 +20,7 @@ import shutil
 import subprocess
 import sys
 import tempfile
+import test.support
 import unittest
 
 # Local imports
@@ -582,25 +583,31 @@ class TestParserIdempotency(support.TestCase):
 
     """A cut-down version of pytree_idempotency.py."""
 
+    def parse_file(self, filepath):
+        if test.support.verbose:
+            print(f"Parse file: {filepath}")
+        with open(filepath, "rb") as fp:
+            encoding = tokenize.detect_encoding(fp.readline)[0]
+        self.assertIsNotNone(encoding,
+                             "can't detect encoding for %s" % filepath)
+        with open(filepath, "r", encoding=encoding) as fp:
+            source = fp.read()
+        try:
+            tree = driver.parse_string(source)
+        except ParseError:
+            try:
+                tree = driver_no_print_statement.parse_string(source)
+            except ParseError as err:
+                self.fail('ParseError on file %s (%s)' % (filepath, err))
+        new = str(tree)
+        if new != source:
+            print(diff_texts(source, new, filepath))
+            self.fail("Idempotency failed: %s" % filepath)
+
     def test_all_project_files(self):
         for filepath in support.all_project_files():
-            with open(filepath, "rb") as fp:
-                encoding = tokenize.detect_encoding(fp.readline)[0]
-            self.assertIsNotNone(encoding,
-                                 "can't detect encoding for %s" % filepath)
-            with open(filepath, "r", encoding=encoding) as fp:
-                source = fp.read()
-            try:
-                tree = driver.parse_string(source)
-            except ParseError:
-                try:
-                    tree = driver_no_print_statement.parse_string(source)
-                except ParseError as err:
-                    self.fail('ParseError on file %s (%s)' % (filepath, err))
-            new = str(tree)
-            if new != source:
-                print(diff_texts(source, new, filepath))
-                self.fail("Idempotency failed: %s" % filepath)
+            with self.subTest(filepath=filepath):
+                self.parse_file(filepath)
 
     def test_extended_unpacking(self):
         driver.parse_string("a, *b, c = x\n")
index d36e1664cdcc8267b93a834a9e3b9b81456adf19..58ace01b41ab1de0f92c0a34ea43ed19b0993e8d 100644 (file)
@@ -135,25 +135,23 @@ class MimeTypes:
                 type = 'text/plain'
             return type, None           # never compressed, so encoding is None
         base, ext = posixpath.splitext(url)
-        while ext in self.suffix_map:
-            base, ext = posixpath.splitext(base + self.suffix_map[ext])
+        while (ext_lower := ext.lower()) in self.suffix_map:
+            base, ext = posixpath.splitext(base + self.suffix_map[ext_lower])
+        # encodings_map is case sensitive
         if ext in self.encodings_map:
             encoding = self.encodings_map[ext]
             base, ext = posixpath.splitext(base)
         else:
             encoding = None
+        ext = ext.lower()
         types_map = self.types_map[True]
         if ext in types_map:
             return types_map[ext], encoding
-        elif ext.lower() in types_map:
-            return types_map[ext.lower()], encoding
         elif strict:
             return None, encoding
         types_map = self.types_map[False]
         if ext in types_map:
             return types_map[ext], encoding
-        elif ext.lower() in types_map:
-            return types_map[ext.lower()], encoding
         else:
             return None, encoding
 
index 943211158ac41e417496bdccbbcfb8a113504ae0..7ab50b4845d3e6ffae5b73133c0e1ef255affb69 100755 (executable)
@@ -1493,6 +1493,9 @@ class Pdb(bdb.Bdb, cmd.Cmd):
                 self.error('No help for %r; please do not run Python with -OO '
                            'if you need command help' % arg)
                 return
+            if command.__doc__ is None:
+                self.error('No help for %r; __doc__ string missing' % arg)
+                return
             self.message(command.__doc__.rstrip())
 
     do_h = do_help
index 67a51977cfe74affcbba8d8fb0b91059f41ca9e9..0e63c31f1b4fe4493619e08d57783a169f27259f 100644 (file)
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# Autogenerated by Sphinx on Thu Jan 13 21:46:32 2022
+# Autogenerated by Sphinx on Tue Mar 15 21:44:32 2022
 topics = {'assert': 'The "assert" statement\n'
            '**********************\n'
            '\n'
@@ -5408,19 +5408,19 @@ topics = {'assert': 'The "assert" statement\n'
                   'with an\n'
                   '*alignment* type of "\'=\'".\n'
                   '\n'
-                  'The *precision* is a decimal number indicating how many '
+                  'The *precision* is a decimal integer indicating how many '
                   'digits should\n'
-                  'be displayed after the decimal point for a floating point '
-                  'value\n'
-                  'formatted with "\'f\'" and "\'F\'", or before and after the '
-                  'decimal point\n'
-                  'for a floating point value formatted with "\'g\'" or '
-                  '"\'G\'".  For non-\n'
-                  'number types the field indicates the maximum field size - '
-                  'in other\n'
-                  'words, how many characters will be used from the field '
-                  'content. The\n'
-                  '*precision* is not allowed for integer values.\n'
+                  'be displayed after the decimal point for presentation types '
+                  '"\'f\'" and\n'
+                  '"\'F\'", or before and after the decimal point for '
+                  'presentation types\n'
+                  '"\'g\'" or "\'G\'".  For string presentation types the '
+                  'field indicates the\n'
+                  'maximum field size - in other words, how many characters '
+                  'will be used\n'
+                  'from the field content.  The *precision* is not allowed for '
+                  'integer\n'
+                  'presentation types.\n'
                   '\n'
                   'Finally, the *type* determines how the data should be '
                   'presented.\n'
@@ -7515,12 +7515,12 @@ topics = {'assert': 'The "assert" statement\n'
           '\n'
           '   raise_stmt ::= "raise" [expression ["from" expression]]\n'
           '\n'
-          'If no expressions are present, "raise" re-raises the last '
-          'exception\n'
-          'that was active in the current scope.  If no exception is active '
-          'in\n'
-          'the current scope, a "RuntimeError" exception is raised indicating\n'
-          'that this is an error.\n'
+          'If no expressions are present, "raise" re-raises the exception that '
+          'is\n'
+          'currently being handled, which is also known as the *active\n'
+          'exception*. If there isn’t currently an active exception, a\n'
+          '"RuntimeError" exception is raised indicating that this is an '
+          'error.\n'
           '\n'
           'Otherwise, "raise" evaluates the first expression as the exception\n'
           'object.  It must be either a subclass or an instance of\n'
@@ -7575,11 +7575,14 @@ topics = {'assert': 'The "assert" statement\n'
           '     File "<stdin>", line 4, in <module>\n'
           '   RuntimeError: Something bad happened\n'
           '\n'
-          'A similar mechanism works implicitly if an exception is raised '
-          'inside\n'
-          'an exception handler or a "finally" clause: the previous exception '
-          'is\n'
-          'then attached as the new exception’s "__context__" attribute:\n'
+          'A similar mechanism works implicitly if a new exception is raised '
+          'when\n'
+          'an exception is already being handled.  An exception may be '
+          'handled\n'
+          'when an "except" or "finally" clause, or a "with" statement, is '
+          'used.\n'
+          'The previous exception is then attached as the new exception’s\n'
+          '"__context__" attribute:\n'
           '\n'
           '   >>> try:\n'
           '   ...     print(1 / 0)\n'
@@ -9079,14 +9082,14 @@ topics = {'assert': 'The "assert" statement\n'
                  '\n'
                  'Whenever a class inherits from another class, '
                  '"__init_subclass__()" is\n'
-                 'called on that class. This way, it is possible to write '
-                 'classes which\n'
-                 'change the behavior of subclasses. This is closely related '
-                 'to class\n'
-                 'decorators, but where class decorators only affect the '
-                 'specific class\n'
-                 'they’re applied to, "__init_subclass__" solely applies to '
-                 'future\n'
+                 'called on the parent class. This way, it is possible to '
+                 'write classes\n'
+                 'which change the behavior of subclasses. This is closely '
+                 'related to\n'
+                 'class decorators, but where class decorators only affect the '
+                 'specific\n'
+                 'class they’re applied to, "__init_subclass__" solely applies '
+                 'to future\n'
                  'subclasses of the class defining the method.\n'
                  '\n'
                  'classmethod object.__init_subclass__(cls)\n'
@@ -11393,67 +11396,86 @@ topics = {'assert': 'The "assert" statement\n'
  'subscriptions': 'Subscriptions\n'
                   '*************\n'
                   '\n'
-                  'Subscription of a sequence (string, tuple or list) or '
-                  'mapping\n'
-                  '(dictionary) object usually selects an item from the '
-                  'collection:\n'
+                  'The subscription of an instance of a container class will '
+                  'generally\n'
+                  'select an element from the container. The subscription of a '
+                  '*generic\n'
+                  'class* will generally return a GenericAlias object.\n'
                   '\n'
                   '   subscription ::= primary "[" expression_list "]"\n'
                   '\n'
+                  'When an object is subscripted, the interpreter will '
+                  'evaluate the\n'
+                  'primary and the expression list.\n'
+                  '\n'
                   'The primary must evaluate to an object that supports '
-                  'subscription\n'
-                  '(lists or dictionaries for example).  User-defined objects '
-                  'can support\n'
-                  'subscription by defining a "__getitem__()" method.\n'
+                  'subscription. An\n'
+                  'object may support subscription through defining one or '
+                  'both of\n'
+                  '"__getitem__()" and "__class_getitem__()". When the primary '
+                  'is\n'
+                  'subscripted, the evaluated result of the expression list '
+                  'will be\n'
+                  'passed to one of these methods. For more details on when\n'
+                  '"__class_getitem__" is called instead of "__getitem__", '
+                  'see\n'
+                  '__class_getitem__ versus __getitem__.\n'
+                  '\n'
+                  'If the expression list contains at least one comma, it will '
+                  'evaluate\n'
+                  'to a "tuple" containing the items of the expression list. '
+                  'Otherwise,\n'
+                  'the expression list will evaluate to the value of the '
+                  'list’s sole\n'
+                  'member.\n'
                   '\n'
                   'For built-in objects, there are two types of objects that '
                   'support\n'
-                  'subscription:\n'
+                  'subscription via "__getitem__()":\n'
                   '\n'
-                  'If the primary is a mapping, the expression list must '
-                  'evaluate to an\n'
-                  'object whose value is one of the keys of the mapping, and '
+                  '1. Mappings. If the primary is a *mapping*, the expression '
+                  'list must\n'
+                  '   evaluate to an object whose value is one of the keys of '
                   'the\n'
-                  'subscription selects the value in the mapping that '
-                  'corresponds to that\n'
-                  'key.  (The expression list is a tuple except if it has '
-                  'exactly one\n'
-                  'item.)\n'
-                  '\n'
-                  'If the primary is a sequence, the expression list must '
-                  'evaluate to an\n'
-                  'integer or a slice (as discussed in the following '
-                  'section).\n'
+                  '   mapping, and the subscription selects the value in the '
+                  'mapping that\n'
+                  '   corresponds to that key. An example of a builtin mapping '
+                  'class is\n'
+                  '   the "dict" class.\n'
+                  '\n'
+                  '2. Sequences. If the primary is a *sequence*, the '
+                  'expression list must\n'
+                  '   evaluate to an "int" or a "slice" (as discussed in the '
+                  'following\n'
+                  '   section). Examples of builtin sequence classes include '
+                  'the "str",\n'
+                  '   "list" and "tuple" classes.\n'
                   '\n'
                   'The formal syntax makes no special provision for negative '
                   'indices in\n'
-                  'sequences; however, built-in sequences all provide a '
+                  '*sequences*. However, built-in sequences all provide a '
                   '"__getitem__()"\n'
                   'method that interprets negative indices by adding the '
                   'length of the\n'
-                  'sequence to the index (so that "x[-1]" selects the last '
-                  'item of "x").\n'
-                  'The resulting value must be a nonnegative integer less than '
-                  'the number\n'
-                  'of items in the sequence, and the subscription selects the '
-                  'item whose\n'
-                  'index is that value (counting from zero). Since the support '
-                  'for\n'
-                  'negative indices and slicing occurs in the object’s '
-                  '"__getitem__()"\n'
-                  'method, subclasses overriding this method will need to '
-                  'explicitly add\n'
-                  'that support.\n'
-                  '\n'
-                  'A string’s items are characters.  A character is not a '
-                  'separate data\n'
-                  'type but a string of exactly one character.\n'
-                  '\n'
-                  'Subscription of certain *classes* or *types* creates a '
-                  'generic alias.\n'
-                  'In this case, user-defined classes can support subscription '
-                  'by\n'
-                  'providing a "__class_getitem__()" classmethod.\n',
+                  'sequence to the index so that, for example, "x[-1]" selects '
+                  'the last\n'
+                  'item of "x". The resulting value must be a nonnegative '
+                  'integer less\n'
+                  'than the number of items in the sequence, and the '
+                  'subscription selects\n'
+                  'the item whose index is that value (counting from zero). '
+                  'Since the\n'
+                  'support for negative indices and slicing occurs in the '
+                  'object’s\n'
+                  '"__getitem__()" method, subclasses overriding this method '
+                  'will need to\n'
+                  'explicitly add that support.\n'
+                  '\n'
+                  'A "string" is a special kind of sequence whose items are '
+                  '*characters*.\n'
+                  'A character is not a separate data type but a string of '
+                  'exactly one\n'
+                  'character.\n',
  'truth': 'Truth Value Testing\n'
           '*******************\n'
           '\n'
index 752900c58890c98888439075bc4f2bea2e457444..c048cdf9b2cbd53dbc6a72cbe5239c1a15cd04c3 100644 (file)
@@ -656,6 +656,7 @@ def _rmtree_safe_fd(topfd, path, onerror):
         if is_dir:
             try:
                 dirfd = os.open(entry.name, os.O_RDONLY, dir_fd=topfd)
+                dirfd_closed = False
             except OSError:
                 onerror(os.open, fullname, sys.exc_info())
             else:
@@ -663,6 +664,8 @@ def _rmtree_safe_fd(topfd, path, onerror):
                     if os.path.samestat(orig_st, os.fstat(dirfd)):
                         _rmtree_safe_fd(dirfd, fullname, onerror)
                         try:
+                            os.close(dirfd)
+                            dirfd_closed = True
                             os.rmdir(entry.name, dir_fd=topfd)
                         except OSError:
                             onerror(os.rmdir, fullname, sys.exc_info())
@@ -676,7 +679,8 @@ def _rmtree_safe_fd(topfd, path, onerror):
                         except OSError:
                             onerror(os.path.islink, fullname, sys.exc_info())
                 finally:
-                    os.close(dirfd)
+                    if not dirfd_closed:
+                        os.close(dirfd)
         else:
             try:
                 os.unlink(entry.name, dir_fd=topfd)
@@ -719,6 +723,7 @@ def rmtree(path, ignore_errors=False, onerror=None):
             return
         try:
             fd = os.open(path, os.O_RDONLY)
+            fd_closed = False
         except Exception:
             onerror(os.open, path, sys.exc_info())
             return
@@ -726,6 +731,8 @@ def rmtree(path, ignore_errors=False, onerror=None):
             if os.path.samestat(orig_st, os.fstat(fd)):
                 _rmtree_safe_fd(fd, path, onerror)
                 try:
+                    os.close(fd)
+                    fd_closed = True
                     os.rmdir(path)
                 except OSError:
                     onerror(os.rmdir, path, sys.exc_info())
@@ -736,7 +743,8 @@ def rmtree(path, ignore_errors=False, onerror=None):
                 except OSError:
                     onerror(os.path.islink, path, sys.exc_info())
         finally:
-            os.close(fd)
+            if not fd_closed:
+                os.close(fd)
     else:
         try:
             if _rmtree_islink(path):
index 1bceefe8e69d9c9c2c8c4911e8594ac3d14675ce..8fc8b4c3abb5a8d2ce3ed2ddc8cc0cbe0841e308 100644 (file)
@@ -44,22 +44,6 @@ def func_returnlonglong():
 def func_raiseexception():
     5/0
 
-def func_isstring(v):
-    return type(v) is str
-def func_isint(v):
-    return type(v) is int
-def func_isfloat(v):
-    return type(v) is float
-def func_isnone(v):
-    return type(v) is type(None)
-def func_isblob(v):
-    return isinstance(v, (bytes, memoryview))
-def func_islonglong(v):
-    return isinstance(v, int) and v >= 1<<31
-
-def func(*args):
-    return len(args)
-
 class AggrNoStep:
     def __init__(self):
         pass
@@ -160,15 +144,13 @@ class FunctionTests(unittest.TestCase):
         self.con.create_function("returnnull", 0, func_returnnull)
         self.con.create_function("returnblob", 0, func_returnblob)
         self.con.create_function("returnlonglong", 0, func_returnlonglong)
+        self.con.create_function("returnnan", 0, lambda: float("nan"))
+        self.con.create_function("returntoolargeint", 0, lambda: 1 << 65)
         self.con.create_function("raiseexception", 0, func_raiseexception)
 
-        self.con.create_function("isstring", 1, func_isstring)
-        self.con.create_function("isint", 1, func_isint)
-        self.con.create_function("isfloat", 1, func_isfloat)
-        self.con.create_function("isnone", 1, func_isnone)
-        self.con.create_function("isblob", 1, func_isblob)
-        self.con.create_function("islonglong", 1, func_islonglong)
-        self.con.create_function("spam", -1, func)
+        self.con.create_function("isblob", 1, lambda x: isinstance(x, bytes))
+        self.con.create_function("isnone", 1, lambda x: x is None)
+        self.con.create_function("spam", -1, lambda *x: len(x))
         self.con.execute("create table test(t text)")
 
     def tearDown(self):
@@ -245,6 +227,16 @@ class FunctionTests(unittest.TestCase):
         val = cur.fetchone()[0]
         self.assertEqual(val, 1<<31)
 
+    def CheckFuncReturnNaN(self):
+        cur = self.con.cursor()
+        cur.execute("select returnnan()")
+        self.assertIsNone(cur.fetchone()[0])
+
+    def CheckFuncReturnTooLargeInt(self):
+        cur = self.con.cursor()
+        with self.assertRaises(sqlite.OperationalError):
+            self.con.execute("select returntoolargeint()")
+
     def CheckFuncException(self):
         cur = self.con.cursor()
         with self.assertRaises(sqlite.OperationalError) as cm:
@@ -252,50 +244,62 @@ class FunctionTests(unittest.TestCase):
             cur.fetchone()
         self.assertEqual(str(cm.exception), 'user-defined function raised exception')
 
-    def CheckParamString(self):
-        cur = self.con.cursor()
-        for text in ["foo", str()]:
-            with self.subTest(text=text):
-                cur.execute("select isstring(?)", (text,))
-                val = cur.fetchone()[0]
-                self.assertEqual(val, 1)
-
-    def CheckParamInt(self):
-        cur = self.con.cursor()
-        cur.execute("select isint(?)", (42,))
-        val = cur.fetchone()[0]
-        self.assertEqual(val, 1)
-
-    def CheckParamFloat(self):
-        cur = self.con.cursor()
-        cur.execute("select isfloat(?)", (3.14,))
-        val = cur.fetchone()[0]
-        self.assertEqual(val, 1)
-
-    def CheckParamNone(self):
-        cur = self.con.cursor()
-        cur.execute("select isnone(?)", (None,))
-        val = cur.fetchone()[0]
-        self.assertEqual(val, 1)
-
-    def CheckParamBlob(self):
-        cur = self.con.cursor()
-        cur.execute("select isblob(?)", (memoryview(b"blob"),))
-        val = cur.fetchone()[0]
-        self.assertEqual(val, 1)
-
-    def CheckParamLongLong(self):
-        cur = self.con.cursor()
-        cur.execute("select islonglong(?)", (1<<42,))
-        val = cur.fetchone()[0]
-        self.assertEqual(val, 1)
-
     def CheckAnyArguments(self):
         cur = self.con.cursor()
         cur.execute("select spam(?, ?)", (1, 2))
         val = cur.fetchone()[0]
         self.assertEqual(val, 2)
 
+    def CheckEmptyBlob(self):
+        cur = self.con.execute("select isblob(x'')")
+        self.assertTrue(cur.fetchone()[0])
+
+    def CheckNaNFloat(self):
+        cur = self.con.execute("select isnone(?)", (float("nan"),))
+        # SQLite has no concept of nan; it is converted to NULL
+        self.assertTrue(cur.fetchone()[0])
+
+    def CheckTooLargeInt(self):
+        err = "Python int too large to convert to SQLite INTEGER"
+        self.assertRaisesRegex(OverflowError, err, self.con.execute,
+                               "select spam(?)", (1 << 65,))
+
+    def CheckNonContiguousBlob(self):
+        self.assertRaisesRegex(ValueError, "could not convert BLOB to buffer",
+                               self.con.execute, "select spam(?)",
+                               (memoryview(b"blob")[::2],))
+
+    def CheckParamSurrogates(self):
+        self.assertRaisesRegex(UnicodeEncodeError, "surrogates not allowed",
+                               self.con.execute, "select spam(?)",
+                               ("\ud803\ude6d",))
+
+    def CheckFuncParams(self):
+        results = []
+        def append_result(arg):
+            results.append((arg, type(arg)))
+        self.con.create_function("test_params", 1, append_result)
+
+        dataset = [
+            (42, int),
+            (-1, int),
+            (1234567890123456789, int),
+            (4611686018427387905, int),  # 63-bit int with non-zero low bits
+            (3.14, float),
+            (float('inf'), float),
+            ("text", str),
+            ("1\x002", str),
+            ("\u02e2q\u02e1\u2071\u1d57\u1d49", str),
+            (b"blob", bytes),
+            (bytearray(range(2)), bytes),
+            (memoryview(b"blob"), bytes),
+            (None, type(None)),
+        ]
+        for val, _ in dataset:
+            cur = self.con.execute("select test_params(?)", (val,))
+            cur.fetchone()
+        self.assertEqual(dataset, results)
+
     # Regarding deterministic functions:
     #
     # Between 3.8.3 and 3.15.0, deterministic functions were only used to
index 043a4ab5a52a6f847c06aedfd3e4feb1efa8330f..9438b08ae396ed1a3a9a1e51d35b5e4733cdfee8 100755 (executable)
@@ -887,15 +887,24 @@ class TarInfo(object):
         # Test number fields for values that exceed the field limit or values
         # that like to be stored as float.
         for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)):
-            if name in pax_headers:
-                # The pax header has priority. Avoid overflow.
-                info[name] = 0
-                continue
+            needs_pax = False
 
             val = info[name]
-            if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float):
-                pax_headers[name] = str(val)
+            val_is_float = isinstance(val, float)
+            val_int = round(val) if val_is_float else val
+            if not 0 <= val_int < 8 ** (digits - 1):
+                # Avoid overflow.
                 info[name] = 0
+                needs_pax = True
+            elif val_is_float:
+                # Put rounded value in ustar header, and full
+                # precision value in pax header.
+                info[name] = val_int
+                needs_pax = True
+
+            # The existing pax header has priority.
+            if needs_pax and name not in pax_headers:
+                pax_headers[name] = str(val)
 
         # Create a pax extended header if necessary.
         if pax_headers:
@@ -1785,7 +1794,7 @@ class TarFile(object):
            than once in the archive, its last occurrence is assumed to be the
            most up-to-date version.
         """
-        tarinfo = self._getmember(name)
+        tarinfo = self._getmember(name.rstrip('/'))
         if tarinfo is None:
             raise KeyError("filename %r not found" % name)
         return tarinfo
index 3ae0cb976863d1bb1c29256e64f2ec0b79bcf2e4..bcbf5676b2e3a3d2dab4d70cbfb76bbb91385f89 100644 (file)
@@ -69,6 +69,12 @@ except ImportError:
     msvcrt = None
 
 
+if support.check_sanitizer(address=True):
+    # bpo-45200: Skip multiprocessing tests if Python is built with ASAN to
+    # work around a libasan race condition: dead lock in pthread_create().
+    raise unittest.SkipTest("libasan has a pthread_create() dead lock")
+
+
 def latin(s):
     return s.encode('latin')
 
diff --git a/Lib/test/ann_module7.py b/Lib/test/ann_module7.py
new file mode 100644 (file)
index 0000000..8f890cd
--- /dev/null
@@ -0,0 +1,11 @@
+# Tests class have ``__text_signature__``
+
+from __future__ import annotations
+
+DEFAULT_BUFFER_SIZE = 8192
+
+class BufferedReader(object):
+    """BufferedReader(raw, buffer_size=DEFAULT_BUFFER_SIZE)\n--\n\n
+    Create a new buffered reader using the given readable raw IO object.
+    """
+    pass
index 85241526739cb7bb9f3286c70eae4feb29ec6628..361d5e9ba7e0accd5a7a6594d9de1603bf7fe1e1 100644 (file)
@@ -1861,8 +1861,6 @@ class TestDate(HarmlessMixedComparison, unittest.TestCase):
 
     def test_fromisoformat_fails_typeerror(self):
         # Test that fromisoformat fails when passed the wrong type
-        import io
-
         bad_types = [b'2009-03-01', None, io.StringIO('2009-03-01')]
         for bad_type in bad_types:
             with self.assertRaises(TypeError):
@@ -3985,8 +3983,6 @@ class TestTimeTZ(TestTime, TZInfoBase, unittest.TestCase):
 
     def test_fromisoformat_fails_typeerror(self):
         # Test the fromisoformat fails when passed the wrong type
-        import io
-
         bad_types = [b'12:30:45', None, io.StringIO('12:30:45')]
 
         for bad_type in bad_types:
index 96fd9fef76b10899807d3724c97335f35a03743a..efa0be3861d79f44b006b876a6408e42a09dc8fd 100644 (file)
Binary files a/Lib/test/imghdrdata/python.gif and b/Lib/test/imghdrdata/python.gif differ
index cc228fb3b54c9449fcb0a86b8ae12b882d68d09e..fd1b49ecc8af4f374612afb8fe5a1a14eeaff4f3 100644 (file)
@@ -719,6 +719,48 @@ def collect_windows(info_add):
     except (ImportError, AttributeError):
         pass
 
+    import subprocess
+    try:
+        # When wmic.exe output is redirected to a pipe,
+        # it uses the OEM code page
+        proc = subprocess.Popen(["wmic", "os", "get", "Caption,Version", "/value"],
+                                stdout=subprocess.PIPE,
+                                stderr=subprocess.PIPE,
+                                encoding="oem",
+                                text=True)
+        output, stderr = proc.communicate()
+        if proc.returncode:
+            output = ""
+    except OSError:
+        pass
+    else:
+        for line in output.splitlines():
+            line = line.strip()
+            if line.startswith('Caption='):
+                line = line.removeprefix('Caption=').strip()
+                if line:
+                    info_add('windows.version_caption', line)
+            elif line.startswith('Version='):
+                line = line.removeprefix('Version=').strip()
+                if line:
+                    info_add('windows.version', line)
+
+    try:
+        proc = subprocess.Popen(["ver"], shell=True,
+                                stdout=subprocess.PIPE,
+                                stderr=subprocess.PIPE,
+                                text=True)
+        output = proc.communicate()[0]
+        if proc.returncode:
+            output = ""
+    except OSError:
+        return
+    else:
+        output = output.strip()
+        line = output.splitlines()[0]
+        if line:
+            info_add('windows.ver', line)
+
 
 def collect_fips(info_add):
     try:
index 4ced1300cbfabb7859be5e1f01a86c2c9ae55390..86ac8f096695fb2fe3c6d3c1b98404abcffcda77 100644 (file)
@@ -54,7 +54,7 @@ __all__ = [
     "requires_IEEE_754", "skip_unless_xattr", "requires_zlib",
     "anticipate_failure", "load_package_tests", "detect_api_mismatch",
     "check__all__", "skip_if_buggy_ucrt_strfptime",
-    "ignore_warnings",
+    "ignore_warnings", "check_sanitizer", "skip_if_sanitizer",
     # sys
     "is_jython", "is_android", "check_impl_detail", "unix_shell",
     "setswitchinterval",
@@ -644,6 +644,41 @@ def requires_mac_ver(*min_version):
     return decorator
 
 
+def check_sanitizer(*, address=False, memory=False, ub=False):
+    """Returns True if Python is compiled with sanitizer support"""
+    if not (address or memory or ub):
+        raise ValueError('At least one of address, memory, or ub must be True')
+
+
+    _cflags = sysconfig.get_config_var('CFLAGS') or ''
+    _config_args = sysconfig.get_config_var('CONFIG_ARGS') or ''
+    memory_sanitizer = (
+        '-fsanitize=memory' in _cflags or
+        '--with-memory-sanitizer' in _config_args
+    )
+    address_sanitizer = (
+        '-fsanitize=address' in _cflags or
+        '--with-memory-sanitizer' in _config_args
+    )
+    ub_sanitizer = (
+        '-fsanitize=undefined' in _cflags or
+        '--with-undefined-behavior-sanitizer' in _config_args
+    )
+    return (
+        (memory and memory_sanitizer) or
+        (address and address_sanitizer) or
+        (ub and ub_sanitizer)
+    )
+
+
+def skip_if_sanitizer(reason=None, *, address=False, memory=False, ub=False):
+    """Decorator raising SkipTest if running with a sanitizer active."""
+    if not reason:
+        reason = 'not working with sanitizers active'
+    skip = check_sanitizer(address=address, memory=memory, ub=ub)
+    return unittest.skipIf(skip, reason)
+
+
 def system_must_validate_cert(f):
     """Skip the test on TLS certificate validation failures."""
     @functools.wraps(f)
@@ -1013,6 +1048,16 @@ def create_empty_file(filename):
     fd = os.open(filename, os.O_WRONLY | os.O_CREAT | os.O_TRUNC)
     os.close(fd)
 
+@contextlib.contextmanager
+def open_dir_fd(path):
+    """Open a file descriptor to a directory."""
+    assert os.path.isdir(path)
+    dir_fd = os.open(path, os.O_RDONLY)
+    try:
+        yield dir_fd
+    finally:
+        os.close(dir_fd)
+
 def sortdict(dict):
     "Like repr(dict), but in sorted order."
     items = sorted(dict.items())
@@ -2345,9 +2390,6 @@ class PythonSymlink:
 
         self._platform_specific()
 
-    def _platform_specific(self):
-        pass
-
     if sys.platform == "win32":
         def _platform_specific(self):
             import _winapi
@@ -2374,6 +2416,9 @@ class PythonSymlink:
             self._env["PYTHONHOME"] = os.path.dirname(self.real)
             if sysconfig.is_python_build(True):
                 self._env["PYTHONPATH"] = os.path.dirname(os.__file__)
+    else:
+        def _platform_specific(self):
+            pass
 
     def __enter__(self):
         os.symlink(self.real, self.link)
index 0ba243ee4e74e45c53121555db0018762940c915..7e1f80f25125656e75f67c941e2f70ad5e46c410 100644 (file)
@@ -4,6 +4,13 @@ import os
 import sys
 
 
+if support.check_sanitizer(address=True, memory=True):
+    # bpo-46633: test___all__ is skipped because importing some modules
+    # directly can trigger known problems with ASAN (like tk or crypt).
+    raise unittest.SkipTest("workaround ASAN build issues on loading tests "
+                            "like tk or crypt")
+
+
 class NoAll(RuntimeError):
     pass
 
index 043a9cf93f771fc8b03961cbed02973fbb98e75c..5c86583ce10a41c18026878709b165d757c39082 100644 (file)
@@ -101,8 +101,8 @@ def stderr_to_parser_error(parse_args, *args, **kwargs):
                 if getattr(result, key) is sys.stderr:
                     setattr(result, key, old_stderr)
             return result
-        except SystemExit:
-            code = sys.exc_info()[1].code
+        except SystemExit as e:
+            code = e.code
             stdout = sys.stdout.getvalue()
             stderr = sys.stderr.getvalue()
             raise ArgumentParserError(
@@ -1828,8 +1828,7 @@ class TestActionUserDefined(ParserTestCase):
                     raise AssertionError('value: %s' % value)
                 assert expected_ns == namespace, ('expected %s, got %s' %
                                                   (expected_ns, namespace))
-            except AssertionError:
-                e = sys.exc_info()[1]
+            except AssertionError as e:
                 raise ArgumentParserError('opt_action failed: %s' % e)
             setattr(namespace, 'spam', value)
 
@@ -1854,8 +1853,7 @@ class TestActionUserDefined(ParserTestCase):
                     raise AssertionError('value: %s' % value)
                 assert expected_ns == namespace, ('expected %s, got %s' %
                                                   (expected_ns, namespace))
-            except AssertionError:
-                e = sys.exc_info()[1]
+            except AssertionError as e:
                 raise ArgumentParserError('arg_action failed: %s' % e)
             setattr(namespace, 'badger', value)
 
@@ -3599,6 +3597,8 @@ class TestHelpUsage(HelpTestCase):
         Sig('--bar', help='Whether to bar', default=True,
                      action=argparse.BooleanOptionalAction),
         Sig('-f', '--foobar', '--barfoo', action=argparse.BooleanOptionalAction),
+        Sig('--bazz', action=argparse.BooleanOptionalAction,
+                      default=argparse.SUPPRESS, help='Bazz!'),
     ]
     argument_group_signatures = [
         (Sig('group'), [
@@ -3611,8 +3611,8 @@ class TestHelpUsage(HelpTestCase):
     usage = '''\
         usage: PROG [-h] [-w W [W ...]] [-x [X ...]] [--foo | --no-foo]
                     [--bar | --no-bar]
-                    [-f | --foobar | --no-foobar | --barfoo | --no-barfoo] [-y [Y]]
-                    [-z Z Z Z]
+                    [-f | --foobar | --no-foobar | --barfoo | --no-barfoo]
+                    [--bazz | --no-bazz] [-y [Y]] [-z Z Z Z]
                     a b b [c] [d ...] e [e ...]
         '''
     help = usage + '''\
@@ -3629,6 +3629,7 @@ class TestHelpUsage(HelpTestCase):
           --foo, --no-foo       Whether to foo
           --bar, --no-bar       Whether to bar (default: True)
           -f, --foobar, --no-foobar, --barfoo, --no-barfoo
+          --bazz, --no-bazz     Bazz!
 
         group:
           -y [Y]                y
index 63b1eb320ce16b7b749c40fd33ac1969bc10dcef..6b80721873d95cb854906c392f0c627983f1df79 100644 (file)
@@ -32,3 +32,7 @@ class DecimalContextTest(unittest.TestCase):
 
         self.assertEqual(str(r2[0]), '0.333333')
         self.assertEqual(str(r2[1]), '0.111111')
+
+
+if __name__ == '__main__':
+    unittest.main()
index c16bfc08a7abe7bf23884023e2906f4b1960b7fb..939ad7be6a436cb30e60f61d2df536b7ab40b5d0 100644 (file)
@@ -7,7 +7,7 @@ import sys
 import threading
 import unittest
 from unittest import mock
-
+from types import GenericAlias
 import asyncio
 from asyncio import futures
 from test.test_asyncio import utils as test_utils
@@ -109,6 +109,11 @@ class BaseFutureTests:
         self.loop = self.new_test_loop()
         self.addCleanup(self.loop.close)
 
+    def test_generic_alias(self):
+        future = self.cls[str]
+        self.assertEqual(future.__args__, (str,))
+        self.assertIsInstance(future, GenericAlias)
+
     def test_isfuture(self):
         class MyFuture:
             _asyncio_future_blocking = None
index 13dbc703277c814f1336b95184581c8f3bac4aec..60b58850369f053fd832f49bae461af4c10b4020 100644 (file)
@@ -3,6 +3,10 @@ import asyncio
 import unittest
 
 
+def tearDownModule():
+    asyncio.set_event_loop_policy(None)
+
+
 class FutureTests(unittest.IsolatedAsyncioTestCase):
     async def test_recursive_repr_for_pending_tasks(self):
         # The call crashes if the guard for recursive call
@@ -16,3 +20,7 @@ class FutureTests(unittest.IsolatedAsyncioTestCase):
         # The check for returned string is not very reliable but
         # exact comparison for the whole string is even weaker.
         self.assertIn('...', repr(await asyncio.wait_for(func(), timeout=10)))
+
+
+if __name__ == '__main__':
+    unittest.main()
index 59d5e5b6ccb631a42ec6d6958dfe9b0ca10301fe..acf21494823ae8d84a395706420bd7db889aa1f5 100644 (file)
@@ -237,6 +237,14 @@ class ProactorSocketTransportTests(test_utils.TestCase):
         test_utils.run_briefly(self.loop)
         self.assertFalse(self.protocol.connection_lost.called)
 
+    def test_close_invalid_sockobj(self):
+        tr = self.socket_transport()
+        self.sock.fileno.return_value = -1
+        tr.close()
+        test_utils.run_briefly(self.loop)
+        self.protocol.connection_lost.assert_called_with(None)
+        self.assertFalse(self.sock.shutdown.called)
+
     @mock.patch('asyncio.base_events.logger')
     def test_fatal_error(self, m_logging):
         tr = self.socket_transport()
@@ -823,6 +831,7 @@ class BaseProactorEventLoopTests(test_utils.TestCase):
     def test_make_datagram_transport(self):
         tr = self.datagram_transport()
         self.assertIsInstance(tr, _ProactorDatagramTransport)
+        self.assertIsInstance(tr, asyncio.DatagramTransport)
         close_transport(tr)
 
     def test_datagram_loop_writing(self):
index 438111cccd34789174fc35564f2c75a0f60e1744..0f232631867db56c17f0bd77eeccd502e4586146 100644 (file)
@@ -4,6 +4,12 @@ from unittest import mock
 import asyncio
 
 
+def tearDownModule():
+    # not needed for the test file but added for uniformness with all other
+    # asyncio test files for the sake of unified cleanup
+    asyncio.set_event_loop_policy(None)
+
+
 class ProtocolsAbsTests(unittest.TestCase):
 
     def test_base_protocol(self):
@@ -55,3 +61,7 @@ class ProtocolsAbsTests(unittest.TestCase):
         self.assertIsNone(sp.pipe_connection_lost(1, f))
         self.assertIsNone(sp.process_exited())
         self.assertFalse(hasattr(sp, '__dict__'))
+
+
+if __name__ == '__main__':
+    unittest.main()
index 81e888fbce6dbba13a181b912824339c4d1ed1b9..90d352276c9d6417b099c3da33f7caa1a2329c52 100644 (file)
@@ -4,6 +4,7 @@ import unittest
 from unittest import mock
 
 import asyncio
+from types import GenericAlias
 from test.test_asyncio import utils as test_utils
 
 
@@ -92,6 +93,11 @@ class QueueBasicTests(_QueueTestBase):
     def test_str(self):
         self._test_repr_or_str(str, False)
 
+    def test_generic_alias(self):
+        q = asyncio.Queue[int]
+        self.assertEqual(q.__args__, (int,))
+        self.assertIsInstance(q, GenericAlias)
+
     def test_empty(self):
         with self.assertWarns(DeprecationWarning):
             q = asyncio.Queue(loop=self.loop)
index b9ae02dc3c04e096f17f90a7ba741b8714b7793d..112273662b20b55bebf54e81a27575c54ce2f86b 100644 (file)
@@ -2,7 +2,11 @@ import asyncio
 import unittest
 
 from unittest import mock
-from . import utils as test_utils
+from test.test_asyncio import utils as test_utils
+
+
+def tearDownModule():
+    asyncio.set_event_loop_policy(None)
 
 
 class TestPolicy(asyncio.AbstractEventLoopPolicy):
@@ -180,3 +184,7 @@ class RunTests(BaseTest):
 
         self.assertIsNone(spinner.ag_frame)
         self.assertFalse(spinner.ag_running)
+
+
+if __name__ == '__main__':
+    unittest.main()
index b684fab2771f20d6edbaaaabfb8c6d7f077092df..dfd954f807c76ccc97f3fbe18b0e01dcd0dfafa5 100644 (file)
@@ -189,6 +189,24 @@ class BaseSelectorEventLoopTests(test_utils.TestCase):
         self.loop._csock.send.side_effect = RuntimeError()
         self.assertRaises(RuntimeError, self.loop._write_to_self)
 
+    @mock.patch('socket.getaddrinfo')
+    def test_sock_connect_resolve_using_socket_params(self, m_gai):
+        addr = ('need-resolution.com', 8080)
+        for sock_type in [socket.SOCK_STREAM, socket.SOCK_DGRAM]:
+            with self.subTest(sock_type):
+                sock = test_utils.mock_nonblocking_socket(type=sock_type)
+
+                m_gai.side_effect = \
+                    lambda *args: [(None, None, None, None, ('127.0.0.1', 0))]
+
+                con = self.loop.create_task(self.loop.sock_connect(sock, addr))
+                self.loop.run_until_complete(con)
+                m_gai.assert_called_with(
+                    addr[0], addr[1], sock.family, sock.type, sock.proto, 0)
+
+                self.loop.run_until_complete(con)
+                sock.connect.assert_called_with(('127.0.0.1', 0))
+
     def test_add_reader(self):
         self.loop._selector.get_key.side_effect = KeyError
         cb = lambda: True
index 1b1af08db0a139ff11a1aa678dadda2c27c5f839..8e34ab49383901e19191f39232b430effee26619 100644 (file)
@@ -87,9 +87,13 @@ class MyProto(asyncio.Protocol):
 
 class SendfileBase:
 
-      # 128 KiB plus small unaligned to buffer chunk
-    DATA = b"SendfileBaseData" * (1024 * 8 + 1)
-
+    # 256 KiB plus small unaligned to buffer chunk
+    # Newer versions of Windows seems to have increased its internal 
+    # buffer and tries to send as much of the data as it can as it 
+    # has some form of buffering for this which is less than 256KiB
+    # on newer server versions and Windows 11.
+    # So DATA should be larger than 256 KiB to make this test reliable.
+    DATA = b"x" * (1024 * 256 + 1)
     # Reduce socket buffer size to test on relative small data sets.
     BUF_SIZE = 4 * 1024   # 4 KiB
 
@@ -560,3 +564,7 @@ else:
 
         def create_event_loop(self):
             return asyncio.SelectorEventLoop(selectors.SelectSelector())
+
+
+if __name__ == '__main__':
+    unittest.main()
index d8a5df8ede1f844a3fb53259378107950bffa886..025c6c0132a971855f5fd198d9c43257350a463e 100644 (file)
@@ -1,5 +1,4 @@
 import socket
-import time
 import asyncio
 import sys
 import unittest
@@ -11,6 +10,10 @@ from test import support
 from test.support import socket_helper
 
 
+def tearDownModule():
+    asyncio.set_event_loop_policy(None)
+
+
 class MyProto(asyncio.Protocol):
     connected = None
     done = None
@@ -508,3 +511,7 @@ else:
 
         def create_event_loop(self):
             return asyncio.SelectorEventLoop(selectors.SelectSelector())
+
+
+if __name__ == '__main__':
+    unittest.main()
index bc01a8bbf2d3563e4a2a55aee14132e4ad50c834..d658a00de96b5be6b44d47ad0f484d0f83586fdf 100644 (file)
@@ -2,7 +2,6 @@
 
 import logging
 import socket
-from test import support
 import unittest
 import weakref
 from unittest import mock
index a6afce0766493dec8f685612fbacee5c6f829f72..0e538edcd9678e73d076f9b4f0759304abf27b15 100644 (file)
@@ -9,12 +9,13 @@ import io
 import random
 import re
 import sys
+import types
 import textwrap
 import traceback
-import types
 import unittest
 import weakref
 from unittest import mock
+from types import GenericAlias
 
 import asyncio
 from asyncio import coroutines
@@ -120,6 +121,12 @@ class BaseTaskTests:
         self.loop.set_task_factory(self.new_task)
         self.loop.create_future = lambda: self.new_future(self.loop)
 
+
+    def test_generic_alias(self):
+        task = self.__class__.Task[str]
+        self.assertEqual(task.__args__, (str,))
+        self.assertIsInstance(task, GenericAlias)
+
     def test_task_cancel_message_getter(self):
         async def coro():
             pass
@@ -3400,6 +3407,11 @@ class CoroutineGatherTests(GatherTestsBase, test_utils.TestCase):
             coros.append(coro())
         return coros
 
+    def _gather(self, *args, **kwargs):
+        async def coro():
+            return asyncio.gather(*args, **kwargs)
+        return self.one_loop.run_until_complete(coro())
+
     def test_constructor_loop_selection(self):
         async def coro():
             return 'abc'
@@ -3481,6 +3493,20 @@ class CoroutineGatherTests(GatherTestsBase, test_utils.TestCase):
         test_utils.run_briefly(self.one_loop)
         self.assertIsInstance(f.exception(), RuntimeError)
 
+    def test_issue46672(self):
+        with mock.patch(
+            'asyncio.base_events.BaseEventLoop.call_exception_handler',
+        ):
+            async def coro(s):
+                return s
+            c = coro('abc')
+
+            with self.assertRaises(TypeError):
+                self._gather(c, {})
+            self._run_loop(self.one_loop)
+            # NameError should not happen:
+            self.one_loop.call_exception_handler.assert_not_called()
+
 
 class RunCoroutineThreadsafeTests(test_utils.TestCase):
     """Test case for asyncio.run_coroutine_threadsafe."""
index df448557a7b7fcde07f7017e4015bdecb80be8ab..bbdb218efaa3b6594d4e1921d513dfa39b92166b 100644 (file)
@@ -7,6 +7,12 @@ import asyncio
 from asyncio import transports
 
 
+def tearDownModule():
+    # not needed for the test file but added for uniformness with all other
+    # asyncio test files for the sake of unified cleanup
+    asyncio.set_event_loop_policy(None)
+
+
 class TransportTests(unittest.TestCase):
 
     def test_ctor_extra_is_none(self):
index 10bd46dea1991d9b8310a691c39a39945ba4eaf6..70d306ffe8fbb90b2469df9556240eac7e09b900 100644 (file)
@@ -27,13 +27,13 @@ from asyncio import unix_events
 from test.test_asyncio import utils as test_utils
 
 
-MOCK_ANY = mock.ANY
-
-
 def tearDownModule():
     asyncio.set_event_loop_policy(None)
 
 
+MOCK_ANY = mock.ANY
+
+
 def close_pipe_transport(transport):
     # Don't call transport.close() because the event loop and the selector
     # are mocked
index d009f57e47e05a36f05800f66d09672d8292fb91..9927b7ec3728cc41117753beaac92a205671d582 100644 (file)
@@ -581,8 +581,8 @@ class BuiltinTest(unittest.TestCase):
         # dir(traceback)
         try:
             raise IndexError
-        except:
-            self.assertEqual(len(dir(sys.exc_info()[2])), 4)
+        except IndexError as e:
+            self.assertEqual(len(dir(e.__traceback__)), 4)
 
         # test that object has a __dir__()
         self.assertEqual(sorted([].__dir__()), dir([]))
@@ -1980,12 +1980,24 @@ class PtyTests(unittest.TestCase):
         # is different and invokes GNU readline if available).
         self.check_input_tty("prompt", b"quux")
 
+    def skip_if_readline(self):
+        # bpo-13886: When the readline module is loaded, PyOS_Readline() uses
+        # the readline implementation. In some cases, the Python readline
+        # callback rlhandler() is called by readline with a string without
+        # non-ASCII characters. Skip tests on non-ASCII characters if the
+        # readline module is loaded, since test_builtin is not intented to test
+        # the readline module, but the builtins module.
+        if 'readline' in sys.modules:
+            self.skipTest("the readline module is loaded")
+
     def test_input_tty_non_ascii(self):
-        # Check stdin/stdout encoding is used when invoking GNU readline
+        self.skip_if_readline()
+        # Check stdin/stdout encoding is used when invoking PyOS_Readline()
         self.check_input_tty("prompté", b"quux\xe9", "utf-8")
 
     def test_input_tty_non_ascii_unicode_errors(self):
-        # Check stdin/stdout error handler is used when invoking GNU readline
+        self.skip_if_readline()
+        # Check stdin/stdout error handler is used when invoking PyOS_Readline()
         self.check_input_tty("prompté", b"quux\xe9", "ascii")
 
     def test_input_no_stdout_fileno(self):
index 2f7f93a29f6628c014f28bcb8099f670bc81c001..fc50e70df24b961543a1ddc7f3d3054fb0465f0e 100644 (file)
@@ -30,7 +30,7 @@ def coding_checker(self, coder):
 # On small versions of Windows like Windows IoT or Windows Nano Server not all codepages are present
 def is_code_page_present(cp):
     from ctypes import POINTER, WINFUNCTYPE, WinDLL
-    from ctypes.wintypes import BOOL, UINT, BYTE, WCHAR, UINT, DWORD
+    from ctypes.wintypes import BOOL, BYTE, WCHAR, UINT, DWORD
 
     MAX_LEADBYTES = 12  # 5 ranges, 2 bytes ea., 0 term.
     MAX_DEFAULTCHAR = 2 # single or double byte
index 6e1f4b2f397e28b9a8ee8715b5b17395580eb9ac..a904f426b172accced39a118f8f12fa7ab946c3b 100644 (file)
@@ -3,7 +3,6 @@ import contextlib
 import filecmp
 import importlib.util
 import io
-import itertools
 import os
 import pathlib
 import py_compile
@@ -24,9 +23,8 @@ except ImportError:
 
 from test import support
 from test.support import script_helper
-
-from .test_py_compile import without_source_date_epoch
-from .test_py_compile import SourceDateEpochTestMeta
+from test.test_py_compile import without_source_date_epoch
+from test.test_py_compile import SourceDateEpochTestMeta
 
 
 def get_pyc(script, opt):
index d693fb4ee199bb5042688a6f6d004e8d9ffd191d..d421b02754cf5721cca9895dea0898c5e011d6ed 100644 (file)
@@ -32,6 +32,12 @@ import multiprocessing.process
 import multiprocessing.util
 
 
+if support.check_sanitizer(address=True, memory=True):
+    # bpo-46633: Skip the test because it is too slow when Python is built
+    # with ASAN/MSAN: between 5 and 20 minutes on GitHub Actions.
+    raise unittest.SkipTest("test too slow on ASAN/MSAN build")
+
+
 def create_future(state=PENDING, exception=None, result=None):
     f = Future()
     f._state = state
index 5dc83b4ecbfa008d78d41ef2d51bd1784ba2d111..877c575c5534ae76bdfec11f85394bb1f29a6ee6 100644 (file)
@@ -1,8 +1,11 @@
 import sys
 import unittest
+from test.support import check_sanitizer
 
 
 try:
+    if check_sanitizer(address=True, memory=True):
+        raise unittest.SkipTest("The crypt module SEGFAULTs on ASAN/MSAN builds")
     import crypt
     IMPORT_ERROR = None
 except ImportError as ex:
index 3f30a935d583c35d695abec8c7164af78b500326..58f4df3060169ce5072a51d2e0fe9354c2487b3a 100644 (file)
@@ -33,24 +33,14 @@ import unittest
 import numbers
 import locale
 from test.support import (run_unittest, run_doctest, is_resource_enabled,
-                          requires_IEEE_754, requires_docstrings)
-from test.support import (import_fresh_module, TestFailed,
+                          requires_IEEE_754, requires_docstrings,
+                          import_fresh_module, TestFailed,
                           run_with_locale, cpython_only,
-                          darwin_malloc_err_warning)
+                          darwin_malloc_err_warning,
+                          check_sanitizer)
 import random
 import inspect
 import threading
-import sysconfig
-_cflags = sysconfig.get_config_var('CFLAGS') or ''
-_config_args = sysconfig.get_config_var('CONFIG_ARGS') or ''
-MEMORY_SANITIZER = (
-    '-fsanitize=memory' in _cflags or
-    '--with-memory-sanitizer' in _config_args
-)
-
-ADDRESS_SANITIZER = (
-    '-fsanitize=address' in _cflags
-)
 
 
 if sys.platform == 'darwin':
@@ -5497,7 +5487,8 @@ class CWhitebox(unittest.TestCase):
     # Issue 41540:
     @unittest.skipIf(sys.platform.startswith("aix"),
                      "AIX: default ulimit: test is flaky because of extreme over-allocation")
-    @unittest.skipIf(MEMORY_SANITIZER or ADDRESS_SANITIZER, "sanitizer defaults to crashing "
+    @unittest.skipIf(check_sanitizer(address=True, memory=True),
+                     "ASAN/MSAN sanitizer defaults to crashing "
                      "instead of returning NULL for malloc failure.")
     def test_maxcontext_exact_arith(self):
 
index d05ed302ede8480d29ad9b46cab9cea6d33da641..a3014cb09f9856066c9ad150f16c5c32565a130b 100644 (file)
@@ -1435,7 +1435,7 @@ class DictTest(unittest.TestCase):
         self.assertTrue(gc.is_tracked(next(it)))
 
     @support.cpython_only
-    def test_dict_items_result_gc(self):
+    def test_dict_items_result_gc_reversed(self):
         # Same as test_dict_items_result_gc above, but reversed.
         it = reversed({None: []}.items())
         gc.collect()
index 790d39c6d35aec6c26cc29f9915c24a0804dafe8..849aa737e9bdced893f269a5a0cdd31286793725 100644 (file)
@@ -7,7 +7,7 @@ be run.
 
 import distutils.tests
 import test.support
-
+import unittest
 
 def load_tests(*_):
     # used by unittest
index 3957077f5d612349070fa5440976d7282107828c..8a436ad123b80f7e8d6355ffaf6adb90212fa8c3 100644 (file)
@@ -170,4 +170,4 @@ class SystemTapOptimizedTests(TraceTests, unittest.TestCase):
 
 
 if __name__ == '__main__':
-    test_main()
+    unittest.main()
index 1a5c87f647fbf33e5b46103119c9fd42afbe9e5d..7e308f542b864cdbfe8e872d37574bfb9b0eced4 100644 (file)
Binary files a/Lib/test/test_email/data/PyBanner048.gif and b/Lib/test/test_email/data/PyBanner048.gif differ
index 1bdcfa129b4c8717d05bee9118db5e6ea792a005..854f2ff009c61851f58af5213f21e678974c024c 100644 (file)
@@ -395,7 +395,7 @@ class TestParser(TestParserMixin, TestEmailBase):
             [errors.InvalidHeaderDefect],
             '')
 
-    def test_get_unstructured_invalid_ew(self):
+    def test_get_unstructured_invalid_ew2(self):
         self._test_get_x(self._get_unst,
             '=?utf-8?q?=somevalue?=',
             '=?utf-8?q?=somevalue?=',
index 5168b0b8a0831a06462f2cfc71c4ecdcc0345cea..90d7f37dd86703f72ae9bbbc6ca77cd7d3f1ba9f 100644 (file)
@@ -598,15 +598,27 @@ class ExceptionTests(unittest.TestCase):
         self.assertTrue(str(Exception('a')))
         self.assertTrue(str(Exception('a', 'b')))
 
-    def testExceptionCleanupNames(self):
+    def test_exception_cleanup_names(self):
         # Make sure the local variable bound to the exception instance by
         # an "except" statement is only visible inside the except block.
         try:
             raise Exception()
         except Exception as e:
-            self.assertTrue(e)
+            self.assertIsInstance(e, Exception)
+        self.assertNotIn('e', locals())
+        with self.assertRaises(UnboundLocalError):
+            e
+
+    def test_exception_cleanup_names2(self):
+        # Make sure the cleanup doesn't break if the variable is explicitly deleted.
+        try:
+            raise Exception()
+        except Exception as e:
+            self.assertIsInstance(e, Exception)
             del e
         self.assertNotIn('e', locals())
+        with self.assertRaises(UnboundLocalError):
+            e
 
     def testExceptionCleanupState(self):
         # Make sure exception state is cleaned up as soon as the except
index c64afe88c25d6c0c7453fa939128f3be5216fc41..2f8f5eec475f151a9d4a086728e46800fa035c74 100644 (file)
@@ -5,9 +5,9 @@ import os
 import signal
 import subprocess
 import sys
-import sysconfig
 from test import support
 from test.support import script_helper, is_android
+from test.support import skip_if_sanitizer
 import tempfile
 import unittest
 from textwrap import dedent
@@ -19,16 +19,6 @@ except ImportError:
 
 TIMEOUT = 0.5
 MS_WINDOWS = (os.name == 'nt')
-_cflags = sysconfig.get_config_var('CFLAGS') or ''
-_config_args = sysconfig.get_config_var('CONFIG_ARGS') or ''
-UB_SANITIZER = (
-    '-fsanitize=undefined' in _cflags or
-    '--with-undefined-behavior-sanitizer' in _config_args
-)
-MEMORY_SANITIZER = (
-    '-fsanitize=memory' in _cflags or
-    '--with-memory-sanitizer' in _config_args
-)
 
 
 def expected_traceback(lineno1, lineno2, header, min_count=1):
@@ -271,8 +261,8 @@ class FaultHandlerTests(unittest.TestCase):
             3,
             'Segmentation fault')
 
-    @unittest.skipIf(UB_SANITIZER or MEMORY_SANITIZER,
-                     "sanitizer builds change crashing process output.")
+    @skip_if_sanitizer(memory=True, ub=True, reason="sanitizer "
+                       "builds change crashing process output.")
     @skip_segfault_on_android
     def test_enable_file(self):
         with temporary_filename() as filename:
@@ -288,8 +278,8 @@ class FaultHandlerTests(unittest.TestCase):
 
     @unittest.skipIf(sys.platform == "win32",
                      "subprocess doesn't support pass_fds on Windows")
-    @unittest.skipIf(UB_SANITIZER or MEMORY_SANITIZER,
-                     "sanitizer builds change crashing process output.")
+    @skip_if_sanitizer(memory=True, ub=True, reason="sanitizer "
+                       "builds change crashing process output.")
     @skip_segfault_on_android
     def test_enable_fd(self):
         with tempfile.TemporaryFile('wb+') as fp:
index 22285859a92bb1eaec2da376a31e16d7ac706514..e9462dfc70c4ee947dd37f73819f705b56a61c93 100644 (file)
@@ -17,7 +17,7 @@ class FLUFLTests(unittest.TestCase):
         self.assertIn('2 != 3', cm.exception.text)
         self.assertEqual(cm.exception.filename, '<FLUFL test>')
 
-        self.assertTrue(cm.exception.lineno, 2)
+        self.assertEqual(cm.exception.lineno, 2)
         # The old parser reports the end of the token and the new
         # parser reports the start of the token
         self.assertEqual(cm.exception.offset, 4 if support.use_old_parser() else 3)
index 518ebdf16c1c694a1ee0a12beed9f625f3975174..b62887f8f0099d2d32580bd37c6a4c70316e3c10 100644 (file)
@@ -747,12 +747,16 @@ x = (
         # differently inside f-strings.
         self.assertAllRaise(SyntaxError, r"\(unicode error\) 'unicodeescape' codec can't decode bytes in position .*: malformed \\N character escape",
                             [r"f'\N'",
+                             r"f'\N '",
+                             r"f'\N  '",  # See bpo-46503.
                              r"f'\N{'",
                              r"f'\N{GREEK CAPITAL LETTER DELTA'",
 
                              # Here are the non-f-string versions,
                              #  which should give the same errors.
                              r"'\N'",
+                             r"'\N '",
+                             r"'\N  '",
                              r"'\N{'",
                              r"'\N{GREEK CAPITAL LETTER DELTA'",
                              ])
@@ -1056,6 +1060,8 @@ x = (
                              "f'{{{'",
                              "f'{{}}{'",
                              "f'{'",
+                             "f'x{<'",  # See bpo-46762.
+                             "f'x{>'",
                              ])
 
         # But these are just normal strings.
index 6f8f977b3950d5de5e1f8e1748075ac83ca5a9e2..b51e5440800cd3a4e9f83f22512fb6a1e3000e2d 100644 (file)
@@ -49,6 +49,13 @@ MLSD_DATA = ("type=cdir;perm=el;unique==keVO1+ZF4; test\r\n"
              "type=file;perm=r;unique==SGP2; file \xAE non-ascii char\r\n")
 
 
+def default_error_handler():
+    # bpo-44359: Silently ignore socket errors. Such errors occur when a client
+    # socket is closed, in TestFTPClass.tearDown() and makepasv() tests, and
+    # the server gets an error on its side.
+    pass
+
+
 class DummyDTPHandler(asynchat.async_chat):
     dtp_conn_closed = False
 
@@ -80,7 +87,7 @@ class DummyDTPHandler(asynchat.async_chat):
         super(DummyDTPHandler, self).push(what.encode(self.encoding))
 
     def handle_error(self):
-        raise Exception
+        default_error_handler()
 
 
 class DummyFTPHandler(asynchat.async_chat):
@@ -130,7 +137,7 @@ class DummyFTPHandler(asynchat.async_chat):
             self.push('550 command "%s" not understood.' %cmd)
 
     def handle_error(self):
-        raise Exception
+        default_error_handler()
 
     def push(self, data):
         asynchat.async_chat.push(self, data.encode(self.encoding) + b'\r\n')
@@ -308,7 +315,7 @@ class DummyFTPServer(asyncore.dispatcher, threading.Thread):
         return 0
 
     def handle_error(self):
-        raise Exception
+        default_error_handler()
 
 
 if ssl is not None:
@@ -411,7 +418,7 @@ if ssl is not None:
                 raise
 
         def handle_error(self):
-            raise Exception
+            default_error_handler()
 
         def close(self):
             if (isinstance(self.socket, ssl.SSLSocket) and
index 969e5e42e44c78b5589fe9ba744174a6289095ed..214bc3cb2b187c29ada863636543e6ec89b61978 100644 (file)
@@ -66,7 +66,9 @@ try:
 except ImportError:
     _sha3 = None
 
-requires_sha3 = unittest.skipUnless(_sha3, 'requires _sha3')
+# bpo-46913: Don't test the _sha3 extension on a Python UBSAN build
+SKIP_SHA3 = support.check_sanitizer(ub=True)
+requires_sha3 = unittest.skipUnless(not SKIP_SHA3 and _sha3, 'requires _sha3')
 
 
 def hexstr(s):
@@ -129,6 +131,8 @@ class HashLibTestCase(unittest.TestCase):
 
         self.constructors_to_test = {}
         for algorithm in algorithms:
+            if SKIP_SHA3 and algorithm.startswith('sha3_'):
+                continue
             self.constructors_to_test[algorithm] = set()
 
         # For each algorithm, test the direct constructor and the use
@@ -181,14 +185,15 @@ class HashLibTestCase(unittest.TestCase):
             add_builtin_constructor('blake2s')
             add_builtin_constructor('blake2b')
 
-        _sha3 = self._conditional_import_module('_sha3')
-        if _sha3:
-            add_builtin_constructor('sha3_224')
-            add_builtin_constructor('sha3_256')
-            add_builtin_constructor('sha3_384')
-            add_builtin_constructor('sha3_512')
-            add_builtin_constructor('shake_128')
-            add_builtin_constructor('shake_256')
+        if not SKIP_SHA3:
+            _sha3 = self._conditional_import_module('_sha3')
+            if _sha3:
+                add_builtin_constructor('sha3_224')
+                add_builtin_constructor('sha3_256')
+                add_builtin_constructor('sha3_384')
+                add_builtin_constructor('sha3_512')
+                add_builtin_constructor('shake_128')
+                add_builtin_constructor('shake_256')
 
         super(HashLibTestCase, self).__init__(*args, **kwargs)
 
index 310b72c1d72e74cda637ac9fea6216e0e71781c8..c747b02f6430693067f1ed9c1e29f3afad4d32e1 100644 (file)
@@ -1,5 +1,9 @@
 import unittest
 from test.support import import_module
+from test.support import check_sanitizer
+
+if check_sanitizer(address=True, memory=True):
+    raise unittest.SkipTest("Tests involvin libX11 can SEGFAULT on ASAN/MSAN builds")
 
 # Skip test_idle if _tkinter wasn't built, if tkinter is missing,
 # if tcl/tk is not the 8.5+ needed for ttk widgets,
index 420fbfeb3a704c02542888164d9e3f48563f575b..cba920ab02c872eb858dd7cf71aecc86db7e0e5d 100644 (file)
@@ -104,6 +104,16 @@ class APITests(
             for dep in deps
             )
 
+    def test_requires_egg_info_empty(self):
+        fixtures.build_files(
+            {
+                'requires.txt': '',
+            },
+            self.site_dir.joinpath('egginfo_pkg.egg-info'),
+        )
+        deps = requires('egginfo-pkg')
+        assert deps == []
+
     def test_requires_dist_info(self):
         deps = requires('distinfo-pkg')
         assert len(deps) == 2
index a8f95a035e2450a0a102fc2c1c7c764ee6b1c1f0..92771e71e7010647ee798d267d5df23d46258ac9 100644 (file)
@@ -2,6 +2,7 @@ import contextlib
 import importlib
 import os
 import sys
+import tempfile
 import unittest
 
 from test.test_importlib import util
@@ -124,6 +125,40 @@ class SeparatedNamespacePackages(NamespacePackageTest):
         self.assertEqual(foo.two.attr, 'portion2 foo two')
 
 
+class SeparatedNamespacePackagesCreatedWhileRunning(NamespacePackageTest):
+    paths = ['portion1']
+
+    def test_invalidate_caches(self):
+        with tempfile.TemporaryDirectory() as temp_dir:
+            # we manipulate sys.path before anything is imported to avoid
+            # accidental cache invalidation when changing it
+            sys.path.append(temp_dir)
+
+            import foo.one
+            self.assertEqual(foo.one.attr, 'portion1 foo one')
+
+            # the module does not exist, so it cannot be imported
+            with self.assertRaises(ImportError):
+                import foo.just_created
+
+            # util.create_modules() manipulates sys.path
+            # so we must create the modules manually instead
+            namespace_path = os.path.join(temp_dir, 'foo')
+            os.mkdir(namespace_path)
+            module_path = os.path.join(namespace_path, 'just_created.py')
+            with open(module_path, 'w', encoding='utf-8') as file:
+                file.write('attr = "just_created foo"')
+
+            # the module is not known, so it cannot be imported yet
+            with self.assertRaises(ImportError):
+                import foo.just_created
+
+            # but after explicit cache invalidation, it is importable
+            importlib.invalidate_caches()
+            import foo.just_created
+            self.assertEqual(foo.just_created.attr, 'just_created foo')
+
+
 class SeparatedOverlappingNamespacePackages(NamespacePackageTest):
     paths = ['portion1', 'both_portions']
 
index 9a53e8dbee56f538e7a9345d858e93a9003b9d50..1c0abd3a872a68a839f79816b5a286305cbf6d5c 100644 (file)
@@ -41,17 +41,28 @@ def setup_module(machinery, name, path=None):
         root = machinery.WindowsRegistryFinder.REGISTRY_KEY
     key = root.format(fullname=name,
                       sys_version='%d.%d' % sys.version_info[:2])
+    base_key = "Software\\Python\\PythonCore\\{}.{}".format(
+        sys.version_info.major, sys.version_info.minor)
+    assert key.casefold().startswith(base_key.casefold()), (
+        "expected key '{}' to start with '{}'".format(key, base_key))
     try:
         with temp_module(name, "a = 1") as location:
+            try:
+                OpenKey(HKEY_CURRENT_USER, base_key)
+                if machinery.WindowsRegistryFinder.DEBUG_BUILD:
+                    delete_key = os.path.dirname(key)
+                else:
+                    delete_key = key
+            except OSError:
+                delete_key = base_key
             subkey = CreateKey(HKEY_CURRENT_USER, key)
             if path is None:
                 path = location + ".py"
             SetValue(subkey, "", REG_SZ, path)
             yield
     finally:
-        if machinery.WindowsRegistryFinder.DEBUG_BUILD:
-            key = os.path.dirname(key)
-        delete_registry_tree(HKEY_CURRENT_USER, key)
+        if delete_key:
+            delete_registry_tree(HKEY_CURRENT_USER, delete_key)
 
 
 @unittest.skipUnless(sys.platform.startswith('win'), 'requires Windows')
index 08aed248b96652118e46dccbc5921aa4b32ff4ab..ef26d79a50a02d87d187615d61186bdd1f1e77fc 100644 (file)
@@ -127,8 +127,8 @@ class TestPredicates(IsTestBase):
         self.istest(inspect.iscode, 'mod.spam.__code__')
         try:
             1/0
-        except:
-            tb = sys.exc_info()[2]
+        except Exception as e:
+            tb = e.__traceback__
             self.istest(inspect.isframe, 'tb.tb_frame')
             self.istest(inspect.istraceback, 'tb')
             if hasattr(types, 'GetSetDescriptorType'):
@@ -3949,6 +3949,17 @@ class TestSignatureDefinitions(unittest.TestCase):
         sig = inspect.signature(func)
         self.assertEqual(str(sig), '(self, a, b=1, /, *args, c, d=2, **kwargs)')
 
+    def test_base_class_have_text_signature(self):
+        # see issue 43118
+        from test.ann_module7 import BufferedReader
+        class MyBufferedReader(BufferedReader):
+            """buffer reader class."""
+
+        text_signature = BufferedReader.__text_signature__
+        self.assertEqual(text_signature, '(raw, buffer_size=DEFAULT_BUFFER_SIZE)')
+        sig = inspect.signature(MyBufferedReader)
+        self.assertEqual(str(sig), '(raw, buffer_size=8192)')
+
 
 class NTimesUnwrappable:
     def __init__(self, n):
index 49463e54e3c7218c70dcbd04e2344e2a8eaa81a3..feee861830e40547b2bcb7ec52406d53b36647cd 100644 (file)
@@ -28,7 +28,6 @@ import pickle
 import random
 import signal
 import sys
-import sysconfig
 import textwrap
 import threading
 import time
@@ -40,7 +39,7 @@ from itertools import cycle, count
 from test import support
 from test.support.script_helper import (
     assert_python_ok, assert_python_failure, run_python_until_end)
-from test.support import FakePath
+from test.support import FakePath, skip_if_sanitizer
 
 import codecs
 import io  # C implementation of io
@@ -62,17 +61,6 @@ else:
     class EmptyStruct(ctypes.Structure):
         pass
 
-_cflags = sysconfig.get_config_var('CFLAGS') or ''
-_config_args = sysconfig.get_config_var('CONFIG_ARGS') or ''
-MEMORY_SANITIZER = (
-    '-fsanitize=memory' in _cflags or
-    '--with-memory-sanitizer' in _config_args
-)
-
-ADDRESS_SANITIZER = (
-    '-fsanitize=address' in _cflags
-)
-
 # Does io.IOBase finalizer log the exception if the close() method fails?
 # The exception is ignored silently by default in release build.
 IOBASE_EMITS_UNRAISABLE = (hasattr(sys, "gettotalrefcount") or sys.flags.dev_mode)
@@ -1543,8 +1531,8 @@ class BufferedReaderTest(unittest.TestCase, CommonBufferedTests):
 class CBufferedReaderTest(BufferedReaderTest, SizeofTest):
     tp = io.BufferedReader
 
-    @unittest.skipIf(MEMORY_SANITIZER or ADDRESS_SANITIZER, "sanitizer defaults to crashing "
-                     "instead of returning NULL for malloc failure.")
+    @skip_if_sanitizer(memory=True, address=True, reason= "sanitizer defaults to crashing "
+                       "instead of returning NULL for malloc failure.")
     def test_constructor(self):
         BufferedReaderTest.test_constructor(self)
         # The allocation can succeed on 32-bit builds, e.g. with more
@@ -1892,8 +1880,8 @@ class BufferedWriterTest(unittest.TestCase, CommonBufferedTests):
 class CBufferedWriterTest(BufferedWriterTest, SizeofTest):
     tp = io.BufferedWriter
 
-    @unittest.skipIf(MEMORY_SANITIZER or ADDRESS_SANITIZER, "sanitizer defaults to crashing "
-                     "instead of returning NULL for malloc failure.")
+    @skip_if_sanitizer(memory=True, address=True, reason= "sanitizer defaults to crashing "
+                       "instead of returning NULL for malloc failure.")
     def test_constructor(self):
         BufferedWriterTest.test_constructor(self)
         # The allocation can succeed on 32-bit builds, e.g. with more
@@ -2391,8 +2379,8 @@ class BufferedRandomTest(BufferedReaderTest, BufferedWriterTest):
 class CBufferedRandomTest(BufferedRandomTest, SizeofTest):
     tp = io.BufferedRandom
 
-    @unittest.skipIf(MEMORY_SANITIZER or ADDRESS_SANITIZER, "sanitizer defaults to crashing "
-                     "instead of returning NULL for malloc failure.")
+    @skip_if_sanitizer(memory=True, address=True, reason= "sanitizer defaults to crashing "
+                       "instead of returning NULL for malloc failure.")
     def test_constructor(self):
         BufferedRandomTest.test_constructor(self)
         # The allocation can succeed on 32-bit builds, e.g. with more
index 543c62839b2cdd98bc1bdc3b8e3fa788099aa1e2..9919d7fbe54ef7492e47db525fc55dd7188f3226 100644 (file)
@@ -1,3 +1,4 @@
+from test import support
 from test.test_json import PyTest, CTest
 
 
@@ -69,11 +70,14 @@ class TestRecursion:
         # test that loading highly-nested objects doesn't segfault when C
         # accelerations are used. See #12017
         with self.assertRaises(RecursionError):
-            self.loads('{"a":' * 100000 + '1' + '}' * 100000)
+            with support.infinite_recursion():
+                self.loads('{"a":' * 100000 + '1' + '}' * 100000)
         with self.assertRaises(RecursionError):
-            self.loads('{"a":' * 100000 + '[1]' + '}' * 100000)
+            with support.infinite_recursion():
+                self.loads('{"a":' * 100000 + '[1]' + '}' * 100000)
         with self.assertRaises(RecursionError):
-            self.loads('[' * 100000 + '1' + ']' * 100000)
+            with support.infinite_recursion():
+                self.loads('[' * 100000 + '1' + ']' * 100000)
 
     def test_highly_nested_objects_encoding(self):
         # See #12051
@@ -81,9 +85,11 @@ class TestRecursion:
         for x in range(100000):
             l, d = [l], {'k':d}
         with self.assertRaises(RecursionError):
-            self.dumps(l)
+            with support.infinite_recursion():
+                self.dumps(l)
         with self.assertRaises(RecursionError):
-            self.dumps(d)
+            with support.infinite_recursion():
+                self.dumps(d)
 
     def test_endless_recursion(self):
         # See #12051
@@ -93,7 +99,8 @@ class TestRecursion:
                 return [o]
 
         with self.assertRaises(RecursionError):
-            EndlessJSONEncoder(check_circular=False).encode(5j)
+            with support.infinite_recursion():
+                EndlessJSONEncoder(check_circular=False).encode(5j)
 
 
 class TestPyRecursion(TestRecursion, PyTest): pass
index 363ea29d3af2f7f8c1b4007b78f722821d7189b2..0a9d449078f107b1cec1ea045bc3aca29196a252 100644 (file)
@@ -5374,8 +5374,8 @@ for when, exp in (('S', 1),
                     print('currentSecond: %s' % currentSecond, file=sys.stderr)
                     print('r: %s' % r, file=sys.stderr)
                     print('result: %s' % result, file=sys.stderr)
-                except Exception:
-                    print('exception in diagnostic code: %s' % sys.exc_info()[1], file=sys.stderr)
+                except Exception as e:
+                    print('exception in diagnostic code: %s' % e, file=sys.stderr)
         self.assertEqual(exp, actual)
         rh.close()
     setattr(TimedRotatingFileHandlerTest, "test_compute_rollover_%s" % when, test_compute_rollover)
index 5d0615e99b4e4a32bd866f199da41b70a87b3cac..254b8f8a4aeb7a40a19b79e0c33f3b3822ab0f5b 100644 (file)
@@ -27,6 +27,13 @@ def tearDownModule():
 class MimeTypesTestCase(unittest.TestCase):
     def setUp(self):
         self.db = mimetypes.MimeTypes()
+        
+    def test_case_sensitivity(self):
+        eq = self.assertEqual
+        eq(self.db.guess_type("foobar.HTML"), self.db.guess_type("foobar.html"))
+        eq(self.db.guess_type("foobar.TGZ"), self.db.guess_type("foobar.tgz"))
+        eq(self.db.guess_type("foobar.tar.Z"), ("application/x-tar", "compress"))
+        eq(self.db.guess_type("foobar.tar.z"), (None, None))
 
     def test_default_data(self):
         eq = self.assertEqual
index 1663b1f1143ddcb8776193962f551c5a4b2f1236..97620258d82f6ba9b1d8c93a1db231a29b1a25d1 100644 (file)
@@ -6,10 +6,12 @@ import io
 from test import support
 import unittest
 
+import pyexpat
 import xml.dom.minidom
 
 from xml.dom.minidom import parse, Node, Document, parseString
 from xml.dom.minidom import getDOMImplementation
+from xml.parsers.expat import ExpatError
 
 
 tstfile = support.findfile("test.xml", subdir="xmltestdata")
@@ -1147,7 +1149,13 @@ class MinidomTest(unittest.TestCase):
 
         # Verify that character decoding errors raise exceptions instead
         # of crashing
-        self.assertRaises(UnicodeDecodeError, parseString,
+        if pyexpat.version_info >= (2, 4, 5):
+            self.assertRaises(ExpatError, parseString,
+                    b'<fran\xe7ais></fran\xe7ais>')
+            self.assertRaises(ExpatError, parseString,
+                    b'<franais>Comment \xe7a va ? Tr\xe8s bien ?</franais>')
+        else:
+            self.assertRaises(UnicodeDecodeError, parseString,
                 b'<fran\xe7ais>Comment \xe7a va ? Tr\xe8s bien ?</fran\xe7ais>')
 
         doc.unlink()
@@ -1609,7 +1617,12 @@ class MinidomTest(unittest.TestCase):
         self.confirm(doc2.namespaceURI == xml.dom.EMPTY_NAMESPACE)
 
     def testExceptionOnSpacesInXMLNSValue(self):
-        with self.assertRaisesRegex(ValueError, 'Unsupported syntax'):
+        if pyexpat.version_info >= (2, 4, 5):
+            context = self.assertRaisesRegex(ExpatError, 'syntax error')
+        else:
+            context = self.assertRaisesRegex(ValueError, 'Unsupported syntax')
+
+        with context:
             parseString('<element xmlns:abc="http:abc.com/de f g/hi/j k"><abc:foo /></element>')
 
     def testDocRemoveChild(self):
index 59ddf9e0b3c9193af2182417a43bf418b2f74c7e..e48157a3de26d4f768b571614a014d3c9353eb47 100644 (file)
@@ -708,12 +708,9 @@ class UtimeTests(unittest.TestCase):
     def test_utime_dir_fd(self):
         def set_time(filename, ns):
             dirname, name = os.path.split(filename)
-            dirfd = os.open(dirname, os.O_RDONLY)
-            try:
+            with support.open_dir_fd(dirname) as dirfd:
                 # pass dir_fd to test utimensat(timespec) or futimesat(timeval)
                 os.utime(name, dir_fd=dirfd, ns=ns)
-            finally:
-                os.close(dirfd)
         self._test_utime(set_time)
 
     def test_utime_directory(self):
@@ -4111,8 +4108,7 @@ class TestScandir(unittest.TestCase):
             os.symlink('file.txt', os.path.join(self.path, 'link'))
             expected_names.append('link')
 
-        fd = os.open(self.path, os.O_RDONLY)
-        try:
+        with support.open_dir_fd(self.path) as fd:
             with os.scandir(fd) as it:
                 entries = list(it)
             names = [entry.name for entry in entries]
@@ -4127,8 +4123,6 @@ class TestScandir(unittest.TestCase):
                     self.assertEqual(entry.stat(), st)
                     st = os.stat(entry.name, dir_fd=fd, follow_symlinks=False)
                     self.assertEqual(entry.stat(follow_symlinks=False), st)
-        finally:
-            os.close(fd)
 
     def test_empty_path(self):
         self.assertRaises(FileNotFoundError, os.scandir, '')
index cb9cd07b07143385be0bca31231ce4c3b2a0f0d4..58778300eee090e391de9b4c5d7a176c20ade48b 100644 (file)
@@ -1400,6 +1400,27 @@ def bÅ“r():
         self.assertNotIn(b'SyntaxError', stdout,
                          "Got a syntax error running test script under PDB")
 
+    def test_issue46434(self):
+        # Temporarily patch in an extra help command which doesn't have a
+        # docstring to emulate what happens in an embeddable distribution
+        script = """
+            def do_testcmdwithnodocs(self, arg):
+                pass
+
+            import pdb
+            pdb.Pdb.do_testcmdwithnodocs = do_testcmdwithnodocs
+        """
+        commands = """
+            continue
+            help testcmdwithnodocs
+        """
+        stdout, stderr = self.run_pdb_script(script, commands)
+        output = (stdout or '') + (stderr or '')
+        self.assertNotIn('AttributeError', output,
+                         'Calling help on a command with no docs should be handled gracefully')
+        self.assertIn("*** No help for 'testcmdwithnodocs'; __doc__ string missing", output,
+                      'Calling help on a command with no docs should print an error')
+
     def test_issue13183(self):
         script = """
             from bar import bar
index fa855f2104c586e77b35a66635113387499ac818..77f72fcc7c6e3bb4e0669307e63d000e397572e0 100644 (file)
@@ -1,7 +1,15 @@
-import os
-
+import os.path
+import unittest
+from test import support
 from test.support import load_package_tests
 
+
+if support.check_sanitizer(address=True, memory=True):
+    # bpo-46633: Skip the test because it is too slow when Python is built
+    # with ASAN/MSAN: between 5 and 20 minutes on GitHub Actions.
+    raise unittest.SkipTest("test too slow on ASAN/MSAN build")
+
+
 # Load all tests in package
 def load_tests(*args):
     return load_package_tests(os.path.dirname(__file__), *args)
index 890b7e04da36499b6127d6ecb1d403cca58d5705..a8db30679af8d27a08d5d346f2f5bd7c2c3a30e3 100644 (file)
@@ -18,6 +18,7 @@ import tempfile
 import unittest
 import warnings
 import textwrap
+from contextlib import contextmanager
 
 _DUMMY_SYMLINK = os.path.join(tempfile.gettempdir(),
                               support.TESTFN + '-dummy-symlink')
@@ -1055,176 +1056,6 @@ class PosixTester(unittest.TestCase):
         symdiff = idg_groups.symmetric_difference(posix.getgroups())
         self.assertTrue(not symdiff or symdiff == {posix.getegid()})
 
-    # tests for the posix *at functions follow
-
-    @unittest.skipUnless(os.access in os.supports_dir_fd, "test needs dir_fd support for os.access()")
-    def test_access_dir_fd(self):
-        f = posix.open(posix.getcwd(), posix.O_RDONLY)
-        try:
-            self.assertTrue(posix.access(support.TESTFN, os.R_OK, dir_fd=f))
-        finally:
-            posix.close(f)
-
-    @unittest.skipUnless(os.chmod in os.supports_dir_fd, "test needs dir_fd support in os.chmod()")
-    def test_chmod_dir_fd(self):
-        os.chmod(support.TESTFN, stat.S_IRUSR)
-
-        f = posix.open(posix.getcwd(), posix.O_RDONLY)
-        try:
-            posix.chmod(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
-
-            s = posix.stat(support.TESTFN)
-            self.assertEqual(s[0] & stat.S_IRWXU, stat.S_IRUSR | stat.S_IWUSR)
-        finally:
-            posix.close(f)
-
-    @unittest.skipUnless(os.chown in os.supports_dir_fd, "test needs dir_fd support in os.chown()")
-    def test_chown_dir_fd(self):
-        support.unlink(support.TESTFN)
-        support.create_empty_file(support.TESTFN)
-
-        f = posix.open(posix.getcwd(), posix.O_RDONLY)
-        try:
-            posix.chown(support.TESTFN, os.getuid(), os.getgid(), dir_fd=f)
-        finally:
-            posix.close(f)
-
-    @unittest.skipUnless(os.stat in os.supports_dir_fd, "test needs dir_fd support in os.stat()")
-    def test_stat_dir_fd(self):
-        support.unlink(support.TESTFN)
-        with open(support.TESTFN, 'w') as outfile:
-            outfile.write("testline\n")
-
-        f = posix.open(posix.getcwd(), posix.O_RDONLY)
-        try:
-            s1 = posix.stat(support.TESTFN)
-            s2 = posix.stat(support.TESTFN, dir_fd=f)
-            self.assertEqual(s1, s2)
-            s2 = posix.stat(support.TESTFN, dir_fd=None)
-            self.assertEqual(s1, s2)
-            self.assertRaisesRegex(TypeError, 'should be integer or None, not',
-                    posix.stat, support.TESTFN, dir_fd=posix.getcwd())
-            self.assertRaisesRegex(TypeError, 'should be integer or None, not',
-                    posix.stat, support.TESTFN, dir_fd=float(f))
-            self.assertRaises(OverflowError,
-                    posix.stat, support.TESTFN, dir_fd=10**20)
-        finally:
-            posix.close(f)
-
-    @unittest.skipUnless(os.utime in os.supports_dir_fd, "test needs dir_fd support in os.utime()")
-    def test_utime_dir_fd(self):
-        f = posix.open(posix.getcwd(), posix.O_RDONLY)
-        try:
-            now = time.time()
-            posix.utime(support.TESTFN, None, dir_fd=f)
-            posix.utime(support.TESTFN, dir_fd=f)
-            self.assertRaises(TypeError, posix.utime, support.TESTFN, now, dir_fd=f)
-            self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), dir_fd=f)
-            self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), dir_fd=f)
-            self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), dir_fd=f)
-            self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, "x"), dir_fd=f)
-            posix.utime(support.TESTFN, (int(now), int(now)), dir_fd=f)
-            posix.utime(support.TESTFN, (now, now), dir_fd=f)
-            posix.utime(support.TESTFN,
-                    (int(now), int((now - int(now)) * 1e9)), dir_fd=f)
-            posix.utime(support.TESTFN, dir_fd=f,
-                            times=(int(now), int((now - int(now)) * 1e9)))
-
-            # try dir_fd and follow_symlinks together
-            if os.utime in os.supports_follow_symlinks:
-                try:
-                    posix.utime(support.TESTFN, follow_symlinks=False, dir_fd=f)
-                except ValueError:
-                    # whoops!  using both together not supported on this platform.
-                    pass
-
-        finally:
-            posix.close(f)
-
-    @unittest.skipUnless(os.link in os.supports_dir_fd, "test needs dir_fd support in os.link()")
-    def test_link_dir_fd(self):
-        f = posix.open(posix.getcwd(), posix.O_RDONLY)
-        try:
-            posix.link(support.TESTFN, support.TESTFN + 'link', src_dir_fd=f, dst_dir_fd=f)
-        except PermissionError as e:
-            self.skipTest('posix.link(): %s' % e)
-        else:
-            # should have same inodes
-            self.assertEqual(posix.stat(support.TESTFN)[1],
-                posix.stat(support.TESTFN + 'link')[1])
-        finally:
-            posix.close(f)
-            support.unlink(support.TESTFN + 'link')
-
-    @unittest.skipUnless(os.mkdir in os.supports_dir_fd, "test needs dir_fd support in os.mkdir()")
-    def test_mkdir_dir_fd(self):
-        f = posix.open(posix.getcwd(), posix.O_RDONLY)
-        try:
-            posix.mkdir(support.TESTFN + 'dir', dir_fd=f)
-            posix.stat(support.TESTFN + 'dir') # should not raise exception
-        finally:
-            posix.close(f)
-            support.rmtree(support.TESTFN + 'dir')
-
-    @unittest.skipUnless((os.mknod in os.supports_dir_fd) and hasattr(stat, 'S_IFIFO'),
-                         "test requires both stat.S_IFIFO and dir_fd support for os.mknod()")
-    def test_mknod_dir_fd(self):
-        # Test using mknodat() to create a FIFO (the only use specified
-        # by POSIX).
-        support.unlink(support.TESTFN)
-        mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
-        f = posix.open(posix.getcwd(), posix.O_RDONLY)
-        try:
-            posix.mknod(support.TESTFN, mode, 0, dir_fd=f)
-        except OSError as e:
-            # Some old systems don't allow unprivileged users to use
-            # mknod(), or only support creating device nodes.
-            self.assertIn(e.errno, (errno.EPERM, errno.EINVAL, errno.EACCES))
-        else:
-            self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
-        finally:
-            posix.close(f)
-
-    @unittest.skipUnless(os.open in os.supports_dir_fd, "test needs dir_fd support in os.open()")
-    def test_open_dir_fd(self):
-        support.unlink(support.TESTFN)
-        with open(support.TESTFN, 'w') as outfile:
-            outfile.write("testline\n")
-        a = posix.open(posix.getcwd(), posix.O_RDONLY)
-        b = posix.open(support.TESTFN, posix.O_RDONLY, dir_fd=a)
-        try:
-            res = posix.read(b, 9).decode(encoding="utf-8")
-            self.assertEqual("testline\n", res)
-        finally:
-            posix.close(a)
-            posix.close(b)
-
-    @unittest.skipUnless(os.readlink in os.supports_dir_fd, "test needs dir_fd support in os.readlink()")
-    def test_readlink_dir_fd(self):
-        os.symlink(support.TESTFN, support.TESTFN + 'link')
-        f = posix.open(posix.getcwd(), posix.O_RDONLY)
-        try:
-            self.assertEqual(posix.readlink(support.TESTFN + 'link'),
-                posix.readlink(support.TESTFN + 'link', dir_fd=f))
-        finally:
-            support.unlink(support.TESTFN + 'link')
-            posix.close(f)
-
-    @unittest.skipUnless(os.rename in os.supports_dir_fd, "test needs dir_fd support in os.rename()")
-    def test_rename_dir_fd(self):
-        support.unlink(support.TESTFN)
-        support.create_empty_file(support.TESTFN + 'ren')
-        f = posix.open(posix.getcwd(), posix.O_RDONLY)
-        try:
-            posix.rename(support.TESTFN + 'ren', support.TESTFN, src_dir_fd=f, dst_dir_fd=f)
-        except:
-            posix.rename(support.TESTFN + 'ren', support.TESTFN)
-            raise
-        else:
-            posix.stat(support.TESTFN) # should not raise exception
-        finally:
-            posix.close(f)
-
     @unittest.skipUnless(hasattr(signal, 'SIGCHLD'), 'CLD_XXXX be placed in si_code for a SIGCHLD signal')
     @unittest.skipUnless(hasattr(os, 'waitid_result'), "test needs os.waitid_result")
     def test_cld_xxxx_constants(self):
@@ -1235,45 +1066,6 @@ class PosixTester(unittest.TestCase):
         os.CLD_STOPPED
         os.CLD_CONTINUED
 
-    @unittest.skipUnless(os.symlink in os.supports_dir_fd, "test needs dir_fd support in os.symlink()")
-    def test_symlink_dir_fd(self):
-        f = posix.open(posix.getcwd(), posix.O_RDONLY)
-        try:
-            posix.symlink(support.TESTFN, support.TESTFN + 'link', dir_fd=f)
-            self.assertEqual(posix.readlink(support.TESTFN + 'link'), support.TESTFN)
-        finally:
-            posix.close(f)
-            support.unlink(support.TESTFN + 'link')
-
-    @unittest.skipUnless(os.unlink in os.supports_dir_fd, "test needs dir_fd support in os.unlink()")
-    def test_unlink_dir_fd(self):
-        f = posix.open(posix.getcwd(), posix.O_RDONLY)
-        support.create_empty_file(support.TESTFN + 'del')
-        posix.stat(support.TESTFN + 'del') # should not raise exception
-        try:
-            posix.unlink(support.TESTFN + 'del', dir_fd=f)
-        except:
-            support.unlink(support.TESTFN + 'del')
-            raise
-        else:
-            self.assertRaises(OSError, posix.stat, support.TESTFN + 'link')
-        finally:
-            posix.close(f)
-
-    @unittest.skipUnless(os.mkfifo in os.supports_dir_fd, "test needs dir_fd support in os.mkfifo()")
-    def test_mkfifo_dir_fd(self):
-        support.unlink(support.TESTFN)
-        f = posix.open(posix.getcwd(), posix.O_RDONLY)
-        try:
-            try:
-                posix.mkfifo(support.TESTFN,
-                             stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
-            except PermissionError as e:
-                self.skipTest('posix.mkfifo(): %s' % e)
-            self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
-        finally:
-            posix.close(f)
-
     requires_sched_h = unittest.skipUnless(hasattr(posix, 'sched_yield'),
                                            "don't have scheduling support")
     requires_sched_affinity = unittest.skipUnless(hasattr(posix, 'sched_setaffinity'),
@@ -1480,6 +1272,200 @@ class PosixTester(unittest.TestCase):
         self.assertEqual(cm.exception.errno, errno.EINVAL)
         os.close(os.pidfd_open(os.getpid(), 0))
 
+
+# tests for the posix *at functions follow
+class TestPosixDirFd(unittest.TestCase):
+    count = 0
+
+    @contextmanager
+    def prepare(self):
+        TestPosixDirFd.count += 1
+        name = f'{support.TESTFN}_{self.count}'
+        base_dir = f'{support.TESTFN}_{self.count}base'
+        posix.mkdir(base_dir)
+        self.addCleanup(posix.rmdir, base_dir)
+        fullname = os.path.join(base_dir, name)
+        assert not os.path.exists(fullname)
+        with support.open_dir_fd(base_dir) as dir_fd:
+            yield (dir_fd, name, fullname)
+
+    @contextmanager
+    def prepare_file(self):
+        with self.prepare() as (dir_fd, name, fullname):
+            support.create_empty_file(fullname)
+            self.addCleanup(posix.unlink, fullname)
+            yield (dir_fd, name, fullname)
+
+    @unittest.skipUnless(os.access in os.supports_dir_fd, "test needs dir_fd support for os.access()")
+    def test_access_dir_fd(self):
+        with self.prepare_file() as (dir_fd, name, fullname):
+            self.assertTrue(posix.access(name, os.R_OK, dir_fd=dir_fd))
+
+    @unittest.skipUnless(os.chmod in os.supports_dir_fd, "test needs dir_fd support in os.chmod()")
+    def test_chmod_dir_fd(self):
+        with self.prepare_file() as (dir_fd, name, fullname):
+            posix.chmod(fullname, stat.S_IRUSR)
+            posix.chmod(name, stat.S_IRUSR | stat.S_IWUSR, dir_fd=dir_fd)
+            s = posix.stat(fullname)
+            self.assertEqual(s.st_mode & stat.S_IRWXU,
+                             stat.S_IRUSR | stat.S_IWUSR)
+
+    @unittest.skipUnless(hasattr(os, 'chown') and (os.chown in os.supports_dir_fd),
+                         "test needs dir_fd support in os.chown()")
+    def test_chown_dir_fd(self):
+        with self.prepare_file() as (dir_fd, name, fullname):
+            posix.chown(name, os.getuid(), os.getgid(), dir_fd=dir_fd)
+
+    @unittest.skipUnless(os.stat in os.supports_dir_fd, "test needs dir_fd support in os.stat()")
+    def test_stat_dir_fd(self):
+        with self.prepare() as (dir_fd, name, fullname):
+            with open(fullname, 'w') as outfile:
+                outfile.write("testline\n")
+            self.addCleanup(posix.unlink, fullname)
+
+            s1 = posix.stat(fullname)
+            s2 = posix.stat(name, dir_fd=dir_fd)
+            self.assertEqual(s1, s2)
+            s2 = posix.stat(fullname, dir_fd=None)
+            self.assertEqual(s1, s2)
+
+            self.assertRaisesRegex(TypeError, 'should be integer or None, not',
+                    posix.stat, name, dir_fd=posix.getcwd())
+            self.assertRaisesRegex(TypeError, 'should be integer or None, not',
+                    posix.stat, name, dir_fd=float(dir_fd))
+            self.assertRaises(OverflowError,
+                    posix.stat, name, dir_fd=10**20)
+
+    @unittest.skipUnless(os.utime in os.supports_dir_fd, "test needs dir_fd support in os.utime()")
+    def test_utime_dir_fd(self):
+        with self.prepare_file() as (dir_fd, name, fullname):
+            now = time.time()
+            posix.utime(name, None, dir_fd=dir_fd)
+            posix.utime(name, dir_fd=dir_fd)
+            self.assertRaises(TypeError, posix.utime, name,
+                              now, dir_fd=dir_fd)
+            self.assertRaises(TypeError, posix.utime, name,
+                              (None, None), dir_fd=dir_fd)
+            self.assertRaises(TypeError, posix.utime, name,
+                              (now, None), dir_fd=dir_fd)
+            self.assertRaises(TypeError, posix.utime, name,
+                              (None, now), dir_fd=dir_fd)
+            self.assertRaises(TypeError, posix.utime, name,
+                              (now, "x"), dir_fd=dir_fd)
+            posix.utime(name, (int(now), int(now)), dir_fd=dir_fd)
+            posix.utime(name, (now, now), dir_fd=dir_fd)
+            posix.utime(name,
+                    (int(now), int((now - int(now)) * 1e9)), dir_fd=dir_fd)
+            posix.utime(name, dir_fd=dir_fd,
+                            times=(int(now), int((now - int(now)) * 1e9)))
+
+            # try dir_fd and follow_symlinks together
+            if os.utime in os.supports_follow_symlinks:
+                try:
+                    posix.utime(name, follow_symlinks=False, dir_fd=dir_fd)
+                except ValueError:
+                    # whoops!  using both together not supported on this platform.
+                    pass
+
+    @unittest.skipUnless(os.link in os.supports_dir_fd, "test needs dir_fd support in os.link()")
+    def test_link_dir_fd(self):
+        with self.prepare_file() as (dir_fd, name, fullname), \
+             self.prepare() as (dir_fd2, linkname, fulllinkname):
+            try:
+                posix.link(name, linkname, src_dir_fd=dir_fd, dst_dir_fd=dir_fd2)
+            except PermissionError as e:
+                self.skipTest('posix.link(): %s' % e)
+            self.addCleanup(posix.unlink, fulllinkname)
+            # should have same inodes
+            self.assertEqual(posix.stat(fullname)[1],
+                posix.stat(fulllinkname)[1])
+
+    @unittest.skipUnless(os.mkdir in os.supports_dir_fd, "test needs dir_fd support in os.mkdir()")
+    def test_mkdir_dir_fd(self):
+        with self.prepare() as (dir_fd, name, fullname):
+            posix.mkdir(name, dir_fd=dir_fd)
+            self.addCleanup(posix.rmdir, fullname)
+            posix.stat(fullname) # should not raise exception
+
+    @unittest.skipUnless(hasattr(os, 'mknod')
+                         and (os.mknod in os.supports_dir_fd)
+                         and hasattr(stat, 'S_IFIFO'),
+                         "test requires both stat.S_IFIFO and dir_fd support for os.mknod()")
+    def test_mknod_dir_fd(self):
+        # Test using mknodat() to create a FIFO (the only use specified
+        # by POSIX).
+        with self.prepare() as (dir_fd, name, fullname):
+            mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
+            try:
+                posix.mknod(name, mode, 0, dir_fd=dir_fd)
+            except OSError as e:
+                # Some old systems don't allow unprivileged users to use
+                # mknod(), or only support creating device nodes.
+                self.assertIn(e.errno, (errno.EPERM, errno.EINVAL, errno.EACCES))
+            else:
+                self.addCleanup(posix.unlink, fullname)
+                self.assertTrue(stat.S_ISFIFO(posix.stat(fullname).st_mode))
+
+    @unittest.skipUnless(os.open in os.supports_dir_fd, "test needs dir_fd support in os.open()")
+    def test_open_dir_fd(self):
+        with self.prepare() as (dir_fd, name, fullname):
+            with open(fullname, 'wb') as outfile:
+                outfile.write(b"testline\n")
+            self.addCleanup(posix.unlink, fullname)
+            fd = posix.open(name, posix.O_RDONLY, dir_fd=dir_fd)
+            try:
+                res = posix.read(fd, 9)
+                self.assertEqual(b"testline\n", res)
+            finally:
+                posix.close(fd)
+
+    @unittest.skipUnless(hasattr(os, 'readlink') and (os.readlink in os.supports_dir_fd),
+                         "test needs dir_fd support in os.readlink()")
+    def test_readlink_dir_fd(self):
+        with self.prepare() as (dir_fd, name, fullname):
+            os.symlink('symlink', fullname)
+            self.addCleanup(posix.unlink, fullname)
+            self.assertEqual(posix.readlink(name, dir_fd=dir_fd), 'symlink')
+
+    @unittest.skipUnless(os.rename in os.supports_dir_fd, "test needs dir_fd support in os.rename()")
+    def test_rename_dir_fd(self):
+        with self.prepare_file() as (dir_fd, name, fullname), \
+             self.prepare() as (dir_fd2, name2, fullname2):
+            posix.rename(name, name2,
+                         src_dir_fd=dir_fd, dst_dir_fd=dir_fd2)
+            posix.stat(fullname2) # should not raise exception
+            posix.rename(fullname2, fullname)
+
+    @unittest.skipUnless(os.symlink in os.supports_dir_fd, "test needs dir_fd support in os.symlink()")
+    def test_symlink_dir_fd(self):
+        with self.prepare() as (dir_fd, name, fullname):
+            posix.symlink('symlink', name, dir_fd=dir_fd)
+            self.addCleanup(posix.unlink, fullname)
+            self.assertEqual(posix.readlink(fullname), 'symlink')
+
+    @unittest.skipUnless(os.unlink in os.supports_dir_fd, "test needs dir_fd support in os.unlink()")
+    def test_unlink_dir_fd(self):
+        with self.prepare() as (dir_fd, name, fullname):
+            support.create_empty_file(fullname)
+            posix.stat(fullname) # should not raise exception
+            try:
+                posix.unlink(name, dir_fd=dir_fd)
+                self.assertRaises(OSError, posix.stat, fullname)
+            except:
+                self.addCleanup(posix.unlink, fullname)
+                raise
+
+    @unittest.skipUnless(os.mkfifo in os.supports_dir_fd, "test needs dir_fd support in os.mkfifo()")
+    def test_mkfifo_dir_fd(self):
+        with self.prepare() as (dir_fd, name, fullname):
+            try:
+                posix.mkfifo(name, stat.S_IRUSR | stat.S_IWUSR, dir_fd=dir_fd)
+            except PermissionError as e:
+                self.skipTest('posix.mkfifo(): %s' % e)
+            self.addCleanup(posix.unlink, fullname)
+            self.assertTrue(stat.S_ISFIFO(posix.stat(fullname).st_mode))
+
+
 class PosixGroupsTester(unittest.TestCase):
 
     def setUp(self):
index 8dc62a933e872e73c378c5c3222f11a131182ca2..5936d7535edd5f317d83a691f106d644553e5257 100644 (file)
@@ -12,8 +12,8 @@ import unittest
 def get_tb():
     try:
         raise OSError()
-    except:
-        return sys.exc_info()[2]
+    except OSError as e:
+        return e.__traceback__
 
 
 class Context:
@@ -303,7 +303,7 @@ class TestContext(unittest.TestCase):
             except:
                 raise OSError()
         except OSError as e:
-            self.assertEqual(e.__context__, context)
+            self.assertIs(e.__context__, context)
         else:
             self.fail("No exception raised")
 
@@ -315,7 +315,7 @@ class TestContext(unittest.TestCase):
             except:
                 raise OSError()
         except OSError as e:
-            self.assertNotEqual(e.__context__, context)
+            self.assertIsNot(e.__context__, context)
             self.assertIsInstance(e.__context__, context)
         else:
             self.fail("No exception raised")
@@ -328,7 +328,7 @@ class TestContext(unittest.TestCase):
             except:
                 raise OSError
         except OSError as e:
-            self.assertNotEqual(e.__context__, context)
+            self.assertIsNot(e.__context__, context)
             self.assertIsInstance(e.__context__, context)
         else:
             self.fail("No exception raised")
@@ -415,6 +415,22 @@ class TestContext(unittest.TestCase):
         except NameError as e:
             self.assertIsNone(e.__context__.__context__)
 
+    def test_not_last(self):
+        # Context is not necessarily the last exception
+        context = Exception("context")
+        try:
+            raise context
+        except Exception:
+            try:
+                raise Exception("caught")
+            except Exception:
+                pass
+            try:
+                raise Exception("new")
+            except Exception as exc:
+                raised = exc
+        self.assertIs(raised.__context__, context)
+
     def test_3118(self):
         # deleting the generator caused the __context__ to be cleared
         def gen():
index ca2f4e28ae80b342758c1ce75cef711a94049a3a..ec7433c87d41c5daf32a2b5c5426d68e749f6390 100644 (file)
@@ -1799,6 +1799,192 @@ class TestWeirdBugs(unittest.TestCase):
         s = {0}
         s.update(other)
 
+
+class TestOperationsMutating:
+    """Regression test for bpo-46615"""
+
+    constructor1 = None
+    constructor2 = None
+
+    def make_sets_of_bad_objects(self):
+        class Bad:
+            def __eq__(self, other):
+                if not enabled:
+                    return False
+                if randrange(20) == 0:
+                    set1.clear()
+                if randrange(20) == 0:
+                    set2.clear()
+                return bool(randrange(2))
+            def __hash__(self):
+                return randrange(2)
+        # Don't behave poorly during construction.
+        enabled = False
+        set1 = self.constructor1(Bad() for _ in range(randrange(50)))
+        set2 = self.constructor2(Bad() for _ in range(randrange(50)))
+        # Now start behaving poorly
+        enabled = True
+        return set1, set2
+
+    def check_set_op_does_not_crash(self, function):
+        for _ in range(100):
+            set1, set2 = self.make_sets_of_bad_objects()
+            try:
+                function(set1, set2)
+            except RuntimeError as e:
+                # Just make sure we don't crash here.
+                self.assertIn("changed size during iteration", str(e))
+
+
+class TestBinaryOpsMutating(TestOperationsMutating):
+
+    def test_eq_with_mutation(self):
+        self.check_set_op_does_not_crash(lambda a, b: a == b)
+
+    def test_ne_with_mutation(self):
+        self.check_set_op_does_not_crash(lambda a, b: a != b)
+
+    def test_lt_with_mutation(self):
+        self.check_set_op_does_not_crash(lambda a, b: a < b)
+
+    def test_le_with_mutation(self):
+        self.check_set_op_does_not_crash(lambda a, b: a <= b)
+
+    def test_gt_with_mutation(self):
+        self.check_set_op_does_not_crash(lambda a, b: a > b)
+
+    def test_ge_with_mutation(self):
+        self.check_set_op_does_not_crash(lambda a, b: a >= b)
+
+    def test_and_with_mutation(self):
+        self.check_set_op_does_not_crash(lambda a, b: a & b)
+
+    def test_or_with_mutation(self):
+        self.check_set_op_does_not_crash(lambda a, b: a | b)
+
+    def test_sub_with_mutation(self):
+        self.check_set_op_does_not_crash(lambda a, b: a - b)
+
+    def test_xor_with_mutation(self):
+        self.check_set_op_does_not_crash(lambda a, b: a ^ b)
+
+    def test_iadd_with_mutation(self):
+        def f(a, b):
+            a &= b
+        self.check_set_op_does_not_crash(f)
+
+    def test_ior_with_mutation(self):
+        def f(a, b):
+            a |= b
+        self.check_set_op_does_not_crash(f)
+
+    def test_isub_with_mutation(self):
+        def f(a, b):
+            a -= b
+        self.check_set_op_does_not_crash(f)
+
+    def test_ixor_with_mutation(self):
+        def f(a, b):
+            a ^= b
+        self.check_set_op_does_not_crash(f)
+
+    def test_iteration_with_mutation(self):
+        def f1(a, b):
+            for x in a:
+                pass
+            for y in b:
+                pass
+        def f2(a, b):
+            for y in b:
+                pass
+            for x in a:
+                pass
+        def f3(a, b):
+            for x, y in zip(a, b):
+                pass
+        self.check_set_op_does_not_crash(f1)
+        self.check_set_op_does_not_crash(f2)
+        self.check_set_op_does_not_crash(f3)
+
+
+class TestBinaryOpsMutating_Set_Set(TestBinaryOpsMutating, unittest.TestCase):
+    constructor1 = set
+    constructor2 = set
+
+class TestBinaryOpsMutating_Subclass_Subclass(TestBinaryOpsMutating, unittest.TestCase):
+    constructor1 = SetSubclass
+    constructor2 = SetSubclass
+
+class TestBinaryOpsMutating_Set_Subclass(TestBinaryOpsMutating, unittest.TestCase):
+    constructor1 = set
+    constructor2 = SetSubclass
+
+class TestBinaryOpsMutating_Subclass_Set(TestBinaryOpsMutating, unittest.TestCase):
+    constructor1 = SetSubclass
+    constructor2 = set
+
+
+class TestMethodsMutating(TestOperationsMutating):
+
+    def test_issubset_with_mutation(self):
+        self.check_set_op_does_not_crash(set.issubset)
+
+    def test_issuperset_with_mutation(self):
+        self.check_set_op_does_not_crash(set.issuperset)
+
+    def test_intersection_with_mutation(self):
+        self.check_set_op_does_not_crash(set.intersection)
+
+    def test_union_with_mutation(self):
+        self.check_set_op_does_not_crash(set.union)
+
+    def test_difference_with_mutation(self):
+        self.check_set_op_does_not_crash(set.difference)
+
+    def test_symmetric_difference_with_mutation(self):
+        self.check_set_op_does_not_crash(set.symmetric_difference)
+
+    def test_isdisjoint_with_mutation(self):
+        self.check_set_op_does_not_crash(set.isdisjoint)
+
+    def test_difference_update_with_mutation(self):
+        self.check_set_op_does_not_crash(set.difference_update)
+
+    def test_intersection_update_with_mutation(self):
+        self.check_set_op_does_not_crash(set.intersection_update)
+
+    def test_symmetric_difference_update_with_mutation(self):
+        self.check_set_op_does_not_crash(set.symmetric_difference_update)
+
+    def test_update_with_mutation(self):
+        self.check_set_op_does_not_crash(set.update)
+
+
+class TestMethodsMutating_Set_Set(TestMethodsMutating, unittest.TestCase):
+    constructor1 = set
+    constructor2 = set
+
+class TestMethodsMutating_Subclass_Subclass(TestMethodsMutating, unittest.TestCase):
+    constructor1 = SetSubclass
+    constructor2 = SetSubclass
+
+class TestMethodsMutating_Set_Subclass(TestMethodsMutating, unittest.TestCase):
+    constructor1 = set
+    constructor2 = SetSubclass
+
+class TestMethodsMutating_Subclass_Set(TestMethodsMutating, unittest.TestCase):
+    constructor1 = SetSubclass
+    constructor2 = set
+
+class TestMethodsMutating_Set_Dict(TestMethodsMutating, unittest.TestCase):
+    constructor1 = set
+    constructor2 = dict.fromkeys
+
+class TestMethodsMutating_Set_List(TestMethodsMutating, unittest.TestCase):
+    constructor1 = set
+    constructor2 = list
+
+
 # Application tests (based on David Eppstein's graph recipes ====================================
 
 def powerset(U):
index 95840d6ac0c5f4c49e8be7e07da564c433a2b615..6dab678c33067e96cdad0516c1b4cc3e518f3592 100644 (file)
@@ -4,7 +4,6 @@ Glossary:
     * errored    : Whitespace related problems present in file.
 """
 from unittest import TestCase, mock
-from unittest import mock
 import errno
 import os
 import tabnanny
@@ -292,8 +291,8 @@ class TestCommandLine(TestCase):
         _, out, err = script_helper.assert_python_ok('-m', 'tabnanny', *args)
         # Note: The `splitlines()` will solve the problem of CRLF(\r) added
         # by OS Windows.
-        out = out.decode('ascii')
-        err = err.decode('ascii')
+        out = os.fsdecode(out)
+        err = os.fsdecode(err)
         if partial:
             for std, output in ((stdout, out), (stderr, err)):
                 _output = output.splitlines()
index 06fb97212d8567b71c41fafc5864fc25e6e68fc8..1f48dbe4754726a19691e1cb30cb19d37f2645f8 100644 (file)
@@ -219,6 +219,25 @@ class UstarReadTest(ReadTest, unittest.TestCase):
     def test_issue14160(self):
         self._test_fileobj_link("symtype2", "ustar/regtype")
 
+    def test_add_dir_getmember(self):
+        # bpo-21987
+        self.add_dir_and_getmember('bar')
+        self.add_dir_and_getmember('a'*101)
+
+    def add_dir_and_getmember(self, name):
+        with support.temp_cwd():
+            with tarfile.open(tmpname, 'w') as tar:
+                try:
+                    os.mkdir(name)
+                    tar.add(name)
+                finally:
+                    os.rmdir(name)
+            with tarfile.open(tmpname) as tar:
+                self.assertEqual(
+                    tar.getmember(name),
+                    tar.getmember(name + '/')
+                )
+
 class GzipUstarReadTest(GzipTest, UstarReadTest):
     pass
 
@@ -1879,6 +1898,61 @@ class PaxWriteTest(GNUWriteTest):
         finally:
             tar.close()
 
+    def test_create_pax_header(self):
+        # The ustar header should contain values that can be
+        # represented reasonably, even if a better (e.g. higher
+        # precision) version is set in the pax header.
+        # Issue #45863
+
+        # values that should be kept
+        t = tarfile.TarInfo()
+        t.name = "foo"
+        t.mtime = 1000.1
+        t.size = 100
+        t.uid = 123
+        t.gid = 124
+        info = t.get_info()
+        header = t.create_pax_header(info, encoding="iso8859-1")
+        self.assertEqual(info['name'], "foo")
+        # mtime should be rounded to nearest second
+        self.assertIsInstance(info['mtime'], int)
+        self.assertEqual(info['mtime'], 1000)
+        self.assertEqual(info['size'], 100)
+        self.assertEqual(info['uid'], 123)
+        self.assertEqual(info['gid'], 124)
+        self.assertEqual(header,
+            b'././@PaxHeader' + bytes(86) \
+            + b'0000000\x000000000\x000000000\x0000000000020\x0000000000000\x00010205\x00 x' \
+            + bytes(100) + b'ustar\x0000'+ bytes(247) \
+            + b'16 mtime=1000.1\n' + bytes(496) + b'foo' + bytes(97) \
+            + b'0000644\x000000173\x000000174\x0000000000144\x0000000001750\x00006516\x00 0' \
+            + bytes(100) + b'ustar\x0000' + bytes(247))
+
+        # values that should be changed
+        t = tarfile.TarInfo()
+        t.name = "foo\u3374" # can't be represented in ascii
+        t.mtime = 10**10 # too big
+        t.size = 10**10 # too big
+        t.uid = 8**8 # too big
+        t.gid = 8**8+1 # too big
+        info = t.get_info()
+        header = t.create_pax_header(info, encoding="iso8859-1")
+        # name is kept as-is in info but should be added to pax header
+        self.assertEqual(info['name'], "foo\u3374")
+        self.assertEqual(info['mtime'], 0)
+        self.assertEqual(info['size'], 0)
+        self.assertEqual(info['uid'], 0)
+        self.assertEqual(info['gid'], 0)
+        self.assertEqual(header,
+            b'././@PaxHeader' + bytes(86) \
+            + b'0000000\x000000000\x000000000\x0000000000130\x0000000000000\x00010207\x00 x' \
+            + bytes(100) + b'ustar\x0000' + bytes(247) \
+            + b'15 path=foo\xe3\x8d\xb4\n16 uid=16777216\n' \
+            + b'16 gid=16777217\n20 size=10000000000\n' \
+            + b'21 mtime=10000000000\n'+ bytes(424) + b'foo?' + bytes(96) \
+            + b'0000644\x000000000\x000000000\x0000000000000\x0000000000000\x00006540\x00 0' \
+            + bytes(100) + b'ustar\x0000' + bytes(247))
+
 
 class UnicodeTest:
 
index be9fb5ad5f0b178dfee93dfd2144193d893672fb..008ba2833a7d76f7af9306fc3beca9928d139ec7 100644 (file)
@@ -544,20 +544,26 @@ class TimeTestCase(unittest.TestCase):
         self.assertRaises(ValueError, time.ctime, float("nan"))
 
     def test_get_clock_info(self):
-        clocks = ['monotonic', 'perf_counter', 'process_time', 'time']
+        clocks = [
+            'monotonic',
+            'perf_counter',
+            'process_time',
+            'time',
+            'thread_time',
+        ]
 
         for name in clocks:
-            info = time.get_clock_info(name)
-
-            #self.assertIsInstance(info, dict)
-            self.assertIsInstance(info.implementation, str)
-            self.assertNotEqual(info.implementation, '')
-            self.assertIsInstance(info.monotonic, bool)
-            self.assertIsInstance(info.resolution, float)
-            # 0.0 < resolution <= 1.0
-            self.assertGreater(info.resolution, 0.0)
-            self.assertLessEqual(info.resolution, 1.0)
-            self.assertIsInstance(info.adjustable, bool)
+            with self.subTest(name=name):
+                info = time.get_clock_info(name)
+
+                self.assertIsInstance(info.implementation, str)
+                self.assertNotEqual(info.implementation, '')
+                self.assertIsInstance(info.monotonic, bool)
+                self.assertIsInstance(info.resolution, float)
+                # 0.0 < resolution <= 1.0
+                self.assertGreater(info.resolution, 0.0)
+                self.assertLessEqual(info.resolution, 1.0)
+                self.assertIsInstance(info.adjustable, bool)
 
         self.assertRaises(ValueError, time.get_clock_info, 'xxx')
 
index e6ea3d07444ce7bbd10e14689158ea238602d00f..9dbf9b240b4fc21ef8f5d82edd2aa92547fc827b 100644 (file)
@@ -1,7 +1,12 @@
 import unittest
 from test import support
+from test.support import check_sanitizer
 import sys
 
+if check_sanitizer(address=True, memory=True):
+    raise unittest.SkipTest("Tests involvin libX11 can SEGFAULT on ASAN/MSAN builds")
+
+
 # Skip this test if the _tkinter module wasn't built.
 _tkinter = support.import_module('_tkinter')
 
index d45acbfc6e1a818024f6edc825b92f08d846588d..577ed133ee90762b442ba14ff5ab164abc6ac3a1 100644 (file)
@@ -1,4 +1,10 @@
+import unittest
 from test import support
+from test.support import check_sanitizer
+
+if check_sanitizer(address=True, memory=True):
+    raise unittest.SkipTest("Tests involvin libX11 can SEGFAULT on ASAN/MSAN builds")
+
 # Skip test if _tkinter wasn't built.
 support.import_module('_tkinter')
 
index eb9acad677d58a3d03476f87a81c0e24faebddf0..3b5c5b2df5f1dff4acdb8c1f52673ffca2fdebc8 100644 (file)
@@ -5,6 +5,13 @@ import os.path
 import unittest
 from test import support
 
+
+if support.check_sanitizer(address=True, memory=True):
+    # bpo-46633: Skip the test because it is too slow when Python is built
+    # with ASAN/MSAN: between 5 and 20 minutes on GitHub Actions.
+    raise unittest.SkipTest("test too slow on ASAN/MSAN build")
+
+
 basepath = os.path.normpath(
         os.path.dirname(                 # <src/install dir>
             os.path.dirname(                # Lib
index 0b57d5a0d6c25e58b8fd6cb19dab0bb1510bf919..e62636637c35f8b01863d322aca96fc4794838b1 100644 (file)
@@ -1,5 +1,9 @@
 import unittest
 from test import support
+from test.support import check_sanitizer
+
+if check_sanitizer(address=True, memory=True):
+    raise unittest.SkipTest("Tests involvin libX11 can SEGFAULT on ASAN/MSAN builds")
 
 # Skip this test if _tkinter wasn't built.
 support.import_module('_tkinter')
index d8ad1ce2dff0364d9018f32e1257486e07818427..14a4a429a447978ebba9543453bf01e823546ca2 100644 (file)
@@ -232,7 +232,7 @@ class TestVec2D(VectorComparisonMixin, unittest.TestCase):
         self.assertVectorsAlmostEqual(-vec, expected)
 
     def test_distance(self):
-        self.assertEqual(abs(Vec2D(6, 8)), 10)
+        self.assertAlmostEqual(abs(Vec2D(6, 8)), 10)
         self.assertEqual(abs(Vec2D(0, 0)), 0)
         self.assertAlmostEqual(abs(Vec2D(2.5, 6)), 6.5)
 
index 8cdb1166c847f7cc89b41ec80353459149226ed8..08eddb095d561438233f64a1bccdb45492d6f99c 100644 (file)
@@ -304,6 +304,15 @@ class UnionTests(BaseTestCase):
         u = Union[list[int], dict[str, float]]
         self.assertEqual(repr(u), 'typing.Union[list[int], dict[str, float]]')
 
+        u = Union[None, str]
+        self.assertEqual(repr(u), 'typing.Optional[str]')
+        u = Union[str, None]
+        self.assertEqual(repr(u), 'typing.Optional[str]')
+        u = Union[None, str, int]
+        self.assertEqual(repr(u), 'typing.Union[NoneType, str, int]')
+        u = Optional[str]
+        self.assertEqual(repr(u), 'typing.Optional[str]')
+
     def test_cannot_subclass(self):
         with self.assertRaises(TypeError):
             class C(Union):
@@ -2446,10 +2455,18 @@ class ForwardRefTests(BaseTestCase):
         with self.assertRaises(TypeError):
             issubclass(int, fr)
 
+    def test_forwardref_only_str_arg(self):
+        with self.assertRaises(TypeError):
+            typing.ForwardRef(1)  # only `str` type is allowed
+
     def test_forward_equality(self):
         fr = typing.ForwardRef('int')
         self.assertEqual(fr, typing.ForwardRef('int'))
         self.assertNotEqual(List['int'], List[int])
+        self.assertNotEqual(fr, typing.ForwardRef('int', module=__name__))
+        frm = typing.ForwardRef('int', module=__name__)
+        self.assertEqual(frm, typing.ForwardRef('int', module=__name__))
+        self.assertNotEqual(frm, typing.ForwardRef('int', module='__other_name__'))
 
     def test_forward_equality_gth(self):
         c1 = typing.ForwardRef('C')
@@ -2486,6 +2503,14 @@ class ForwardRefTests(BaseTestCase):
         self.assertEqual(hash(c1_gth), hash(c2_gth))
         self.assertEqual(hash(c1), hash(c1_gth))
 
+        c3 = typing.ForwardRef('int', module=__name__)
+        c4 = typing.ForwardRef('int', module='__other_name__')
+
+        self.assertNotEqual(hash(c3), hash(c1))
+        self.assertNotEqual(hash(c3), hash(c1_gth))
+        self.assertNotEqual(hash(c3), hash(c4))
+        self.assertEqual(hash(c3), hash(typing.ForwardRef('int', module=__name__)))
+
     def test_forward_equality_namespace(self):
         class A:
             pass
@@ -2614,6 +2639,20 @@ class ForwardRefTests(BaseTestCase):
         self.assertEqual(get_type_hints(foo, globals(), locals()),
                          {'a': Callable[..., T]})
 
+    def test_special_forms_forward(self):
+
+        class C:
+            a: Annotated['ClassVar[int]', (3, 5)] = 4
+            b: Annotated['Final[int]', "const"] = 4
+
+        class CF:
+            b: List['Final[int]'] = 4
+
+        self.assertEqual(get_type_hints(C, globals())['a'], ClassVar[int])
+        self.assertEqual(get_type_hints(C, globals())['b'], Final[int])
+        with self.assertRaises(TypeError):
+            get_type_hints(CF, globals()),
+
     def test_syntax_error(self):
 
         with self.assertRaises(SyntaxError):
@@ -3230,11 +3269,10 @@ class CollectionsAbcTests(BaseTestCase):
         self.assertNotIsInstance(42, typing.Container)
 
     def test_collection(self):
-        if hasattr(typing, 'Collection'):
-            self.assertIsInstance(tuple(), typing.Collection)
-            self.assertIsInstance(frozenset(), typing.Collection)
-            self.assertIsSubclass(dict, typing.Collection)
-            self.assertNotIsInstance(42, typing.Collection)
+        self.assertIsInstance(tuple(), typing.Collection)
+        self.assertIsInstance(frozenset(), typing.Collection)
+        self.assertIsSubclass(dict, typing.Collection)
+        self.assertNotIsInstance(42, typing.Collection)
 
     def test_abstractset(self):
         self.assertIsInstance(set(), typing.AbstractSet)
@@ -4136,6 +4174,13 @@ class RETests(BaseTestCase):
 
 class AnnotatedTests(BaseTestCase):
 
+    def test_new(self):
+        with self.assertRaisesRegex(
+            TypeError,
+            'Type Annotated cannot be instantiated',
+        ):
+            Annotated()
+
     def test_repr(self):
         self.assertEqual(
             repr(Annotated[int, 4, 5]),
@@ -4220,6 +4265,14 @@ class AnnotatedTests(BaseTestCase):
         A.x = 5
         self.assertEqual(C.x, 5)
 
+    def test_special_form_containment(self):
+        class C:
+            classvar: Annotated[ClassVar[int], "a decoration"] = 4
+            const: Annotated[Final[int], "Const"] = 4
+
+        self.assertEqual(get_type_hints(C, globals())['classvar'], ClassVar[int])
+        self.assertEqual(get_type_hints(C, globals())['const'], Final[int])
+
     def test_hash_eq(self):
         self.assertEqual(len({Annotated[int, 4, 5], Annotated[int, 4, 5]}), 1)
         self.assertNotEqual(Annotated[int, 4, 5], Annotated[int, 5, 4])
@@ -4243,6 +4296,10 @@ class AnnotatedTests(BaseTestCase):
         with self.assertRaises(TypeError):
             issubclass(int, Annotated[int, "positive"])
 
+    def test_too_few_type_args(self):
+        with self.assertRaisesRegex(TypeError, 'at least two arguments'):
+            Annotated[int]
+
     def test_pickle(self):
         samples = [typing.Any, typing.Union[int, str],
                    typing.Optional[str], Tuple[int, ...],
@@ -4317,8 +4374,9 @@ class AllTests(BaseTestCase):
         self.assertIn('ValuesView', a)
         self.assertIn('cast', a)
         self.assertIn('overload', a)
-        if hasattr(contextlib, 'AbstractContextManager'):
-            self.assertIn('ContextManager', a)
+        # Context managers.
+        self.assertIn('ContextManager', a)
+        self.assertIn('AsyncContextManager', a)
         # Check that io and re are not exported.
         self.assertNotIn('io', a)
         self.assertNotIn('re', a)
@@ -4332,8 +4390,6 @@ class AllTests(BaseTestCase):
         self.assertIn('SupportsComplex', a)
 
     def test_all_exported_names(self):
-        import typing
-
         actual_all = set(typing.__all__)
         computed_all = {
             k for k, v in vars(typing).items()
index 12c3f4dbd5bf087764e211523ff88f00ba46704c..4ddf51073b0dd1aa0cd5b9d7a10232e666e6b247 100644 (file)
@@ -162,7 +162,6 @@ class RequestHdrsTests(unittest.TestCase):
         self.assertEqual(find_user_pass("Some Realm",
                                         "http://example.com/spam"),
                          ('joe', 'password'))
-
         self.assertEqual(find_user_pass("Some Realm",
                                         "http://example.com/spam/spam"),
                          ('joe', 'password'))
@@ -171,12 +170,29 @@ class RequestHdrsTests(unittest.TestCase):
 
         add("c", "http://example.com/foo", "foo", "ni")
         add("c", "http://example.com/bar", "bar", "nini")
+        add("c", "http://example.com/foo/bar", "foobar", "nibar")
 
         self.assertEqual(find_user_pass("c", "http://example.com/foo"),
                          ('foo', 'ni'))
-
         self.assertEqual(find_user_pass("c", "http://example.com/bar"),
                          ('bar', 'nini'))
+        self.assertEqual(find_user_pass("c", "http://example.com/foo/"),
+                         ('foo', 'ni'))
+        self.assertEqual(find_user_pass("c", "http://example.com/foo/bar"),
+                         ('foo', 'ni'))
+        self.assertEqual(find_user_pass("c", "http://example.com/foo/baz"),
+                         ('foo', 'ni'))
+        self.assertEqual(find_user_pass("c", "http://example.com/foobar"),
+                         (None, None))
+
+        add("c", "http://example.com/baz/", "baz", "ninini")
+
+        self.assertEqual(find_user_pass("c", "http://example.com/baz"),
+                         (None, None))
+        self.assertEqual(find_user_pass("c", "http://example.com/baz/"),
+                         ('baz', 'ninini'))
+        self.assertEqual(find_user_pass("c", "http://example.com/baz/bar"),
+                         ('baz', 'ninini'))
 
         # For the same path, newer password should be considered.
 
@@ -1656,8 +1672,9 @@ class HandlerTests(unittest.TestCase):
         auth_prior_handler.add_password(
             None, request_url, user, password, is_authenticated=True)
 
-        is_auth = pwd_manager.is_authenticated(request_url)
-        self.assertTrue(is_auth)
+        self.assertTrue(pwd_manager.is_authenticated(request_url))
+        self.assertTrue(pwd_manager.is_authenticated(request_url + '/nested'))
+        self.assertFalse(pwd_manager.is_authenticated(request_url + 'plain'))
 
         opener = OpenerDirector()
         opener.add_handler(auth_prior_handler)
@@ -1786,22 +1803,6 @@ class MiscTests(unittest.TestCase):
         self.opener_has_handler(o, MyHTTPHandler)
         self.opener_has_handler(o, MyOtherHTTPHandler)
 
-    @unittest.skipUnless(support.is_resource_enabled('network'),
-                         'test requires network access')
-    def test_issue16464(self):
-        with socket_helper.transient_internet("http://www.example.com/"):
-            opener = urllib.request.build_opener()
-            request = urllib.request.Request("http://www.example.com/")
-            self.assertEqual(None, request.data)
-
-            opener.open(request, "1".encode("us-ascii"))
-            self.assertEqual(b"1", request.data)
-            self.assertEqual("1", request.get_header("Content-length"))
-
-            opener.open(request, "1234567890".encode("us-ascii"))
-            self.assertEqual(b"1234567890", request.data)
-            self.assertEqual("10", request.get_header("Content-length"))
-
     def test_HTTPError_interface(self):
         """
         Issue 13211 reveals that HTTPError didn't implement the URLError
index 7c716341c702335756eaf2f498c8e2c792e6b09b..74374c08684da2f8bfdbb5e7d42ffae185da9f3b 100644 (file)
@@ -659,6 +659,24 @@ class TestUrlopen(unittest.TestCase):
                              (index, len(lines[index]), len(line)))
         self.assertEqual(index + 1, len(lines))
 
+    def test_issue16464(self):
+        # See https://bugs.python.org/issue16464
+        # and https://bugs.python.org/issue46648
+        handler = self.start_server([
+            (200, [], b'any'),
+            (200, [], b'any'),
+        ])
+        opener = urllib.request.build_opener()
+        request = urllib.request.Request("http://localhost:%s" % handler.port)
+        self.assertEqual(None, request.data)
+
+        opener.open(request, "1".encode("us-ascii"))
+        self.assertEqual(b"1", request.data)
+        self.assertEqual("1", request.get_header("Content-length"))
+
+        opener.open(request, "1234567890".encode("us-ascii"))
+        self.assertEqual(b"1234567890", request.data)
+        self.assertEqual("10", request.get_header("Content-length"))
 
 def setUpModule():
     thread_info = support.threading_setup()
index 23c4cd5eff0a9d1acd126e1c173d1dc484e4ac81..0f45fc71ce7736f44b1beee557084b888701883a 100644 (file)
@@ -640,6 +640,14 @@ class ElementTreeTest(unittest.TestCase):
                     'junk after document element: line 1, column 12')
             del cm, it
 
+        # Not exhausting the iterator still closes the resource (bpo-43292)
+        with support.check_no_resource_warning(self):
+            it = iterparse(TESTFN)
+            del it
+
+        with self.assertRaises(FileNotFoundError):
+            iterparse("nonexistent")
+
     def test_writefile(self):
         elem = ET.Element("tag")
         elem.text = "text"
@@ -740,6 +748,15 @@ class ElementTreeTest(unittest.TestCase):
                 ('end-ns', ''),
             ])
 
+    def test_initialize_parser_without_target(self):
+        # Explicit None
+        parser = ET.XMLParser(target=None)
+        self.assertIsInstance(parser.target, ET.TreeBuilder)
+
+        # Implicit None
+        parser2 = ET.XMLParser()
+        self.assertIsInstance(parser2.target, ET.TreeBuilder)
+
     def test_children(self):
         # Test Element children iteration
 
@@ -2159,12 +2176,6 @@ class BugsTest(unittest.TestCase):
                 b"<?xml version='1.0' encoding='ascii'?>\n"
                 b'<body>t&#227;g</body>')
 
-    def test_issue3151(self):
-        e = ET.XML('<prefix:localname xmlns:prefix="${stuff}"/>')
-        self.assertEqual(e.tag, '{${stuff}}localname')
-        t = ET.ElementTree(e)
-        self.assertEqual(ET.tostring(e), b'<ns0:localname xmlns:ns0="${stuff}" />')
-
     def test_issue6565(self):
         elem = ET.XML("<body><tag/></body>")
         self.assertEqual(summarize_list(elem), ['tag'])
index 999197a0e32dcc10770247a80f0dd0455f96912b..bd383d3f68552baa5e2b8cac5a89483192bd538c 100644 (file)
@@ -1,3 +1,4 @@
+import array
 import contextlib
 import importlib.util
 import io
@@ -1117,6 +1118,14 @@ class AbstractWriterTests:
             self.assertRaises(ValueError, w.write, b'')
             self.assertEqual(zipf.read('test'), data)
 
+    def test_issue44439(self):
+        q = array.array('Q', [1, 2, 3, 4, 5])
+        LENGTH = len(q) * q.itemsize
+        with zipfile.ZipFile(io.BytesIO(), 'w', self.compression) as zip:
+            with zip.open('data', 'w') as data:
+                self.assertEqual(data.write(q), LENGTH)
+            self.assertEqual(zip.getinfo('data').file_size, LENGTH)
+
 class StoredWriterTests(AbstractWriterTests, unittest.TestCase):
     compression = zipfile.ZIP_STORED
 
index 2e2438863da284ab7e431ca4a6bf8db6529fd842..b7347a384f1ab928b842b8ad5dad58de1d8aa24a 100644 (file)
@@ -628,8 +628,8 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase):
     def doTraceback(self, module):
         try:
             module.do_raise()
-        except:
-            tb = sys.exc_info()[2].tb_next
+        except Exception as e:
+            tb = e.__traceback__.tb_next
 
             f,lno,n,line = extract_tb(tb, 1)[0]
             self.assertEqual(line, raise_src.strip())
index da70d4115fa2384d43dc51fe12d64a228b2e262c..d35a2a5b0185be9e05bd3e0e73f59395cd47bb5e 100644 (file)
@@ -125,16 +125,16 @@ __all__ = [
 # legitimate imports of those modules.
 
 
-def _type_convert(arg, module=None):
+def _type_convert(arg, module=None, *, allow_special_forms=False):
     """For converting None to type(None), and strings to ForwardRef."""
     if arg is None:
         return type(None)
     if isinstance(arg, str):
-        return ForwardRef(arg, module=module)
+        return ForwardRef(arg, module=module, is_class=allow_special_forms)
     return arg
 
 
-def _type_check(arg, msg, is_argument=True, module=None, *, is_class=False):
+def _type_check(arg, msg, is_argument=True, module=None, *, allow_special_forms=False):
     """Check that the argument is a type, and return it (internal helper).
 
     As a special case, accept None and return type(None) instead. Also wrap strings
@@ -147,12 +147,12 @@ def _type_check(arg, msg, is_argument=True, module=None, *, is_class=False):
     We append the repr() of the actual value (truncated to 100 chars).
     """
     invalid_generic_forms = (Generic, Protocol)
-    if not is_class:
+    if not allow_special_forms:
         invalid_generic_forms += (ClassVar,)
         if is_argument:
             invalid_generic_forms += (Final,)
 
-    arg = _type_convert(arg, module=module)
+    arg = _type_convert(arg, module=module, allow_special_forms=allow_special_forms)
     if (isinstance(arg, _GenericAlias) and
             arg.__origin__ in invalid_generic_forms):
         raise TypeError(f"{arg} is not valid as type argument")
@@ -285,8 +285,8 @@ def _tp_cache(func=None, /, *, typed=False):
 def _eval_type(t, globalns, localns, recursive_guard=frozenset()):
     """Evaluate all forward references in the given type t.
     For use of globalns and localns see the docstring for get_type_hints().
-    recursive_guard is used to prevent prevent infinite recursion
-    with recursive ForwardRef.
+    recursive_guard is used to prevent infinite recursion with a recursive
+    ForwardRef.
     """
     if isinstance(t, ForwardRef):
         return t._evaluate(globalns, localns, recursive_guard)
@@ -554,7 +554,7 @@ class ForwardRef(_Final, _root=True):
                 eval(self.__forward_code__, globalns, localns),
                 "Forward references must evaluate to types.",
                 is_argument=self.__forward_is_argument__,
-                is_class=self.__forward_is_class__,
+                allow_special_forms=self.__forward_is_class__,
             )
             self.__forward_value__ = _eval_type(
                 type_, globalns, localns, recursive_guard | {self.__forward_arg__}
@@ -568,10 +568,11 @@ class ForwardRef(_Final, _root=True):
         if self.__forward_evaluated__ and other.__forward_evaluated__:
             return (self.__forward_arg__ == other.__forward_arg__ and
                     self.__forward_value__ == other.__forward_value__)
-        return self.__forward_arg__ == other.__forward_arg__
+        return (self.__forward_arg__ == other.__forward_arg__ and
+                self.__forward_module__ == other.__forward_module__)
 
     def __hash__(self):
-        return hash(self.__forward_arg__)
+        return hash((self.__forward_arg__, self.__forward_module__))
 
     def __repr__(self):
         return f'ForwardRef({self.__forward_arg__!r})'
@@ -704,7 +705,7 @@ class _BaseGenericAlias(_Final, _root=True):
 
     def __getattr__(self, attr):
         # We are careful for copy and pickle.
-        # Also for simplicity we just don't relay all dunder names
+        # Also for simplicity we don't relay any dunder names
         if '__origin__' in self.__dict__ and not _is_dunder(attr):
             return getattr(self.__origin__, attr)
         raise AttributeError(attr)
@@ -1336,7 +1337,7 @@ class Annotated:
                             "with at least two arguments (a type and an "
                             "annotation).")
         msg = "Annotated[t, ...]: t must be a type."
-        origin = _type_check(params[0], msg)
+        origin = _type_check(params[0], msg, allow_special_forms=True)
         metadata = tuple(params[1:])
         return _AnnotatedAlias(origin, metadata)
 
index 5c78274d093578da418f6d799b8462261b917b19..3f5442ed80951d2dc2ee7f159f03662de31d581b 100644 (file)
@@ -1557,9 +1557,9 @@ class _patch(object):
 def _get_target(target):
     try:
         target, attribute = target.rsplit('.', 1)
-    except (TypeError, ValueError):
-        raise TypeError("Need a valid target to patch. You supplied: %r" %
-                        (target,))
+    except (TypeError, ValueError, AttributeError):
+        raise TypeError(
+            f"Need a valid target to patch. You supplied: {target!r}")
     getter = lambda: _importer(target)
     return getter, attribute
 
index 111317b329a8521b5482a68d5f8962ba5772b6d9..528d223850e90589679f41bad0ca6589352e7361 100644 (file)
@@ -173,17 +173,9 @@ class TestResult(object):
     def _exc_info_to_string(self, err, test):
         """Converts a sys.exc_info()-style tuple of values into a string."""
         exctype, value, tb = err
-        # Skip test runner traceback levels
-        while tb and self._is_relevant_tb_level(tb):
-            tb = tb.tb_next
-
-        if exctype is test.failureException:
-            # Skip assert*() traceback levels
-            length = self._count_relevant_tb_levels(tb)
-        else:
-            length = None
+        tb = self._clean_tracebacks(exctype, value, tb, test)
         tb_e = traceback.TracebackException(
-            exctype, value, tb, limit=length, capture_locals=self.tb_locals)
+            exctype, value, tb, capture_locals=self.tb_locals)
         msgLines = list(tb_e.format())
 
         if self.buffer:
@@ -199,16 +191,49 @@ class TestResult(object):
                 msgLines.append(STDERR_LINE % error)
         return ''.join(msgLines)
 
+    def _clean_tracebacks(self, exctype, value, tb, test):
+        ret = None
+        first = True
+        excs = [(exctype, value, tb)]
+        while excs:
+            (exctype, value, tb) = excs.pop()
+            # Skip test runner traceback levels
+            while tb and self._is_relevant_tb_level(tb):
+                tb = tb.tb_next
+
+            # Skip assert*() traceback levels
+            if exctype is test.failureException:
+                self._remove_unittest_tb_frames(tb)
+
+            if first:
+                ret = tb
+                first = False
+            else:
+                value.__traceback__ = tb
+
+            if value is not None:
+                for c in (value.__cause__, value.__context__):
+                    if c is not None:
+                        excs.append((type(c), c, c.__traceback__))
+        return ret
 
     def _is_relevant_tb_level(self, tb):
         return '__unittest' in tb.tb_frame.f_globals
 
-    def _count_relevant_tb_levels(self, tb):
-        length = 0
+    def _remove_unittest_tb_frames(self, tb):
+        '''Truncates usercode tb at the first unittest frame.
+
+        If the first frame of the traceback is in user code,
+        the prefix up to the first unittest frame is returned.
+        If the first frame is already in the unittest module,
+        the traceback is not modified.
+        '''
+        prev = None
         while tb and not self._is_relevant_tb_level(tb):
-            length += 1
+            prev = tb
             tb = tb.tb_next
-        return length
+        if prev is not None:
+            prev.tb_next = None
 
     def __repr__(self):
         return ("<%s run=%i errors=%i failures=%i>" %
index 4746d71e0b60393ead8a114a724a66a94d979e48..b7fbbc1e7baddd4b8c2e60f6651b9d970330d67b 100644 (file)
@@ -6,7 +6,7 @@ import subprocess
 from test import support
 import unittest
 import unittest.test
-from .test_result import BufferedWriter
+from unittest.test.test_result import BufferedWriter
 
 
 class Test_TestProgram(unittest.TestCase):
index 2d29f79809d604d07f0b45710eb38cce4a7f22af..9f33d3bfe95e5aa754a85f7ce47fef4fdafc67a3 100644 (file)
@@ -221,6 +221,61 @@ class Test_TestResult(unittest.TestCase):
         self.assertIs(test_case, test)
         self.assertIsInstance(formatted_exc, str)
 
+    def test_addFailure_filter_traceback_frames(self):
+        class Foo(unittest.TestCase):
+            def test_1(self):
+                pass
+
+        test = Foo('test_1')
+        def get_exc_info():
+            try:
+                test.fail("foo")
+            except:
+                return sys.exc_info()
+
+        exc_info_tuple = get_exc_info()
+
+        full_exc = traceback.format_exception(*exc_info_tuple)
+
+        result = unittest.TestResult()
+        result.startTest(test)
+        result.addFailure(test, exc_info_tuple)
+        result.stopTest(test)
+
+        formatted_exc = result.failures[0][1]
+        dropped = [l for l in full_exc if l not in formatted_exc]
+        self.assertEqual(len(dropped), 1)
+        self.assertIn("raise self.failureException(msg)", dropped[0])
+
+    def test_addFailure_filter_traceback_frames_context(self):
+        class Foo(unittest.TestCase):
+            def test_1(self):
+                pass
+
+        test = Foo('test_1')
+        def get_exc_info():
+            try:
+                try:
+                    test.fail("foo")
+                except:
+                    raise ValueError(42)
+            except:
+                return sys.exc_info()
+
+        exc_info_tuple = get_exc_info()
+
+        full_exc = traceback.format_exception(*exc_info_tuple)
+
+        result = unittest.TestResult()
+        result.startTest(test)
+        result.addFailure(test, exc_info_tuple)
+        result.stopTest(test)
+
+        formatted_exc = result.failures[0][1]
+        dropped = [l for l in full_exc if l not in formatted_exc]
+        self.assertEqual(len(dropped), 1)
+        self.assertIn("raise self.failureException(msg)", dropped[0])
+
     # "addError(test, err)"
     # ...
     # "Called when the test case test raises an unexpected exception err
index 233a5afffaed4a5f6fbb65a398b1b40ce19b4a9f..8ab63a1317d3dfff905d9c0078b946e1c7398fae 100644 (file)
@@ -1933,8 +1933,13 @@ class PatchTest(unittest.TestCase):
 
 
     def test_invalid_target(self):
-        with self.assertRaises(TypeError):
-            patch('')
+        class Foo:
+            pass
+
+        for target in ['', 12, Foo()]:
+            with self.subTest(target=target):
+                with self.assertRaises(TypeError):
+                    patch(target)
 
 
     def test_cant_set_kwargs_when_passing_a_mock(self):
index bbdc2254e3cb2df274be7d4ec52aca10e9ae53da..4e289fc67df6cbeed094251d6676a1bc4bee2f37 100644 (file)
@@ -887,10 +887,10 @@ class HTTPPasswordMgr:
             return True
         if base[0] != test[0]:
             return False
-        common = posixpath.commonprefix((base[1], test[1]))
-        if len(common) == len(base[1]):
-            return True
-        return False
+        prefix = base[1]
+        if prefix[-1:] != '/':
+            prefix += '/'
+        return test[1].startswith(prefix)
 
 
 class HTTPPasswordMgrWithDefaultRealm(HTTPPasswordMgr):
index fde303c875ce8cc05ceed529015e9af7cf40657c..dae2251d859dafcc4de46fe2c6ea66774551b740 100644 (file)
@@ -1248,8 +1248,14 @@ def iterparse(source, events=None, parser=None):
     # Use the internal, undocumented _parser argument for now; When the
     # parser argument of iterparse is removed, this can be killed.
     pullparser = XMLPullParser(events=events, _parser=parser)
-    def iterator():
+
+    def iterator(source):
+        close_source = False
         try:
+            if not hasattr(source, "read"):
+                source = open(source, "rb")
+                close_source = True
+            yield None
             while True:
                 yield from pullparser.read_events()
                 # load event buffer
@@ -1265,16 +1271,12 @@ def iterparse(source, events=None, parser=None):
                 source.close()
 
     class IterParseIterator(collections.abc.Iterator):
-        __next__ = iterator().__next__
+        __next__ = iterator(source).__next__
     it = IterParseIterator()
     it.root = None
     del iterator, IterParseIterator
 
-    close_source = False
-    if not hasattr(source, "read"):
-        source = open(source, "rb")
-        close_source = True
-
+    next(it)
     return it
 
 
index 816f8582bbf6d5949537f1e42e1173b67bc4c19a..f72c6a4e0c25397651cfa6ffd566d94b400550f8 100644 (file)
@@ -1120,8 +1120,15 @@ class _ZipWriteFile(io.BufferedIOBase):
     def write(self, data):
         if self.closed:
             raise ValueError('I/O operation on closed file.')
-        nbytes = len(data)
+
+        # Accept any data that supports the buffer protocol
+        if isinstance(data, (bytes, bytearray)):
+            nbytes = len(data)
+        else:
+            data = memoryview(data)
+            nbytes = data.nbytes
         self._file_size += nbytes
+
         self._crc = crc32(data, self._crc)
         if self._compressor:
             data = self._compressor.compress(data)
index 3f5acfdf56648532bff961738c641e2b1cb36459..9909679e0713a35ab821f5075db04266974a3855 100755 (executable)
@@ -244,9 +244,9 @@ def library_recipes():
 
     result.extend([
           dict(
-              name="OpenSSL 1.1.1m",
-              url="https://www.openssl.org/source/openssl-1.1.1m.tar.gz",
-              checksum='8ec70f665c145c3103f6e330f538a9db',
+              name="OpenSSL 1.1.1n",
+              url="https://www.openssl.org/source/openssl-1.1.1n.tar.gz",
+              checksum='2aad5635f9bb338bc2c6b7d19cbc9676',
               buildrecipe=build_universal_openssl,
               configure=None,
               install=None,
@@ -356,9 +356,9 @@ def library_recipes():
                   ),
           ),
           dict(
-              name="SQLite 3.35.5",
-              url="https://sqlite.org/2021/sqlite-autoconf-3350500.tar.gz",
-              checksum='d1d1aba394c8e0443077dc9f1a681bb8',
+              name="SQLite 3.37.2",
+              url="https://sqlite.org/2022/sqlite-autoconf-3370200.tar.gz",
+              checksum='683cc5312ee74e71079c14d24b7a6d27',
               extra_cflags=('-Os '
                             '-DSQLITE_ENABLE_FTS5 '
                             '-DSQLITE_ENABLE_FTS4 '
index ac893acbf3e4644b6bc6663025ceea8ac2467486..2a26fdcd16b439d47944d2f481d59c33d1e2d862 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -418,6 +418,7 @@ Caleb Deveraux
 Catherine Devlin
 Scott Dial
 Alon Diamant
+Lital Natan
 Toby Dickenson
 Mark Dickinson
 Jack Diederich
@@ -665,6 +666,7 @@ Anders Hammarquist
 Mark Hammond
 Harald Hanche-Olsen
 Manus Hand
+Andreas Hangauer
 Milton L. Hankins
 Carl Bordum Hansen
 Stephen Hansen
@@ -1095,6 +1097,7 @@ Vincent Marchetti
 David Marek
 Doug Marien
 Sven Marnach
+John Marshall
 Alex Martelli
 Dennis MÃ¥rtensson
 Anthony Martin
@@ -1639,6 +1642,7 @@ Evgeny Sologubov
 Cody Somerville
 Anthony Sottile
 Edoardo Spadolini
+Tom Sparrow
 Geoffrey Spear
 Clay Spence
 Stefan Sperling
@@ -1832,6 +1836,7 @@ Wojtek Walczak
 Charles Waldman
 Richard Walker
 Larry Wall
+Jacob Walls
 Kevin Walzer
 Rodrigo Steinmuller Wanderley
 Dingyuan Wang
index 8ba8f2a7e611ec27bd5522392a24f70ff9232355..b8efb8fb9f013c70923d23e865e2c5d87cd9c393 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -2,6 +2,272 @@
 Python News
 +++++++++++
 
+What's New in Python 3.9.11 final?
+==================================
+
+*Release date: 2022-03-16*
+
+Core and Builtins
+-----------------
+
+- bpo-46852: Rename the private undocumented ``float.__set_format__()``
+  method to ``float.__setformat__()`` to fix a typo introduced in Python
+  3.7. The method is only used by test_float. Patch by Victor Stinner.
+
+- bpo-46794: Bump up the libexpat version into 2.4.6
+
+- bpo-46762: Fix an assert failure in debug builds when a '<', '>', or '='
+  is the last character in an f-string that's missing a closing right brace.
+
+- bpo-46732: Correct the docstring for the :meth:`__bool__` method. Patch by
+  Jelle Zijlstra.
+
+- bpo-40479: Add a missing call to ``va_end()`` in
+  ``Modules/_hashopenssl.c``.
+
+- bpo-46615: When iterating over sets internally in ``setobject.c``, acquire
+  strong references to the resulting items from the set.  This prevents
+  crashes in corner-cases of various set operations where the set gets
+  mutated.
+
+- bpo-43721: Fix docstrings of :attr:`~property.getter`,
+  :attr:`~property.setter`, and :attr:`~property.deleter` to clarify that
+  they create a new copy of the property.
+
+- bpo-46503: Fix an assert when parsing some invalid \N escape sequences in
+  f-strings.
+
+- bpo-46417: Fix a race condition on setting a type ``__bases__`` attribute:
+  the internal function ``add_subclass()`` now gets the
+  ``PyTypeObject.tp_subclasses`` member after calling
+  :c:func:`PyWeakref_NewRef` which can trigger a garbage collection which
+  can indirectly modify ``PyTypeObject.tp_subclasses``. Patch by Victor
+  Stinner.
+
+- bpo-46383: Fix invalid signature of ``_zoneinfo``'s ``module_free``
+  function to resolve a crash on wasm32-emscripten platform.
+
+Library
+-------
+
+- bpo-43253: Fix a crash when closing transports where the underlying socket
+  handle is already invalid on the Proactor event loop.
+
+- bpo-47004: Apply bugfixes from importlib_metadata 4.11.3, including bugfix
+  for EntryPoint.extras, which was returning match objects and not the
+  extras strings.
+
+- bpo-46985: Upgrade pip wheel bundled with ensurepip (pip 22.0.4)
+
+- bpo-46968: :mod:`faulthandler`: On Linux 5.14 and newer, dynamically
+  determine size of signal handler stack size CPython allocates using
+  ``getauxval(AT_MINSIGSTKSZ)``. This changes allows for Python extension's
+  request to Linux kernel to use AMX_TILE instruction set on Sapphire Rapids
+  Xeon processor to succeed, unblocking use of the ISA in frameworks.
+
+- bpo-46955: Expose :class:`asyncio.base_events.Server` as
+  :class:`asyncio.Server`. Patch by Stefan Zabka.
+
+- bpo-46932: Update bundled libexpat to 2.4.7
+
+- bpo-25707: Fixed a file leak in :func:`xml.etree.ElementTree.iterparse`
+  when the iterator is not exhausted. Patch by Jacob Walls.
+
+- bpo-44886: Inherit asyncio proactor datagram transport from
+  :class:`asyncio.DatagramTransport`.
+
+- bpo-46827: Support UDP sockets in  :meth:`asyncio.loop.sock_connect` for
+  selector-based event loops.  Patch by Thomas Grainger.
+
+- bpo-46811: Make test suite support Expat >=2.4.5
+
+- bpo-46252: Raise :exc:`TypeError` if :class:`ssl.SSLSocket` is passed to
+  transport-based APIs.
+
+- bpo-46784: Fix libexpat symbols collisions with user dynamically loaded or
+  statically linked libexpat in embedded Python.
+
+- bpo-39327: :func:`shutil.rmtree` can now work with VirtualBox shared
+  folders when running from the guest operating-system.
+
+- bpo-46756: Fix a bug in
+  :meth:`urllib.request.HTTPPasswordMgr.find_user_password` and
+  :meth:`urllib.request.HTTPPasswordMgrWithPriorAuth.is_authenticated` which
+  allowed to bypass authorization. For example, access to URI
+  ``example.org/foobar`` was allowed if the user was authorized for URI
+  ``example.org/foo``.
+
+- bpo-45863: When the :mod:`tarfile` module creates a pax format archive, it
+  will put an integer representation of timestamps in the ustar header (if
+  possible) for the benefit of older unarchivers, in addition to the
+  existing full-precision timestamps in the pax extended header.
+
+- bpo-46672: Fix ``NameError`` in :func:`asyncio.gather` when initial type
+  check fails.
+
+- bpo-45948: Fixed a discrepancy in the C implementation of the
+  :mod:`xml.etree.ElementTree` module. Now, instantiating an
+  :class:`xml.etree.ElementTree.XMLParser` with a ``target=None`` keyword
+  provides a default :class:`xml.etree.ElementTree.TreeBuilder` target as
+  the Python implementation does.
+
+- bpo-46591: Make the IDLE doc URL on the About IDLE dialog clickable.
+
+- bpo-46400: expat: Update libexpat from 2.4.1 to 2.4.4
+
+- bpo-46487: Add the ``get_write_buffer_limits`` method to
+  :class:`asyncio.transports.WriteTransport` and to the SSL transport.
+
+- bpo-46539: In :func:`typing.get_type_hints`, support evaluating
+  stringified ``ClassVar`` and ``Final`` annotations inside ``Annotated``.
+  Patch by Gregory Beauregard.
+
+- bpo-46491: Allow :data:`typing.Annotated` to wrap :data:`typing.Final` and
+  :data:`typing.ClassVar`. Patch by Gregory Beauregard.
+
+- bpo-46436: Fix command-line option ``-d``/``--directory`` in module
+  :mod:`http.server` which is ignored when combined with command-line option
+  ``--cgi``. Patch by Géry Ogam.
+
+- bpo-41403: Make :meth:`mock.patch` raise a :exc:`TypeError` with a
+  relevant error message on invalid arg. Previously it allowed a cryptic
+  :exc:`AttributeError` to escape.
+
+- bpo-46474: In ``importlib.metadata.EntryPoint.pattern``, avoid potential
+  REDoS by limiting ambiguity in consecutive whitespace.
+
+- bpo-46469: :mod:`asyncio` generic classes now return
+  :class:`types.GenericAlias` in ``__class_getitem__`` instead of the same
+  class.
+
+- bpo-46434: :mod:`pdb` now gracefully handles ``help`` when :attr:`__doc__`
+  is missing, for example when run with pregenerated optimized ``.pyc``
+  files.
+
+- bpo-46333: The :meth:`__eq__` and :meth:`__hash__` methods of
+  :class:`typing.ForwardRef` now honor the ``module`` parameter of
+  :class:`typing.ForwardRef`. Forward references from different modules are
+  now differentiated.
+
+- bpo-43118: Fix a bug in :func:`inspect.signature` that was causing it to
+  fail on some subclasses of classes with a ``__text_signature__``
+  referencing module globals. Patch by Weipeng Hong.
+
+- bpo-21987: Fix an issue with :meth:`tarfile.TarFile.getmember` getting a
+  directory name with a trailing slash.
+
+- bpo-20392: Fix inconsistency with uppercase file extensions in
+  :meth:`MimeTypes.guess_type`. Patch by Kumar Aditya.
+
+- bpo-46080: Fix exception in argparse help text generation if a
+  :class:`argparse.BooleanOptionalAction` argument's default is
+  ``argparse.SUPPRESS`` and it has ``help`` specified.  Patch by Felix
+  Fontein.
+
+- bpo-44439: Fix ``.write()`` method of a member file in ``ZipFile``, when
+  the input data is an object that supports the buffer protocol, the file
+  length may be wrong.
+
+- bpo-45703: When a namespace package is imported before another module from
+  the same namespace is created/installed in a different :data:`sys.path`
+  location while the program is running, calling the
+  :func:`importlib.invalidate_caches` function will now also guarantee the
+  new module is noticed.
+
+- bpo-24959: Fix bug where :mod:`unittest` sometimes drops frames from
+  tracebacks of exceptions raised in tests.
+
+Documentation
+-------------
+
+- bpo-46463: Fixes :file:`escape4chm.py` script used when building the CHM
+  documentation file
+
+Tests
+-----
+
+- bpo-46913: Fix test_faulthandler.test_sigfpe() if Python is built with
+  undefined behavior sanitizer (UBSAN): disable UBSAN on the
+  faulthandler_sigfpe() function. Patch by Victor Stinner.
+
+- bpo-46708: Prevent default asyncio event loop policy modification warning
+  after ``test_asyncio`` execution.
+
+- bpo-46616: Ensures ``test_importlib.test_windows`` cleans up registry keys
+  after completion.
+
+- bpo-44359: test_ftplib now silently ignores socket errors to prevent
+  logging unhandled threading exceptions. Patch by Victor Stinner.
+
+- bpo-46542: Fix a Python crash in test_lib2to3 when using Python built in
+  debug mode: limit the recursion limit. Patch by Victor Stinner.
+
+- bpo-46576: test_peg_generator now disables compiler optimization when
+  testing compilation of its own C extensions to significantly speed up the
+  testing on non-debug builds of CPython.
+
+- bpo-46542: Fix ``test_json`` tests checking for :exc:`RecursionError`:
+  modify these tests to use ``support.infinite_recursion()``. Patch by
+  Victor Stinner.
+
+- bpo-13886: Skip test_builtin PTY tests on non-ASCII characters if the
+  readline module is loaded. The readline module changes input() behavior,
+  but test_builtin is not intented to test the readline module. Patch by
+  Victor Stinner.
+
+Build
+-----
+
+- bpo-47024: Update OpenSSL to 1.1.1n for macOS installers and all Windows
+  builds.
+
+- bpo-38472: Fix GCC detection in setup.py when cross-compiling. The C
+  compiler is now run with LC_ALL=C. Previously, the detection failed with a
+  German locale.
+
+- bpo-46513: :program:`configure` no longer uses ``AC_C_CHAR_UNSIGNED``
+  macro and ``pyconfig.h`` no longer defines reserved symbol
+  ``__CHAR_UNSIGNED__``.
+
+- bpo-45925: Update Windows installer to use SQLite 3.37.2.
+
+- bpo-47032: Ensure Windows install builds fail correctly with a non-zero
+  exit code when part of the build fails.
+
+Windows
+-------
+
+- bpo-44549: Update bzip2 to 1.0.8 in Windows builds to mitigate
+  CVE-2016-3189 and CVE-2019-12900
+
+- bpo-46948: Prevent CVE-2022-26488 by ensuring the Add to PATH option in
+  the Windows installer uses the correct path when being repaired.
+
+- bpo-46638: Ensures registry virtualization is consistently disabled. For
+  3.10 and earlier, it remains enabled (some registry writes are protected),
+  while for 3.11 and later it is disabled (registry modifications affect all
+  applications).
+
+macOS
+-----
+
+- bpo-45925: Update macOS installer to SQLite 3.37.2.
+
+IDLE
+----
+
+- bpo-46630: Make query dialogs on Windows start with a cursor in the entry
+  box.
+
+- bpo-45296: Clarify close, quit, and exit in IDLE.  In the File menu,
+  'Close' and 'Exit' are now 'Close Window' (the current one) and 'Exit' is
+  now 'Exit IDLE' (by closing all windows).  In Shell, 'quit()' and 'exit()'
+  mean 'close Shell'. If there are no other windows, this also exits IDLE.
+
+- bpo-45447: Apply IDLE syntax highlighting to `.pyi` files. Patch by Alex
+  Waygood and Terry Jan Reedy.
+
+
 What's New in Python 3.9.10 final?
 ==================================
 
index a1421cf5dbec8295864361fe4ddac7f3d3de0e9b..b64069a25a7433f95083b2efdf6141be41761d6c 100644 (file)
@@ -1474,13 +1474,6 @@ finally:
     PyErr_Restore(error_type, error_value, error_traceback);
 }
 
-static PyObject *
-future_cls_getitem(PyObject *cls, PyObject *type)
-{
-    Py_INCREF(cls);
-    return cls;
-}
-
 static PyAsyncMethods FutureType_as_async = {
     (unaryfunc)future_new_iter,         /* am_await */
     0,                                  /* am_aiter */
@@ -1500,7 +1493,7 @@ static PyMethodDef FutureType_methods[] = {
     _ASYNCIO_FUTURE_GET_LOOP_METHODDEF
     _ASYNCIO_FUTURE__MAKE_CANCELLED_ERROR_METHODDEF
     _ASYNCIO_FUTURE__REPR_INFO_METHODDEF
-    {"__class_getitem__", future_cls_getitem, METH_O|METH_CLASS, NULL},
+    {"__class_getitem__", Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")},
     {NULL, NULL}        /* Sentinel */
 };
 
@@ -2487,13 +2480,6 @@ done:
     FutureObj_finalize((FutureObj*)task);
 }
 
-static PyObject *
-task_cls_getitem(PyObject *cls, PyObject *type)
-{
-    Py_INCREF(cls);
-    return cls;
-}
-
 static void TaskObj_dealloc(PyObject *);  /* Needs Task_CheckExact */
 
 static PyMethodDef TaskType_methods[] = {
@@ -2513,7 +2499,7 @@ static PyMethodDef TaskType_methods[] = {
     _ASYNCIO_TASK_GET_NAME_METHODDEF
     _ASYNCIO_TASK_SET_NAME_METHODDEF
     _ASYNCIO_TASK_GET_CORO_METHODDEF
-    {"__class_getitem__", task_cls_getitem, METH_O|METH_CLASS, NULL},
+    {"__class_getitem__", Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")},
     {NULL, NULL}        /* Sentinel */
 };
 
index d9c2a23ccb8588e0b56c7c6e95a49e9811e9a3e9..8d1b56b35d204f3db71b06f5824bbf39183f959c 100644 (file)
@@ -3636,7 +3636,7 @@ ignore_attribute_error(PyObject *value)
 _elementtree.XMLParser.__init__
 
     *
-    target: object = NULL
+    target: object = None
     encoding: str(accept={str, NoneType}) = None
 
 [clinic start generated code]*/
@@ -3644,7 +3644,7 @@ _elementtree.XMLParser.__init__
 static int
 _elementtree_XMLParser___init___impl(XMLParserObject *self, PyObject *target,
                                      const char *encoding)
-/*[clinic end generated code: output=3ae45ec6cdf344e4 input=53e35a829ae043e8]*/
+/*[clinic end generated code: output=3ae45ec6cdf344e4 input=7e716dd6e4f3e439]*/
 {
     self->entity = PyDict_New();
     if (!self->entity)
@@ -3669,7 +3669,7 @@ _elementtree_XMLParser___init___impl(XMLParserObject *self, PyObject *target,
                            (unsigned long)_Py_HashSecret.expat.hashsalt);
     }
 
-    if (target) {
+    if (target != Py_None) {
         Py_INCREF(target);
     } else {
         target = treebuilder_new(&TreeBuilder_Type, NULL, NULL);
index a488945082187803b937568a187198f0513d816d..4873bb11aa0cd677e8d1b42e4d8d277b6cea1b3b 100644 (file)
@@ -311,6 +311,7 @@ _setException(PyObject *exc, const char* altmsg, ...)
         } else {
             PyErr_FormatV(exc, altmsg, vargs);
         }
+        va_end(vargs);
         return NULL;
     }
     va_end(vargs);
index a8e55c34799bd5b02728461c0f2755a741930c77..0f150a3583d5ea76ccd3457234da450ace7cb189 100644 (file)
@@ -33,8 +33,7 @@ typedef struct {
 } iobase;
 
 PyDoc_STRVAR(iobase_doc,
-    "The abstract base class for all I/O classes, acting on streams of\n"
-    "bytes. There is no public constructor.\n"
+    "The abstract base class for all I/O classes.\n"
     "\n"
     "This class provides dummy implementations for many methods that\n"
     "derived classes can override selectively; the default implementations\n"
index 966c532a0e3c3063236241f55d2aed1e57ac84b9..f9903e250000669552e848ee0640b1c875517e71 100644 (file)
@@ -49,7 +49,7 @@ PyDoc_STRVAR(textiobase_doc,
     "\n"
     "This class provides a character and line based interface to stream\n"
     "I/O. There is no readinto method because Python's character strings\n"
-    "are immutable. There is no public constructor.\n"
+    "are immutable.\n"
     );
 
 static PyObject *
index 30e333a4b86d83011ea35452f51e660f145b8d1e..67688e875379000ea494ed2f214d3376228f1b84 100644 (file)
@@ -518,7 +518,11 @@ _pysqlite_set_result(sqlite3_context* context, PyObject* py_val)
             return -1;
         sqlite3_result_int64(context, value);
     } else if (PyFloat_Check(py_val)) {
-        sqlite3_result_double(context, PyFloat_AsDouble(py_val));
+        double value = PyFloat_AsDouble(py_val);
+        if (value == -1 && PyErr_Occurred()) {
+            return -1;
+        }
+        sqlite3_result_double(context, value);
     } else if (PyUnicode_Check(py_val)) {
         Py_ssize_t sz;
         const char *str = PyUnicode_AsUTF8AndSize(py_val, &sz);
@@ -1833,41 +1837,41 @@ static PyMethodDef connection_methods[] = {
     {"rollback", (PyCFunction)pysqlite_connection_rollback, METH_NOARGS,
         PyDoc_STR("Roll back the current transaction.")},
     {"create_function", (PyCFunction)(void(*)(void))pysqlite_connection_create_function, METH_VARARGS|METH_KEYWORDS,
-        PyDoc_STR("Creates a new function. Non-standard.")},
+        PyDoc_STR("Creates a new function.")},
     {"create_aggregate", (PyCFunction)(void(*)(void))pysqlite_connection_create_aggregate, METH_VARARGS|METH_KEYWORDS,
-        PyDoc_STR("Creates a new aggregate. Non-standard.")},
+        PyDoc_STR("Creates a new aggregate.")},
     {"set_authorizer", (PyCFunction)(void(*)(void))pysqlite_connection_set_authorizer, METH_VARARGS|METH_KEYWORDS,
-        PyDoc_STR("Sets authorizer callback. Non-standard.")},
+        PyDoc_STR("Sets authorizer callback.")},
     #ifdef HAVE_LOAD_EXTENSION
     {"enable_load_extension", (PyCFunction)pysqlite_enable_load_extension, METH_VARARGS,
-        PyDoc_STR("Enable dynamic loading of SQLite extension modules. Non-standard.")},
+        PyDoc_STR("Enable dynamic loading of SQLite extension modules.")},
     {"load_extension", (PyCFunction)pysqlite_load_extension, METH_VARARGS,
-        PyDoc_STR("Load SQLite extension module. Non-standard.")},
+        PyDoc_STR("Load SQLite extension module.")},
     #endif
     {"set_progress_handler", (PyCFunction)(void(*)(void))pysqlite_connection_set_progress_handler, METH_VARARGS|METH_KEYWORDS,
-        PyDoc_STR("Sets progress handler callback. Non-standard.")},
+        PyDoc_STR("Sets progress handler callback.")},
     {"set_trace_callback", (PyCFunction)(void(*)(void))pysqlite_connection_set_trace_callback, METH_VARARGS|METH_KEYWORDS,
-        PyDoc_STR("Sets a trace callback called for each SQL statement (passed as unicode). Non-standard.")},
+        PyDoc_STR("Sets a trace callback called for each SQL statement (passed as unicode).")},
     {"execute", (PyCFunction)pysqlite_connection_execute, METH_VARARGS,
-        PyDoc_STR("Executes a SQL statement. Non-standard.")},
+        PyDoc_STR("Executes an SQL statement.")},
     {"executemany", (PyCFunction)pysqlite_connection_executemany, METH_VARARGS,
-        PyDoc_STR("Repeatedly executes a SQL statement. Non-standard.")},
+        PyDoc_STR("Repeatedly executes an SQL statement.")},
     {"executescript", (PyCFunction)pysqlite_connection_executescript, METH_VARARGS,
-        PyDoc_STR("Executes a multiple SQL statements at once. Non-standard.")},
+        PyDoc_STR("Executes a multiple SQL statements at once.")},
     {"create_collation", (PyCFunction)pysqlite_connection_create_collation, METH_VARARGS,
-        PyDoc_STR("Creates a collation function. Non-standard.")},
+        PyDoc_STR("Creates a collation function.")},
     {"interrupt", (PyCFunction)pysqlite_connection_interrupt, METH_NOARGS,
-        PyDoc_STR("Abort any pending database operation. Non-standard.")},
+        PyDoc_STR("Abort any pending database operation.")},
     {"iterdump", (PyCFunction)pysqlite_connection_iterdump, METH_NOARGS,
-        PyDoc_STR("Returns iterator to the dump of the database in an SQL text format. Non-standard.")},
+        PyDoc_STR("Returns iterator to the dump of the database in an SQL text format.")},
     #ifdef HAVE_BACKUP_API
     {"backup", (PyCFunction)(void(*)(void))pysqlite_connection_backup, METH_VARARGS | METH_KEYWORDS,
-        PyDoc_STR("Makes a backup of the database. Non-standard.")},
+        PyDoc_STR("Makes a backup of the database.")},
     #endif
     {"__enter__", (PyCFunction)pysqlite_connection_enter, METH_NOARGS,
-        PyDoc_STR("For context manager. Non-standard.")},
+        PyDoc_STR("For context manager.")},
     {"__exit__", (PyCFunction)pysqlite_connection_exit, METH_VARARGS,
-        PyDoc_STR("For context manager. Non-standard.")},
+        PyDoc_STR("For context manager.")},
     {NULL, NULL}
 };
 
index dd0ce7e1ea6a3368d3e892bcc1c437f4f6f741ca..e2635e18c738ecc67c2ebd6bba2ffc4cd22ff2a5 100644 (file)
@@ -878,11 +878,11 @@ PyObject* pysqlite_cursor_close(pysqlite_Cursor* self, PyObject* args)
 
 static PyMethodDef cursor_methods[] = {
     {"execute", (PyCFunction)pysqlite_cursor_execute, METH_VARARGS,
-        PyDoc_STR("Executes a SQL statement.")},
+        PyDoc_STR("Executes an SQL statement.")},
     {"executemany", (PyCFunction)pysqlite_cursor_executemany, METH_VARARGS,
-        PyDoc_STR("Repeatedly executes a SQL statement.")},
+        PyDoc_STR("Repeatedly executes an SQL statement.")},
     {"executescript", (PyCFunction)pysqlite_cursor_executescript, METH_VARARGS,
-        PyDoc_STR("Executes a multiple SQL statements at once. Non-standard.")},
+        PyDoc_STR("Executes multiple SQL statements at once.")},
     {"fetchone", (PyCFunction)pysqlite_cursor_fetchone, METH_NOARGS,
         PyDoc_STR("Fetches one row from the resultset.")},
     {"fetchmany", (PyCFunction)(void(*)(void))pysqlite_cursor_fetchmany, METH_VARARGS|METH_KEYWORDS,
@@ -892,9 +892,9 @@ static PyMethodDef cursor_methods[] = {
     {"close", (PyCFunction)pysqlite_cursor_close, METH_NOARGS,
         PyDoc_STR("Closes the cursor.")},
     {"setinputsizes", (PyCFunction)pysqlite_noop, METH_VARARGS,
-        PyDoc_STR("Required by DB-API. Does nothing in pysqlite.")},
+        PyDoc_STR("Required by DB-API. Does nothing in sqlite3.")},
     {"setoutputsize", (PyCFunction)pysqlite_noop, METH_VARARGS,
-        PyDoc_STR("Required by DB-API. Does nothing in pysqlite.")},
+        PyDoc_STR("Required by DB-API. Does nothing in sqlite3.")},
     {NULL, NULL}
 };
 
index 5418c2b98fd7519dd235f40d146a2a0069f6281e..68c18d9355a6f555a53a889fed43d06578325506 100644 (file)
@@ -47,6 +47,6 @@ extern PyObject *pysqlite_microprotocols_adapt(
 extern PyObject *
     pysqlite_adapt(pysqlite_Cursor* self, PyObject *args);
 #define pysqlite_adapt_doc \
-    "adapt(obj, protocol, alternate) -> adapt obj to given protocol. Non-standard."
+    "adapt(obj, protocol, alternate) -> adapt obj to given protocol."
 
 #endif /* !defined(PSYCOPG_MICROPROTOCOLS_H) */
index 44811835d42fca9d636caf095406c09fed2c8b79..98909369e755a9a30acfadeb06742807fbcc8006 100644 (file)
@@ -121,7 +121,7 @@ static PyObject* module_complete(PyObject* self, PyObject* args, PyObject*
 PyDoc_STRVAR(module_complete_doc,
 "complete_statement(sql)\n\
 \n\
-Checks if a string contains a complete SQL statement. Non-standard.");
+Checks if a string contains a complete SQL statement.");
 
 #ifdef HAVE_SHARED_CACHE
 static PyObject* module_enable_shared_cache(PyObject* self, PyObject* args, PyObject*
@@ -149,8 +149,7 @@ static PyObject* module_enable_shared_cache(PyObject* self, PyObject* args, PyOb
 PyDoc_STRVAR(module_enable_shared_cache_doc,
 "enable_shared_cache(do_enable)\n\
 \n\
-Enable or disable shared cache mode for the calling thread.\n\
-Experimental/Non-standard.");
+Enable or disable shared cache mode for the calling thread.");
 #endif /* HAVE_SHARED_CACHE */
 
 static PyObject* module_register_adapter(PyObject* self, PyObject* args)
@@ -180,7 +179,7 @@ static PyObject* module_register_adapter(PyObject* self, PyObject* args)
 PyDoc_STRVAR(module_register_adapter_doc,
 "register_adapter(type, callable)\n\
 \n\
-Registers an adapter with pysqlite's adapter registry. Non-standard.");
+Registers an adapter with sqlite3's adapter registry.");
 
 static PyObject* module_register_converter(PyObject* self, PyObject* args)
 {
@@ -214,7 +213,7 @@ error:
 PyDoc_STRVAR(module_register_converter_doc,
 "register_converter(typename, callable)\n\
 \n\
-Registers a converter with pysqlite. Non-standard.");
+Registers a converter with sqlite3.");
 
 static PyObject* enable_callback_tracebacks(PyObject* self, PyObject* args)
 {
index 23c204e7521f00813696ca18442941d67743ca34..0272ce11207f1b87cd255941878f9e268ec0b635 100644 (file)
@@ -152,9 +152,16 @@ int pysqlite_statement_bind_parameter(pysqlite_Statement* self, int pos, PyObjec
                 rc = sqlite3_bind_int64(self->st, pos, value);
             break;
         }
-        case TYPE_FLOAT:
-            rc = sqlite3_bind_double(self->st, pos, PyFloat_AsDouble(parameter));
+        case TYPE_FLOAT: {
+            double value = PyFloat_AsDouble(parameter);
+            if (value == -1 && PyErr_Occurred()) {
+                rc = -1;
+            }
+            else {
+                rc = sqlite3_bind_double(self->st, pos, value);
+            }
             break;
+        }
         case TYPE_UNICODE:
             string = PyUnicode_AsUTF8AndSize(parameter, &buflen);
             if (string == NULL)
index 90498fb7a7897d65e411f4ab26c102ffa8753fb2..ba0eb738abcbc5de23616db22d18dd24373dd964 100644 (file)
@@ -1241,6 +1241,9 @@ tracemalloc_copy_domain(_Py_hashtable_t *domains,
     _Py_hashtable_t *traces = (_Py_hashtable_t *)value;
 
     _Py_hashtable_t *traces2 = tracemalloc_copy_traces(traces);
+    if (traces2 == NULL) {
+        return -1;
+    }
     if (_Py_hashtable_set(domains2, TO_PTR(domain), traces2) < 0) {
         _Py_hashtable_destroy(traces2);
         return -1;
index d7945d31affea377d85b65ba9664fb3928db8b34..cd147aedb4cdb2d9929d52b5a3307182629bcda7 100644 (file)
@@ -2613,7 +2613,7 @@ static PyTypeObject PyZoneInfo_ZoneInfoType = {
 // Specify the _zoneinfo module
 static PyMethodDef module_methods[] = {{NULL, NULL}};
 static void
-module_free()
+module_free(void *m)
 {
     Py_XDECREF(_tzpath_find_tzfile);
     _tzpath_find_tzfile = NULL;
index 3aeb6f04f13cbb6b2e40b058d835676bbc08d9f5..2a5d805c053c7d5565cbaefb564b441eeab173e7 100644 (file)
@@ -5,13 +5,6 @@
 
 #include "Python.h"
 
-#if defined(__CHAR_UNSIGNED__)
-#if defined(signed)
-/* This module currently does not work on systems where only unsigned
-   characters are available.  Take it out of Setup.  Sorry. */
-#endif
-#endif
-
 static const int maxvals[] = {0, 0x7F, 0x7FFF, 0x7FFFFF, 0x7FFFFFFF};
 /* -1 trick is needed on Windows to support -0x80000000 without a warning */
 static const int minvals[] = {0, -0x80, -0x8000, -0x800000, -0x7FFFFFFF-1};
index 825416f4a3982dfcbc41745493ef036697247166..034c1081dccdf15e89a11f8f10892e03d8834959 100644 (file)
@@ -812,7 +812,7 @@ _elementtree_XMLParser___init__(PyObject *self, PyObject *args, PyObject *kwargs
     PyObject * const *fastargs;
     Py_ssize_t nargs = PyTuple_GET_SIZE(args);
     Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0;
-    PyObject *target = NULL;
+    PyObject *target = Py_None;
     const char *encoding = NULL;
 
     fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 0, 0, argsbuf);
@@ -920,4 +920,4 @@ skip_optional:
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=b7f6a32462fc42a9 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=18ddc3c84139443d input=a9049054013a1b77]*/
index 20594b0fed4c34a5ca86e155beff973039ba9776..251b67b17ea44741b009699e72ac5ae883ddda61 100644 (file)
@@ -385,7 +385,7 @@ PyDoc_STRVAR(itertools_combinations_with_replacement__doc__,
 "\n"
 "Return successive r-length combinations of elements in the iterable allowing individual elements to have successive repeats.\n"
 "\n"
-"combinations_with_replacement(\'ABC\', 2) --> AA AB AC BB BC CC\"");
+"combinations_with_replacement(\'ABC\', 2) --> (\'A\',\'A\'), (\'A\',\'B\'), (\'A\',\'C\'), (\'B\',\'B\'), (\'B\',\'C\'), (\'C\',\'C\')");
 
 static PyObject *
 itertools_combinations_with_replacement_impl(PyTypeObject *type,
@@ -642,4 +642,4 @@ skip_optional_pos:
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=392c9706e79f6710 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=0c2799c88400b63f input=a9049054013a1b77]*/
index c1072e6ef94304acf5f71c32c349a601575bc22b..7791af8f93143ba938c98f7df0b2522ee1561d0f 100644 (file)
@@ -193,6 +193,10 @@ PyDoc_STRVAR(select_poll_poll__doc__,
 "\n"
 "Polls the set of registered file descriptors.\n"
 "\n"
+"  timeout\n"
+"    The maximum time to wait in milliseconds, or else None (or a negative\n"
+"    value) to wait indefinitely.\n"
+"\n"
 "Returns a list containing any descriptors that have events or errors to\n"
 "report, as a list of (fd, event) 2-tuples.");
 
@@ -363,6 +367,10 @@ PyDoc_STRVAR(select_devpoll_poll__doc__,
 "\n"
 "Polls the set of registered file descriptors.\n"
 "\n"
+"  timeout\n"
+"    The maximum time to wait in milliseconds, or else None (or a negative\n"
+"    value) to wait indefinitely.\n"
+"\n"
 "Returns a list containing any descriptors that have events or errors to\n"
 "report, as a list of (fd, event) 2-tuples.");
 
@@ -1219,4 +1227,4 @@ exit:
 #ifndef SELECT_KQUEUE_CONTROL_METHODDEF
     #define SELECT_KQUEUE_CONTROL_METHODDEF
 #endif /* !defined(SELECT_KQUEUE_CONTROL_METHODDEF) */
-/*[clinic end generated code: output=ef42c3485a8fe3a0 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=d78e30f231a926d6 input=a9049054013a1b77]*/
index b7d6d354801b3d506ccf195bc0b72b8367e20757..c9214f64070a829463c0c5c72fa600d72d68d350 100644 (file)
    Copyright (c) 2000-2005 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
    Copyright (c) 2001-2002 Greg Stein <gstein@users.sourceforge.net>
    Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
-   Copyright (c) 2016-2021 Sebastian Pipping <sebastian@pipping.org>
+   Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
    Copyright (c) 2016      Cristian Rodríguez <crrodriguez@opensuse.org>
    Copyright (c) 2016      Thomas Beutlich <tc@tbeu.de>
    Copyright (c) 2017      Rhodri James <rhodri@wildebeest.org.uk>
+   Copyright (c) 2022      Thijs Schreijer <thijs@thijsschreijer.nl>
    Licensed under the MIT license:
 
    Permission is  hereby granted,  free of charge,  to any  person obtaining
@@ -174,8 +175,10 @@ struct XML_cp {
 };
 
 /* This is called for an element declaration. See above for
-   description of the model argument. It's the caller's responsibility
-   to free model when finished with it.
+   description of the model argument. It's the user code's responsibility
+   to free model when finished with it. See XML_FreeContentModel.
+   There is no need to free the model from the handler, it can be kept
+   around and freed at a later stage.
 */
 typedef void(XMLCALL *XML_ElementDeclHandler)(void *userData,
                                               const XML_Char *name,
@@ -237,6 +240,17 @@ XML_ParserCreate(const XML_Char *encoding);
    and the local part will be concatenated without any separator.
    It is a programming error to use the separator '\0' with namespace
    triplets (see XML_SetReturnNSTriplet).
+   If a namespace separator is chosen that can be part of a URI or
+   part of an XML name, splitting an expanded name back into its
+   1, 2 or 3 original parts on application level in the element handler
+   may end up vulnerable, so these are advised against;  sane choices for
+   a namespace separator are e.g. '\n' (line feed) and '|' (pipe).
+
+   Note that Expat does not validate namespace URIs (beyond encoding)
+   against RFC 3986 today (and is not required to do so with regard to
+   the XML 1.0 namespaces specification) but it may start doing that
+   in future releases.  Before that, an application using Expat must
+   be ready to receive namespace URIs containing non-URI characters.
 */
 XMLPARSEAPI(XML_Parser)
 XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator);
@@ -317,7 +331,7 @@ typedef void(XMLCALL *XML_StartDoctypeDeclHandler)(void *userData,
                                                    const XML_Char *pubid,
                                                    int has_internal_subset);
 
-/* This is called for the start of the DOCTYPE declaration when the
+/* This is called for the end of the DOCTYPE declaration when the
    closing > is encountered, but after processing any external
    subset.
 */
@@ -1041,7 +1055,7 @@ XML_SetBillionLaughsAttackProtectionActivationThreshold(
 */
 #define XML_MAJOR_VERSION 2
 #define XML_MINOR_VERSION 4
-#define XML_MICRO_VERSION 1
+#define XML_MICRO_VERSION 7
 
 #ifdef __cplusplus
 }
index cfb742ee000b09234b5c043c312419f9a023ac9a..d45d9b6c4571595f4e9d676833fa24724647d6b7 100644 (file)
@@ -38,6 +38,9 @@
 #ifndef PYEXPATNS_H
 #define PYEXPATNS_H
 
+#define testingAccountingGetCountBytesDirect PyExpat_testingAccountingGetCountBytesDirect
+#define testingAccountingGetCountBytesIndirect PyExpat_testingAccountingGetCountBytesIndirect
+#define unsignedCharToPrintable PyExpat_unsignedCharToPrintable
 #define XML_DefaultCurrent              PyExpat_XML_DefaultCurrent
 #define XML_ErrorString                 PyExpat_XML_ErrorString
 #define XML_ExpatVersion                PyExpat_XML_ExpatVersion
@@ -81,6 +84,8 @@
 #define XML_ResumeParser                PyExpat_XML_ResumeParser
 #define XML_SetAttlistDeclHandler       PyExpat_XML_SetAttlistDeclHandler
 #define XML_SetBase                     PyExpat_XML_SetBase
+#define XML_SetBillionLaughsAttackProtectionActivationThreshold PyExpat_XML_SetBillionLaughsAttackProtectionActivationThreshold
+#define XML_SetBillionLaughsAttackProtectionMaximumAmplification PyExpat_XML_SetBillionLaughsAttackProtectionMaximumAmplification
 #define XML_SetCdataSectionHandler      PyExpat_XML_SetCdataSectionHandler
 #define XML_SetCharacterDataHandler     PyExpat_XML_SetCharacterDataHandler
 #define XML_SetCommentHandler           PyExpat_XML_SetCommentHandler
index 034a03c30851a18931555fdbd4b518bcda082b35..05216d997b07f735c3f7758dd719fac4a85b7dfa 100644 (file)
@@ -1,4 +1,4 @@
-/* 8539b9040d9d901366a62560a064af7cb99811335784b363abc039c5b0ebc416 (2.4.1+)
+/* fcb1a62fefa945567301146eb98e3ad3413e823a41c4378e84e8b6b6f308d824 (2.4.7+)
                             __  __            _
                          ___\ \/ /_ __   __ _| |_
                         / _ \\  /| '_ \ / _` | __|
@@ -11,9 +11,9 @@
    Copyright (c) 2000-2006 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
    Copyright (c) 2001-2002 Greg Stein <gstein@users.sourceforge.net>
    Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
-   Copyright (c) 2005-2009 Steven Solie <ssolie@users.sourceforge.net>
+   Copyright (c) 2005-2009 Steven Solie <steven@solie.ca>
    Copyright (c) 2016      Eric Rahm <erahm@mozilla.com>
-   Copyright (c) 2016-2021 Sebastian Pipping <sebastian@pipping.org>
+   Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
    Copyright (c) 2016      Gaurav <g.gupta@samsung.com>
    Copyright (c) 2016      Thomas Beutlich <tc@tbeu.de>
    Copyright (c) 2016      Gustavo Grieco <gustavo.grieco@imag.fr>
@@ -32,6 +32,9 @@
    Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
    Copyright (c) 2019-2020 Ben Wagner <bungeman@chromium.org>
    Copyright (c) 2019      Vadim Zeitlin <vadim@zeitlins.org>
+   Copyright (c) 2021      Dong-hee Na <donghee.na@python.org>
+   Copyright (c) 2022      Samanta Navarro <ferivoz@riseup.net>
+   Copyright (c) 2022      Jeffrey Walton <noloader@gmail.com>
    Licensed under the MIT license:
 
    Permission is  hereby granted,  free of charge,  to any  person obtaining
    USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
 
+#define XML_BUILDING_EXPAT 1
+
+#include <expat_config.h>
+
 #if ! defined(_GNU_SOURCE)
 #  define _GNU_SOURCE 1 /* syscall prototype */
 #endif
 #  include <errno.h>
 #endif
 
-#define XML_BUILDING_EXPAT 1
-
 #ifdef _WIN32
 #  include "winconfig.h"
 #endif
 
-#include <expat_config.h>
-
 #include "ascii.h"
 #include "expat.h"
 #include "siphash.h"
       * BSD / macOS (including <10.7) (arc4random): HAVE_ARC4RANDOM, \
       * libbsd (arc4random_buf): HAVE_ARC4RANDOM_BUF + HAVE_LIBBSD, \
       * libbsd (arc4random): HAVE_ARC4RANDOM + HAVE_LIBBSD, \
-      * Linux (including <3.17) / BSD / macOS (including <10.7) (/dev/urandom): XML_DEV_URANDOM, \
+      * Linux (including <3.17) / BSD / macOS (including <10.7) / Solaris >=8 (/dev/urandom): XML_DEV_URANDOM, \
       * Windows >=Vista (rand_s): _WIN32. \
     \
     If insist on not using any of these, bypass this error by defining \
@@ -716,11 +719,11 @@ XML_ParserCreate(const XML_Char *encodingName) {
 
 XML_Parser XMLCALL
 XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) {
-  XML_Char tmp[2];
-  *tmp = nsSep;
+  XML_Char tmp[2] = {nsSep, 0};
   return XML_ParserCreate_MM(encodingName, NULL, tmp);
 }
 
+// "xml=http://www.w3.org/XML/1998/namespace"
 static const XML_Char implicitContext[]
     = {ASCII_x,     ASCII_m,     ASCII_l,      ASCII_EQUALS, ASCII_h,
        ASCII_t,     ASCII_t,     ASCII_p,      ASCII_COLON,  ASCII_SLASH,
@@ -973,7 +976,7 @@ parserCreate(const XML_Char *encodingName,
 
   if (memsuite) {
     XML_Memory_Handling_Suite *mtemp;
-    parser = (XML_Parser)memsuite->malloc_fcn(sizeof(struct XML_ParserStruct));
+    parser = memsuite->malloc_fcn(sizeof(struct XML_ParserStruct));
     if (parser != NULL) {
       mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem);
       mtemp->malloc_fcn = memsuite->malloc_fcn;
@@ -1342,8 +1345,7 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context,
      would be otherwise.
   */
   if (parser->m_ns) {
-    XML_Char tmp[2];
-    *tmp = parser->m_namespaceSeparator;
+    XML_Char tmp[2] = {parser->m_namespaceSeparator, 0};
     parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd);
   } else {
     parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd);
@@ -2066,6 +2068,11 @@ XML_GetBuffer(XML_Parser parser, int len) {
     keep = (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer);
     if (keep > XML_CONTEXT_BYTES)
       keep = XML_CONTEXT_BYTES;
+    /* Detect and prevent integer overflow */
+    if (keep > INT_MAX - neededSize) {
+      parser->m_errorCode = XML_ERROR_NO_MEMORY;
+      return NULL;
+    }
     neededSize += keep;
 #endif /* defined XML_CONTEXT_BYTES */
     if (neededSize
@@ -2556,6 +2563,7 @@ storeRawNames(XML_Parser parser) {
   while (tag) {
     int bufSize;
     int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1);
+    size_t rawNameLen;
     char *rawNameBuf = tag->buf + nameLen;
     /* Stop if already stored.  Since m_tagStack is a stack, we can stop
        at the first entry that has already been copied; everything
@@ -2567,7 +2575,11 @@ storeRawNames(XML_Parser parser) {
     /* For re-use purposes we need to ensure that the
        size of tag->buf is a multiple of sizeof(XML_Char).
     */
-    bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char));
+    rawNameLen = ROUND_UP(tag->rawNameLength, sizeof(XML_Char));
+    /* Detect and prevent integer overflow. */
+    if (rawNameLen > (size_t)INT_MAX - nameLen)
+      return XML_FALSE;
+    bufSize = nameLen + (int)rawNameLen;
     if (bufSize > tag->bufEnd - tag->buf) {
       char *temp = (char *)REALLOC(parser, tag->buf, bufSize);
       if (temp == NULL)
@@ -3260,13 +3272,38 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr,
 
   /* get the attributes from the tokenizer */
   n = XmlGetAttributes(enc, attStr, parser->m_attsSize, parser->m_atts);
+
+  /* Detect and prevent integer overflow */
+  if (n > INT_MAX - nDefaultAtts) {
+    return XML_ERROR_NO_MEMORY;
+  }
+
   if (n + nDefaultAtts > parser->m_attsSize) {
     int oldAttsSize = parser->m_attsSize;
     ATTRIBUTE *temp;
 #ifdef XML_ATTR_INFO
     XML_AttrInfo *temp2;
 #endif
+
+    /* Detect and prevent integer overflow */
+    if ((nDefaultAtts > INT_MAX - INIT_ATTS_SIZE)
+        || (n > INT_MAX - (nDefaultAtts + INIT_ATTS_SIZE))) {
+      return XML_ERROR_NO_MEMORY;
+    }
+
     parser->m_attsSize = n + nDefaultAtts + INIT_ATTS_SIZE;
+
+    /* Detect and prevent integer overflow.
+     * The preprocessor guard addresses the "always false" warning
+     * from -Wtype-limits on platforms where
+     * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+    if ((unsigned)parser->m_attsSize > (size_t)(-1) / sizeof(ATTRIBUTE)) {
+      parser->m_attsSize = oldAttsSize;
+      return XML_ERROR_NO_MEMORY;
+    }
+#endif
+
     temp = (ATTRIBUTE *)REALLOC(parser, (void *)parser->m_atts,
                                 parser->m_attsSize * sizeof(ATTRIBUTE));
     if (temp == NULL) {
@@ -3275,6 +3312,17 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr,
     }
     parser->m_atts = temp;
 #ifdef XML_ATTR_INFO
+    /* Detect and prevent integer overflow.
+     * The preprocessor guard addresses the "always false" warning
+     * from -Wtype-limits on platforms where
+     * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#  if UINT_MAX >= SIZE_MAX
+    if ((unsigned)parser->m_attsSize > (size_t)(-1) / sizeof(XML_AttrInfo)) {
+      parser->m_attsSize = oldAttsSize;
+      return XML_ERROR_NO_MEMORY;
+    }
+#  endif
+
     temp2 = (XML_AttrInfo *)REALLOC(parser, (void *)parser->m_attInfo,
                                     parser->m_attsSize * sizeof(XML_AttrInfo));
     if (temp2 == NULL) {
@@ -3413,7 +3461,13 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr,
   if (nPrefixes) {
     int j; /* hash table index */
     unsigned long version = parser->m_nsAttsVersion;
-    int nsAttsSize = (int)1 << parser->m_nsAttsPower;
+
+    /* Detect and prevent invalid shift */
+    if (parser->m_nsAttsPower >= sizeof(unsigned int) * 8 /* bits per byte */) {
+      return XML_ERROR_NO_MEMORY;
+    }
+
+    unsigned int nsAttsSize = 1u << parser->m_nsAttsPower;
     unsigned char oldNsAttsPower = parser->m_nsAttsPower;
     /* size of hash table must be at least 2 * (# of prefixed attributes) */
     if ((nPrefixes << 1)
@@ -3424,7 +3478,28 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr,
         ;
       if (parser->m_nsAttsPower < 3)
         parser->m_nsAttsPower = 3;
-      nsAttsSize = (int)1 << parser->m_nsAttsPower;
+
+      /* Detect and prevent invalid shift */
+      if (parser->m_nsAttsPower >= sizeof(nsAttsSize) * 8 /* bits per byte */) {
+        /* Restore actual size of memory in m_nsAtts */
+        parser->m_nsAttsPower = oldNsAttsPower;
+        return XML_ERROR_NO_MEMORY;
+      }
+
+      nsAttsSize = 1u << parser->m_nsAttsPower;
+
+      /* Detect and prevent integer overflow.
+       * The preprocessor guard addresses the "always false" warning
+       * from -Wtype-limits on platforms where
+       * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+      if (nsAttsSize > (size_t)(-1) / sizeof(NS_ATT)) {
+        /* Restore actual size of memory in m_nsAtts */
+        parser->m_nsAttsPower = oldNsAttsPower;
+        return XML_ERROR_NO_MEMORY;
+      }
+#endif
+
       temp = (NS_ATT *)REALLOC(parser, parser->m_nsAtts,
                                nsAttsSize * sizeof(NS_ATT));
       if (! temp) {
@@ -3582,9 +3657,31 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr,
   tagNamePtr->prefixLen = prefixLen;
   for (i = 0; localPart[i++];)
     ; /* i includes null terminator */
+
+  /* Detect and prevent integer overflow */
+  if (binding->uriLen > INT_MAX - prefixLen
+      || i > INT_MAX - (binding->uriLen + prefixLen)) {
+    return XML_ERROR_NO_MEMORY;
+  }
+
   n = i + binding->uriLen + prefixLen;
   if (n > binding->uriAlloc) {
     TAG *p;
+
+    /* Detect and prevent integer overflow */
+    if (n > INT_MAX - EXPAND_SPARE) {
+      return XML_ERROR_NO_MEMORY;
+    }
+    /* Detect and prevent integer overflow.
+     * The preprocessor guard addresses the "always false" warning
+     * from -Wtype-limits on platforms where
+     * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+    if ((unsigned)(n + EXPAND_SPARE) > (size_t)(-1) / sizeof(XML_Char)) {
+      return XML_ERROR_NO_MEMORY;
+    }
+#endif
+
     uri = (XML_Char *)MALLOC(parser, (n + EXPAND_SPARE) * sizeof(XML_Char));
     if (! uri)
       return XML_ERROR_NO_MEMORY;
@@ -3609,12 +3706,124 @@ storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr,
   return XML_ERROR_NONE;
 }
 
+static XML_Bool
+is_rfc3986_uri_char(XML_Char candidate) {
+  // For the RFC 3986 ANBF grammar see
+  // https://datatracker.ietf.org/doc/html/rfc3986#appendix-A
+
+  switch (candidate) {
+  // From rule "ALPHA" (uppercase half)
+  case 'A':
+  case 'B':
+  case 'C':
+  case 'D':
+  case 'E':
+  case 'F':
+  case 'G':
+  case 'H':
+  case 'I':
+  case 'J':
+  case 'K':
+  case 'L':
+  case 'M':
+  case 'N':
+  case 'O':
+  case 'P':
+  case 'Q':
+  case 'R':
+  case 'S':
+  case 'T':
+  case 'U':
+  case 'V':
+  case 'W':
+  case 'X':
+  case 'Y':
+  case 'Z':
+
+  // From rule "ALPHA" (lowercase half)
+  case 'a':
+  case 'b':
+  case 'c':
+  case 'd':
+  case 'e':
+  case 'f':
+  case 'g':
+  case 'h':
+  case 'i':
+  case 'j':
+  case 'k':
+  case 'l':
+  case 'm':
+  case 'n':
+  case 'o':
+  case 'p':
+  case 'q':
+  case 'r':
+  case 's':
+  case 't':
+  case 'u':
+  case 'v':
+  case 'w':
+  case 'x':
+  case 'y':
+  case 'z':
+
+  // From rule "DIGIT"
+  case '0':
+  case '1':
+  case '2':
+  case '3':
+  case '4':
+  case '5':
+  case '6':
+  case '7':
+  case '8':
+  case '9':
+
+  // From rule "pct-encoded"
+  case '%':
+
+  // From rule "unreserved"
+  case '-':
+  case '.':
+  case '_':
+  case '~':
+
+  // From rule "gen-delims"
+  case ':':
+  case '/':
+  case '?':
+  case '#':
+  case '[':
+  case ']':
+  case '@':
+
+  // From rule "sub-delims"
+  case '!':
+  case '$':
+  case '&':
+  case '\'':
+  case '(':
+  case ')':
+  case '*':
+  case '+':
+  case ',':
+  case ';':
+  case '=':
+    return XML_TRUE;
+
+  default:
+    return XML_FALSE;
+  }
+}
+
 /* addBinding() overwrites the value of prefix->binding without checking.
    Therefore one must keep track of the old value outside of addBinding().
 */
 static enum XML_Error
 addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
            const XML_Char *uri, BINDING **bindingsPtr) {
+  // "http://www.w3.org/XML/1998/namespace"
   static const XML_Char xmlNamespace[]
       = {ASCII_h,      ASCII_t,     ASCII_t,     ASCII_p,      ASCII_COLON,
          ASCII_SLASH,  ASCII_SLASH, ASCII_w,     ASCII_w,      ASCII_w,
@@ -3625,6 +3834,7 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
          ASCII_e,      ASCII_s,     ASCII_p,     ASCII_a,      ASCII_c,
          ASCII_e,      '\0'};
   static const int xmlLen = (int)sizeof(xmlNamespace) / sizeof(XML_Char) - 1;
+  // "http://www.w3.org/2000/xmlns/"
   static const XML_Char xmlnsNamespace[]
       = {ASCII_h,     ASCII_t,      ASCII_t, ASCII_p, ASCII_COLON,  ASCII_SLASH,
          ASCII_SLASH, ASCII_w,      ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w,
@@ -3664,6 +3874,29 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
     if (! mustBeXML && isXMLNS
         && (len > xmlnsLen || uri[len] != xmlnsNamespace[len]))
       isXMLNS = XML_FALSE;
+
+    // NOTE: While Expat does not validate namespace URIs against RFC 3986
+    //       today (and is not REQUIRED to do so with regard to the XML 1.0
+    //       namespaces specification) we have to at least make sure, that
+    //       the application on top of Expat (that is likely splitting expanded
+    //       element names ("qualified names") of form
+    //       "[uri sep] local [sep prefix] '\0'" back into 1, 2 or 3 pieces
+    //       in its element handler code) cannot be confused by an attacker
+    //       putting additional namespace separator characters into namespace
+    //       declarations.  That would be ambiguous and not to be expected.
+    //
+    //       While the HTML API docs of function XML_ParserCreateNS have been
+    //       advising against use of a namespace separator character that can
+    //       appear in a URI for >20 years now, some widespread applications
+    //       are using URI characters (':' (colon) in particular) for a
+    //       namespace separator, in practice.  To keep these applications
+    //       functional, we only reject namespaces URIs containing the
+    //       application-chosen namespace separator if the chosen separator
+    //       is a non-URI character with regard to RFC 3986.
+    if (parser->m_ns && (uri[len] == parser->m_namespaceSeparator)
+        && ! is_rfc3986_uri_char(uri[len])) {
+      return XML_ERROR_SYNTAX;
+    }
   }
   isXML = isXML && len == xmlLen;
   isXMLNS = isXMLNS && len == xmlnsLen;
@@ -3680,6 +3913,21 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
   if (parser->m_freeBindingList) {
     b = parser->m_freeBindingList;
     if (len > b->uriAlloc) {
+      /* Detect and prevent integer overflow */
+      if (len > INT_MAX - EXPAND_SPARE) {
+        return XML_ERROR_NO_MEMORY;
+      }
+
+      /* Detect and prevent integer overflow.
+       * The preprocessor guard addresses the "always false" warning
+       * from -Wtype-limits on platforms where
+       * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+      if ((unsigned)(len + EXPAND_SPARE) > (size_t)(-1) / sizeof(XML_Char)) {
+        return XML_ERROR_NO_MEMORY;
+      }
+#endif
+
       XML_Char *temp = (XML_Char *)REALLOC(
           parser, b->uri, sizeof(XML_Char) * (len + EXPAND_SPARE));
       if (temp == NULL)
@@ -3692,6 +3940,21 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
     b = (BINDING *)MALLOC(parser, sizeof(BINDING));
     if (! b)
       return XML_ERROR_NO_MEMORY;
+
+    /* Detect and prevent integer overflow */
+    if (len > INT_MAX - EXPAND_SPARE) {
+      return XML_ERROR_NO_MEMORY;
+    }
+    /* Detect and prevent integer overflow.
+     * The preprocessor guard addresses the "always false" warning
+     * from -Wtype-limits on platforms where
+     * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+    if ((unsigned)(len + EXPAND_SPARE) > (size_t)(-1) / sizeof(XML_Char)) {
+      return XML_ERROR_NO_MEMORY;
+    }
+#endif
+
     b->uri
         = (XML_Char *)MALLOC(parser, sizeof(XML_Char) * (len + EXPAND_SPARE));
     if (! b->uri) {
@@ -3976,7 +4239,7 @@ initializeEncoding(XML_Parser parser) {
   const char *s;
 #ifdef XML_UNICODE
   char encodingBuf[128];
-  /* See comments about `protoclEncodingName` in parserInit() */
+  /* See comments about `protocolEncodingName` in parserInit() */
   if (! parser->m_protocolEncodingName)
     s = NULL;
   else {
@@ -5018,6 +5281,11 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
       if (parser->m_prologState.level >= parser->m_groupSize) {
         if (parser->m_groupSize) {
           {
+            /* Detect and prevent integer overflow */
+            if (parser->m_groupSize > (unsigned int)(-1) / 2u) {
+              return XML_ERROR_NO_MEMORY;
+            }
+
             char *const new_connector = (char *)REALLOC(
                 parser, parser->m_groupConnector, parser->m_groupSize *= 2);
             if (new_connector == NULL) {
@@ -5028,6 +5296,16 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
           }
 
           if (dtd->scaffIndex) {
+            /* Detect and prevent integer overflow.
+             * The preprocessor guard addresses the "always false" warning
+             * from -Wtype-limits on platforms where
+             * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+            if (parser->m_groupSize > (size_t)(-1) / sizeof(int)) {
+              return XML_ERROR_NO_MEMORY;
+            }
+#endif
+
             int *const new_scaff_index = (int *)REALLOC(
                 parser, dtd->scaffIndex, parser->m_groupSize * sizeof(int));
             if (new_scaff_index == NULL)
@@ -5236,7 +5514,7 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
       if (dtd->in_eldecl) {
         ELEMENT_TYPE *el;
         const XML_Char *name;
-        int nameLen;
+        size_t nameLen;
         const char *nxt
             = (quant == XML_CQUANT_NONE ? next : next - enc->minBytesPerChar);
         int myindex = nextScaffoldPart(parser);
@@ -5252,7 +5530,13 @@ doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end,
         nameLen = 0;
         for (; name[nameLen++];)
           ;
-        dtd->contentStringLen += nameLen;
+
+        /* Detect and prevent integer overflow */
+        if (nameLen > UINT_MAX - dtd->contentStringLen) {
+          return XML_ERROR_NO_MEMORY;
+        }
+
+        dtd->contentStringLen += (unsigned)nameLen;
         if (parser->m_elementDeclHandler)
           handleDefault = XML_FALSE;
       }
@@ -6098,7 +6382,24 @@ defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata,
       }
     } else {
       DEFAULT_ATTRIBUTE *temp;
+
+      /* Detect and prevent integer overflow */
+      if (type->allocDefaultAtts > INT_MAX / 2) {
+        return 0;
+      }
+
       int count = type->allocDefaultAtts * 2;
+
+      /* Detect and prevent integer overflow.
+       * The preprocessor guard addresses the "always false" warning
+       * from -Wtype-limits on platforms where
+       * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+      if ((unsigned)count > (size_t)(-1) / sizeof(DEFAULT_ATTRIBUTE)) {
+        return 0;
+      }
+#endif
+
       temp = (DEFAULT_ATTRIBUTE *)REALLOC(parser, type->defaultAtts,
                                           (count * sizeof(DEFAULT_ATTRIBUTE)));
       if (temp == NULL)
@@ -6388,7 +6689,7 @@ normalizePublicId(XML_Char *publicId) {
 
 static DTD *
 dtdCreate(const XML_Memory_Handling_Suite *ms) {
-  DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD));
+  DTD *p = ms->malloc_fcn(sizeof(DTD));
   if (p == NULL)
     return p;
   poolInit(&(p->pool), ms);
@@ -6561,8 +6862,8 @@ dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd,
     if (! newE)
       return 0;
     if (oldE->nDefaultAtts) {
-      newE->defaultAtts = (DEFAULT_ATTRIBUTE *)ms->malloc_fcn(
-          oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE));
+      newE->defaultAtts
+          = ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE));
       if (! newE->defaultAtts) {
         return 0;
       }
@@ -6724,7 +7025,7 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) {
     /* table->size is a power of 2 */
     table->size = (size_t)1 << INIT_POWER;
     tsize = table->size * sizeof(NAMED *);
-    table->v = (NAMED **)table->mem->malloc_fcn(tsize);
+    table->v = table->mem->malloc_fcn(tsize);
     if (! table->v) {
       table->size = 0;
       return NULL;
@@ -6749,10 +7050,22 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) {
     /* check for overflow (table is half full) */
     if (table->used >> (table->power - 1)) {
       unsigned char newPower = table->power + 1;
+
+      /* Detect and prevent invalid shift */
+      if (newPower >= sizeof(unsigned long) * 8 /* bits per byte */) {
+        return NULL;
+      }
+
       size_t newSize = (size_t)1 << newPower;
       unsigned long newMask = (unsigned long)newSize - 1;
+
+      /* Detect and prevent integer overflow */
+      if (newSize > (size_t)(-1) / sizeof(NAMED *)) {
+        return NULL;
+      }
+
       size_t tsize = newSize * sizeof(NAMED *);
-      NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize);
+      NAMED **newV = table->mem->malloc_fcn(tsize);
       if (! newV)
         return NULL;
       memset(newV, 0, tsize);
@@ -6781,7 +7094,7 @@ lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize) {
       }
     }
   }
-  table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize);
+  table->v[i] = table->mem->malloc_fcn(createSize);
   if (! table->v[i])
     return NULL;
   memset(table->v[i], 0, createSize);
@@ -7069,7 +7382,7 @@ poolGrow(STRING_POOL *pool) {
     if (bytesToAllocate == 0)
       return XML_FALSE;
 
-    tem = (BLOCK *)pool->mem->malloc_fcn(bytesToAllocate);
+    tem = pool->mem->malloc_fcn(bytesToAllocate);
     if (! tem)
       return XML_FALSE;
     tem->size = blockSize;
@@ -7100,6 +7413,20 @@ nextScaffoldPart(XML_Parser parser) {
   if (dtd->scaffCount >= dtd->scaffSize) {
     CONTENT_SCAFFOLD *temp;
     if (dtd->scaffold) {
+      /* Detect and prevent integer overflow */
+      if (dtd->scaffSize > UINT_MAX / 2u) {
+        return -1;
+      }
+      /* Detect and prevent integer overflow.
+       * The preprocessor guard addresses the "always false" warning
+       * from -Wtype-limits on platforms where
+       * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+      if (dtd->scaffSize > (size_t)(-1) / 2u / sizeof(CONTENT_SCAFFOLD)) {
+        return -1;
+      }
+#endif
+
       temp = (CONTENT_SCAFFOLD *)REALLOC(
           parser, dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD));
       if (temp == NULL)
@@ -7131,55 +7458,130 @@ nextScaffoldPart(XML_Parser parser) {
   return next;
 }
 
-static void
-build_node(XML_Parser parser, int src_node, XML_Content *dest,
-           XML_Content **contpos, XML_Char **strpos) {
-  DTD *const dtd = parser->m_dtd; /* save one level of indirection */
-  dest->type = dtd->scaffold[src_node].type;
-  dest->quant = dtd->scaffold[src_node].quant;
-  if (dest->type == XML_CTYPE_NAME) {
-    const XML_Char *src;
-    dest->name = *strpos;
-    src = dtd->scaffold[src_node].name;
-    for (;;) {
-      *(*strpos)++ = *src;
-      if (! *src)
-        break;
-      src++;
-    }
-    dest->numchildren = 0;
-    dest->children = NULL;
-  } else {
-    unsigned int i;
-    int cn;
-    dest->numchildren = dtd->scaffold[src_node].childcnt;
-    dest->children = *contpos;
-    *contpos += dest->numchildren;
-    for (i = 0, cn = dtd->scaffold[src_node].firstchild; i < dest->numchildren;
-         i++, cn = dtd->scaffold[cn].nextsib) {
-      build_node(parser, cn, &(dest->children[i]), contpos, strpos);
-    }
-    dest->name = NULL;
-  }
-}
-
 static XML_Content *
 build_model(XML_Parser parser) {
+  /* Function build_model transforms the existing parser->m_dtd->scaffold
+   * array of CONTENT_SCAFFOLD tree nodes into a new array of
+   * XML_Content tree nodes followed by a gapless list of zero-terminated
+   * strings. */
   DTD *const dtd = parser->m_dtd; /* save one level of indirection */
   XML_Content *ret;
-  XML_Content *cpos;
-  XML_Char *str;
-  int allocsize = (dtd->scaffCount * sizeof(XML_Content)
-                   + (dtd->contentStringLen * sizeof(XML_Char)));
+  XML_Char *str; /* the current string writing location */
+
+  /* Detect and prevent integer overflow.
+   * The preprocessor guard addresses the "always false" warning
+   * from -Wtype-limits on platforms where
+   * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */
+#if UINT_MAX >= SIZE_MAX
+  if (dtd->scaffCount > (size_t)(-1) / sizeof(XML_Content)) {
+    return NULL;
+  }
+  if (dtd->contentStringLen > (size_t)(-1) / sizeof(XML_Char)) {
+    return NULL;
+  }
+#endif
+  if (dtd->scaffCount * sizeof(XML_Content)
+      > (size_t)(-1) - dtd->contentStringLen * sizeof(XML_Char)) {
+    return NULL;
+  }
+
+  const size_t allocsize = (dtd->scaffCount * sizeof(XML_Content)
+                            + (dtd->contentStringLen * sizeof(XML_Char)));
 
   ret = (XML_Content *)MALLOC(parser, allocsize);
   if (! ret)
     return NULL;
 
-  str = (XML_Char *)(&ret[dtd->scaffCount]);
-  cpos = &ret[1];
+  /* What follows is an iterative implementation (of what was previously done
+   * recursively in a dedicated function called "build_node".  The old recursive
+   * build_node could be forced into stack exhaustion from input as small as a
+   * few megabyte, and so that was a security issue.  Hence, a function call
+   * stack is avoided now by resolving recursion.)
+   *
+   * The iterative approach works as follows:
+   *
+   * - We have two writing pointers, both walking up the result array; one does
+   *   the work, the other creates "jobs" for its colleague to do, and leads
+   *   the way:
+   *
+   *   - The faster one, pointer jobDest, always leads and writes "what job
+   *     to do" by the other, once they reach that place in the
+   *     array: leader "jobDest" stores the source node array index (relative
+   *     to array dtd->scaffold) in field "numchildren".
+   *
+   *   - The slower one, pointer dest, looks at the value stored in the
+   *     "numchildren" field (which actually holds a source node array index
+   *     at that time) and puts the real data from dtd->scaffold in.
+   *
+   * - Before the loop starts, jobDest writes source array index 0
+   *   (where the root node is located) so that dest will have something to do
+   *   when it starts operation.
+   *
+   * - Whenever nodes with children are encountered, jobDest appends
+   *   them as new jobs, in order.  As a result, tree node siblings are
+   *   adjacent in the resulting array, for example:
+   *
+   *     [0] root, has two children
+   *       [1] first child of 0, has three children
+   *         [3] first child of 1, does not have children
+   *         [4] second child of 1, does not have children
+   *         [5] third child of 1, does not have children
+   *       [2] second child of 0, does not have children
+   *
+   *   Or (the same data) presented in flat array view:
+   *
+   *     [0] root, has two children
+   *
+   *     [1] first child of 0, has three children
+   *     [2] second child of 0, does not have children
+   *
+   *     [3] first child of 1, does not have children
+   *     [4] second child of 1, does not have children
+   *     [5] third child of 1, does not have children
+   *
+   * - The algorithm repeats until all target array indices have been processed.
+   */
+  XML_Content *dest = ret; /* tree node writing location, moves upwards */
+  XML_Content *const destLimit = &ret[dtd->scaffCount];
+  XML_Content *jobDest = ret; /* next free writing location in target array */
+  str = (XML_Char *)&ret[dtd->scaffCount];
+
+  /* Add the starting job, the root node (index 0) of the source tree  */
+  (jobDest++)->numchildren = 0;
+
+  for (; dest < destLimit; dest++) {
+    /* Retrieve source tree array index from job storage */
+    const int src_node = (int)dest->numchildren;
+
+    /* Convert item */
+    dest->type = dtd->scaffold[src_node].type;
+    dest->quant = dtd->scaffold[src_node].quant;
+    if (dest->type == XML_CTYPE_NAME) {
+      const XML_Char *src;
+      dest->name = str;
+      src = dtd->scaffold[src_node].name;
+      for (;;) {
+        *str++ = *src;
+        if (! *src)
+          break;
+        src++;
+      }
+      dest->numchildren = 0;
+      dest->children = NULL;
+    } else {
+      unsigned int i;
+      int cn;
+      dest->name = NULL;
+      dest->numchildren = dtd->scaffold[src_node].childcnt;
+      dest->children = jobDest;
+
+      /* Append scaffold indices of children to array */
+      for (i = 0, cn = dtd->scaffold[src_node].firstchild;
+           i < dest->numchildren; i++, cn = dtd->scaffold[cn].nextsib)
+        (jobDest++)->numchildren = (unsigned int)cn;
+    }
+  }
 
-  build_node(parser, 0, ret, &cpos, &str);
   return ret;
 }
 
@@ -7208,7 +7610,7 @@ getElementType(XML_Parser parser, const ENCODING *enc, const char *ptr,
 
 static XML_Char *
 copyString(const XML_Char *s, const XML_Memory_Handling_Suite *memsuite) {
-  int charsRequired = 0;
+  size_t charsRequired = 0;
   XML_Char *result;
 
   /* First determine how long the string is */
index 08173b0fd541d23724a708eb5d5349d1b2b472e8..3f0f5c150c6278ed67ce2b86709d8c494b114cf1 100644 (file)
    Copyright (c) 2002      Greg Stein <gstein@users.sourceforge.net>
    Copyright (c) 2002-2006 Karl Waclawek <karl@waclawek.net>
    Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
-   Copyright (c) 2005-2009 Steven Solie <ssolie@users.sourceforge.net>
+   Copyright (c) 2005-2009 Steven Solie <steven@solie.ca>
    Copyright (c) 2016-2021 Sebastian Pipping <sebastian@pipping.org>
    Copyright (c) 2017      Rhodri James <rhodri@wildebeest.org.uk>
    Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
+   Copyright (c) 2021      Dong-hee Na <donghee.na@python.org>
    Licensed under the MIT license:
 
    Permission is  hereby granted,  free of charge,  to any  person obtaining
    USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
 
+#include <expat_config.h>
+
 #include <stddef.h>
 
 #ifdef _WIN32
 #  include "winconfig.h"
 #endif
 
-#include <expat_config.h>
-
 #include "expat_external.h"
 #include "internal.h"
 #include "xmlrole.h"
index 5b935718743add6fd4078d3d90a8ae8d68095e9d..c659983b4008bdce5146bb7cfb288252de520bc8 100644 (file)
@@ -11,8 +11,8 @@
    Copyright (c) 2001-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
    Copyright (c) 2002      Greg Stein <gstein@users.sourceforge.net>
    Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
-   Copyright (c) 2005-2009 Steven Solie <ssolie@users.sourceforge.net>
-   Copyright (c) 2016-2021 Sebastian Pipping <sebastian@pipping.org>
+   Copyright (c) 2005-2009 Steven Solie <steven@solie.ca>
+   Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
    Copyright (c) 2016      Pascal Cuoq <cuoq@trust-in-soft.com>
    Copyright (c) 2016      Don Lewis <truckman@apache.org>
    Copyright (c) 2017      Rhodri James <rhodri@wildebeest.org.uk>
@@ -20,6 +20,7 @@
    Copyright (c) 2017      Benbuck Nason <bnason@netflix.com>
    Copyright (c) 2017      José Gutiérrez de la Concha <jose@zeroc.com>
    Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
+   Copyright (c) 2021      Dong-hee Na <donghee.na@python.org>
    Licensed under the MIT license:
 
    Permission is  hereby granted,  free of charge,  to any  person obtaining
    USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
 
-#ifdef _WIN32
-#  include "winconfig.h"
-#endif
-
 #include <expat_config.h>
 
 #include <stddef.h>
 #include <string.h> /* memcpy */
 #include <stdbool.h>
 
+#ifdef _WIN32
+#  include "winconfig.h"
+#endif
+
 #include "expat_external.h"
 #include "internal.h"
 #include "xmltok.h"
         + ((((byte)[1]) & 3) << 1) + ((((byte)[2]) >> 5) & 1)]                 \
    & (1u << (((byte)[2]) & 0x1F)))
 
-#define UTF8_GET_NAMING(pages, p, n)                                           \
-  ((n) == 2                                                                    \
-       ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p))                   \
-       : ((n) == 3 ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) : 0))
-
 /* Detection of invalid UTF-8 sequences is based on Table 3.1B
    of Unicode 3.2: http://www.unicode.org/unicode/reports/tr28/
    with the additional restriction of not allowing the Unicode
index 0430591b42636edf9bd430d88857dd2e3aabd06a..4072b06497d1c2615bff8eb98908cb1ae0f7f6d3 100644 (file)
@@ -10,7 +10,7 @@
    Copyright (c) 2000      Clark Cooper <coopercc@users.sourceforge.net>
    Copyright (c) 2002      Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
    Copyright (c) 2002-2016 Karl Waclawek <karl@waclawek.net>
-   Copyright (c) 2016-2021 Sebastian Pipping <sebastian@pipping.org>
+   Copyright (c) 2016-2022 Sebastian Pipping <sebastian@pipping.org>
    Copyright (c) 2017      Rhodri James <rhodri@wildebeest.org.uk>
    Copyright (c) 2018      Benjamin Peterson <benjamin@python.org>
    Copyright (c) 2018      Anton Maklakov <antmak.pub@gmail.com>
@@ -69,7 +69,7 @@
   case BT_LEAD##n:                                                             \
     if (end - ptr < n)                                                         \
       return XML_TOK_PARTIAL_CHAR;                                             \
-    if (! IS_NAME_CHAR(enc, ptr, n)) {                                         \
+    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NAME_CHAR(enc, ptr, n)) {         \
       *nextTokPtr = ptr;                                                       \
       return XML_TOK_INVALID;                                                  \
     }                                                                          \
@@ -98,7 +98,7 @@
   case BT_LEAD##n:                                                             \
     if (end - ptr < n)                                                         \
       return XML_TOK_PARTIAL_CHAR;                                             \
-    if (! IS_NMSTRT_CHAR(enc, ptr, n)) {                                       \
+    if (IS_INVALID_CHAR(enc, ptr, n) || ! IS_NMSTRT_CHAR(enc, ptr, n)) {       \
       *nextTokPtr = ptr;                                                       \
       return XML_TOK_INVALID;                                                  \
     }                                                                          \
@@ -1142,6 +1142,10 @@ PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
   case BT_LEAD##n:                                                             \
     if (end - ptr < n)                                                         \
       return XML_TOK_PARTIAL_CHAR;                                             \
+    if (IS_INVALID_CHAR(enc, ptr, n)) {                                        \
+      *nextTokPtr = ptr;                                                       \
+      return XML_TOK_INVALID;                                                  \
+    }                                                                          \
     if (IS_NMSTRT_CHAR(enc, ptr, n)) {                                         \
       ptr += n;                                                                \
       tok = XML_TOK_NAME;                                                      \
@@ -1270,7 +1274,7 @@ PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
     switch (BYTE_TYPE(enc, ptr)) {
 #  define LEAD_CASE(n)                                                         \
   case BT_LEAD##n:                                                             \
-    ptr += n;                                                                  \
+    ptr += n; /* NOTE: The encoding has already been validated. */             \
     break;
       LEAD_CASE(2)
       LEAD_CASE(3)
@@ -1339,7 +1343,7 @@ PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end,
     switch (BYTE_TYPE(enc, ptr)) {
 #  define LEAD_CASE(n)                                                         \
   case BT_LEAD##n:                                                             \
-    ptr += n;                                                                  \
+    ptr += n; /* NOTE: The encoding has already been validated. */             \
     break;
       LEAD_CASE(2)
       LEAD_CASE(3)
@@ -1518,7 +1522,7 @@ PREFIX(getAtts)(const ENCODING *enc, const char *ptr, int attsMax,
       state = inName;                                                          \
     }
 #  define LEAD_CASE(n)                                                         \
-  case BT_LEAD##n:                                                             \
+  case BT_LEAD##n: /* NOTE: The encoding has already been validated. */        \
     START_NAME ptr += (n - MINBPC(enc));                                       \
     break;
       LEAD_CASE(2)
@@ -1730,7 +1734,7 @@ PREFIX(nameLength)(const ENCODING *enc, const char *ptr) {
     switch (BYTE_TYPE(enc, ptr)) {
 #  define LEAD_CASE(n)                                                         \
   case BT_LEAD##n:                                                             \
-    ptr += n;                                                                  \
+    ptr += n; /* NOTE: The encoding has already been validated. */             \
     break;
       LEAD_CASE(2)
       LEAD_CASE(3)
@@ -1775,7 +1779,7 @@ PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end,
     switch (BYTE_TYPE(enc, ptr)) {
 #  define LEAD_CASE(n)                                                         \
   case BT_LEAD##n:                                                             \
-    ptr += n;                                                                  \
+    ptr += n; /* NOTE: The encoding has already been validated. */             \
     pos->columnNumber++;                                                       \
     break;
       LEAD_CASE(2)
index 5fd83922359400f72e9bfe9411328a33a1fa1bd2..fbdd3e3c7b7999640e320eec924d6cf5e3611582 100644 (file)
@@ -11,7 +11,7 @@
    Copyright (c) 2002      Greg Stein <gstein@users.sourceforge.net>
    Copyright (c) 2002      Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
    Copyright (c) 2002-2006 Karl Waclawek <karl@waclawek.net>
-   Copyright (c) 2017      Sebastian Pipping <sebastian@pipping.org>
+   Copyright (c) 2017-2021 Sebastian Pipping <sebastian@pipping.org>
    Licensed under the MIT license:
 
    Permission is  hereby granted,  free of charge,  to any  person obtaining
@@ -93,7 +93,7 @@ NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr,
 static const ENCODING *
 NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) {
 #  define ENCODING_MAX 128
-  char buf[ENCODING_MAX];
+  char buf[ENCODING_MAX] = "";
   char *p = buf;
   int i;
   XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1);
index e7a285033051dfc511440574f7f255ef325b1573..764ff439d77d95347a5cd10f3b8636113cb61d05 100644 (file)
 #  include <sys/resource.h>
 #endif
 
+/* Using an alternative stack requires sigaltstack()
+   and sigaction() SA_ONSTACK */
+#if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION)
+#  define FAULTHANDLER_USE_ALT_STACK
+#endif
+
+#if defined(FAULTHANDLER_USE_ALT_STACK) && defined(HAVE_LINUX_AUXVEC_H)
+#  include <linux/auxvec.h>
+#  include <sys/auxv.h>
+#endif
+
 /* Allocate at maximum 100 MiB of the stack to raise the stack overflow */
 #define STACK_OVERFLOW_MAX_SIZE (100 * 1024 * 1024)
 
 
 #define PUTS(fd, str) _Py_write_noraise(fd, str, strlen(str))
 
+
+// clang uses __attribute__((no_sanitize("undefined")))
+// GCC 4.9+ uses __attribute__((no_sanitize_undefined))
+#if defined(__has_feature)  // Clang
+#  if __has_feature(undefined_behavior_sanitizer)
+#    define _Py_NO_SANITIZE_UNDEFINED __attribute__((no_sanitize("undefined")))
+#  endif
+#endif
+#if defined(__GNUC__) \
+    && ((__GNUC__ >= 5) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 9))
+#  define _Py_NO_SANITIZE_UNDEFINED __attribute__((no_sanitize_undefined))
+#endif
+#ifndef _Py_NO_SANITIZE_UNDEFINED
+#  define _Py_NO_SANITIZE_UNDEFINED
+#endif
+
+
 _Py_IDENTIFIER(enable);
 _Py_IDENTIFIER(fileno);
 _Py_IDENTIFIER(flush);
@@ -120,12 +148,6 @@ static fault_handler_t faulthandler_handlers[] = {
 static const size_t faulthandler_nsignals = \
     Py_ARRAY_LENGTH(faulthandler_handlers);
 
-/* Using an alternative stack requires sigaltstack()
-   and sigaction() SA_ONSTACK */
-#if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION)
-#  define FAULTHANDLER_USE_ALT_STACK
-#endif
-
 #ifdef FAULTHANDLER_USE_ALT_STACK
 static stack_t stack;
 static stack_t old_stack;
@@ -1010,7 +1032,7 @@ faulthandler_suppress_crash_report(void)
 #endif
 }
 
-static PyObject *
+static PyObject* _Py_NO_SANITIZE_UNDEFINED
 faulthandler_read_null(PyObject *self, PyObject *args)
 {
     volatile int *x;
@@ -1099,17 +1121,20 @@ faulthandler_fatal_error_c_thread(PyObject *self, PyObject *args)
     Py_RETURN_NONE;
 }
 
-static PyObject *
+static PyObject* _Py_NO_SANITIZE_UNDEFINED
 faulthandler_sigfpe(PyObject *self, PyObject *args)
 {
+    faulthandler_suppress_crash_report();
+
     /* Do an integer division by zero: raise a SIGFPE on Intel CPU, but not on
        PowerPC. Use volatile to disable compile-time optimizations. */
     volatile int x = 1, y = 0, z;
-    faulthandler_suppress_crash_report();
     z = x / y;
+
     /* If the division by zero didn't raise a SIGFPE (e.g. on PowerPC),
        raise it manually. */
     raise(SIGFPE);
+
     /* This line is never reached, but we pretend to make something with z
        to silence a compiler warning. */
     return PyLong_FromLong(z);
@@ -1375,6 +1400,15 @@ _PyFaulthandler_Init(int enable)
        signal handler uses more than SIGSTKSZ bytes of stack memory on some
        platforms. */
     stack.ss_size = SIGSTKSZ * 2;
+#ifdef AT_MINSIGSTKSZ
+    /* bpo-46968: Query Linux for minimal stack size to ensure signal delivery
+       for the hardware running CPython. This OS feature is available in
+       Linux kernel version >= 5.14 */
+    unsigned long at_minstack_size = getauxval(AT_MINSIGSTKSZ);
+    if (at_minstack_size != 0) {
+        stack.ss_size = SIGSTKSZ + at_minstack_size;
+    }
+#endif
 #endif
 
     memset(&thread, 0, sizeof(thread));
index bc5382af7e98e1bde5d1d1ab6c4eeb96444f4f90..fae5560ab714585b19afdeae406e2118ddee8829 100644 (file)
@@ -2793,14 +2793,14 @@ itertools.combinations_with_replacement.__new__
     r: Py_ssize_t
 Return successive r-length combinations of elements in the iterable allowing individual elements to have successive repeats.
 
-combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC"
+combinations_with_replacement('ABC', 2) --> ('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')
 [clinic start generated code]*/
 
 static PyObject *
 itertools_combinations_with_replacement_impl(PyTypeObject *type,
                                              PyObject *iterable,
                                              Py_ssize_t r)
-/*[clinic end generated code: output=48b26856d4e659ca input=dc2a8c7ba785fad7]*/
+/*[clinic end generated code: output=48b26856d4e659ca input=1dc58e82a0878fdc]*/
 {
     cwrobject *co;
     Py_ssize_t n;
index fb71e9196f32a0b4c9f60d73dbf149452c39859d..d4af4f7b52db43c002bde1e12ffdcd28b45d8aac 100644 (file)
@@ -580,6 +580,8 @@ select_poll_unregister_impl(pollObject *self, int fd)
 select.poll.poll
 
     timeout as timeout_obj: object = None
+      The maximum time to wait in milliseconds, or else None (or a negative
+      value) to wait indefinitely.
     /
 
 Polls the set of registered file descriptors.
@@ -590,7 +592,7 @@ report, as a list of (fd, event) 2-tuples.
 
 static PyObject *
 select_poll_poll_impl(pollObject *self, PyObject *timeout_obj)
-/*[clinic end generated code: output=876e837d193ed7e4 input=7a446ed45189e894]*/
+/*[clinic end generated code: output=876e837d193ed7e4 input=c2f6953ec45e5622]*/
 {
     PyObject *result_list = NULL;
     int poll_result, i, j;
@@ -911,6 +913,8 @@ select_devpoll_unregister_impl(devpollObject *self, int fd)
 /*[clinic input]
 select.devpoll.poll
     timeout as timeout_obj: object = None
+      The maximum time to wait in milliseconds, or else None (or a negative
+      value) to wait indefinitely.
     /
 
 Polls the set of registered file descriptors.
@@ -921,7 +925,7 @@ report, as a list of (fd, event) 2-tuples.
 
 static PyObject *
 select_devpoll_poll_impl(devpollObject *self, PyObject *timeout_obj)
-/*[clinic end generated code: output=2654e5457cca0b3c input=fd0db698d84f0333]*/
+/*[clinic end generated code: output=2654e5457cca0b3c input=3c3f0a355ec2bedb]*/
 {
     struct dvpoll dvp;
     PyObject *result_list = NULL;
index b7554832b5a8a268a0e766db02621d6f030c4ce0..6ecdd9e66e95f8b5f79cf38f5e5eae8f15337800 100644 (file)
@@ -289,8 +289,8 @@ exit:
     return return_value;
 }
 
-PyDoc_STRVAR(float___set_format____doc__,
-"__set_format__($type, typestr, fmt, /)\n"
+PyDoc_STRVAR(float___setformat____doc__,
+"__setformat__($type, typestr, fmt, /)\n"
 "--\n"
 "\n"
 "You probably don\'t want to use this function.\n"
@@ -307,25 +307,25 @@ PyDoc_STRVAR(float___set_format____doc__,
 "Override the automatic determination of C-level floating point type.\n"
 "This affects how floats are converted to and from binary strings.");
 
-#define FLOAT___SET_FORMAT___METHODDEF    \
-    {"__set_format__", (PyCFunction)(void(*)(void))float___set_format__, METH_FASTCALL|METH_CLASS, float___set_format____doc__},
+#define FLOAT___SETFORMAT___METHODDEF    \
+    {"__setformat__", (PyCFunction)(void(*)(void))float___setformat__, METH_FASTCALL|METH_CLASS, float___setformat____doc__},
 
 static PyObject *
-float___set_format___impl(PyTypeObject *type, const char *typestr,
-                          const char *fmt);
+float___setformat___impl(PyTypeObject *type, const char *typestr,
+                         const char *fmt);
 
 static PyObject *
-float___set_format__(PyTypeObject *type, PyObject *const *args, Py_ssize_t nargs)
+float___setformat__(PyTypeObject *type, PyObject *const *args, Py_ssize_t nargs)
 {
     PyObject *return_value = NULL;
     const char *typestr;
     const char *fmt;
 
-    if (!_PyArg_CheckPositional("__set_format__", nargs, 2, 2)) {
+    if (!_PyArg_CheckPositional("__setformat__", nargs, 2, 2)) {
         goto exit;
     }
     if (!PyUnicode_Check(args[0])) {
-        _PyArg_BadArgument("__set_format__", "argument 1", "str", args[0]);
+        _PyArg_BadArgument("__setformat__", "argument 1", "str", args[0]);
         goto exit;
     }
     Py_ssize_t typestr_length;
@@ -338,7 +338,7 @@ float___set_format__(PyTypeObject *type, PyObject *const *args, Py_ssize_t nargs
         goto exit;
     }
     if (!PyUnicode_Check(args[1])) {
-        _PyArg_BadArgument("__set_format__", "argument 2", "str", args[1]);
+        _PyArg_BadArgument("__setformat__", "argument 2", "str", args[1]);
         goto exit;
     }
     Py_ssize_t fmt_length;
@@ -350,7 +350,7 @@ float___set_format__(PyTypeObject *type, PyObject *const *args, Py_ssize_t nargs
         PyErr_SetString(PyExc_ValueError, "embedded null character");
         goto exit;
     }
-    return_value = float___set_format___impl(type, typestr, fmt);
+    return_value = float___setformat___impl(type, typestr, fmt);
 
 exit:
     return return_value;
@@ -387,4 +387,4 @@ float___format__(PyObject *self, PyObject *arg)
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=25fbbe253f44e2df input=a9049054013a1b77]*/
+/*[clinic end generated code: output=a6af179ec5f83fba input=a9049054013a1b77]*/
index 075a92d4084d56e22426c53a2727fc7fc86460c2..00349ab17912e1fdef05543b2c14c64fd85dd7e6 100644 (file)
@@ -1134,11 +1134,11 @@ static PyMethodDef mappingproxy_methods[] = {
      PyDoc_STR("D.get(k[,d]) -> D[k] if k in D, else d."
                "  d defaults to None.")},
     {"keys",      (PyCFunction)mappingproxy_keys,       METH_NOARGS,
-     PyDoc_STR("D.keys() -> list of D's keys")},
+     PyDoc_STR("D.keys() -> a set-like object providing a view on D's keys")},
     {"values",    (PyCFunction)mappingproxy_values,     METH_NOARGS,
-     PyDoc_STR("D.values() -> list of D's values")},
+     PyDoc_STR("D.values() -> an object providing a view on D's values")},
     {"items",     (PyCFunction)mappingproxy_items,      METH_NOARGS,
-     PyDoc_STR("D.items() -> list of D's (key, value) pairs, as 2-tuples")},
+     PyDoc_STR("D.items() -> a set-like object providing a view on D's items")},
     {"copy",      (PyCFunction)mappingproxy_copy,       METH_NOARGS,
      PyDoc_STR("D.copy() -> a shallow copy of D")},
     {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS,
@@ -1508,7 +1508,7 @@ static PyMemberDef property_members[] = {
 
 
 PyDoc_STRVAR(getter_doc,
-             "Descriptor to change the getter on a property.");
+             "Descriptor to obtain a copy of the property with a different getter.");
 
 static PyObject *
 property_getter(PyObject *self, PyObject *getter)
@@ -1518,7 +1518,7 @@ property_getter(PyObject *self, PyObject *getter)
 
 
 PyDoc_STRVAR(setter_doc,
-             "Descriptor to change the setter on a property.");
+             "Descriptor to obtain a copy of the property with a different setter.");
 
 static PyObject *
 property_setter(PyObject *self, PyObject *setter)
@@ -1528,7 +1528,7 @@ property_setter(PyObject *self, PyObject *setter)
 
 
 PyDoc_STRVAR(deleter_doc,
-             "Descriptor to change the deleter on a property.");
+             "Descriptor to obtain a copy of the property with a different deleter.");
 
 static PyObject *
 property_deleter(PyObject *self, PyObject *deleter)
index 8538a051b19825647ed7dcc648acf553fd29c330..6ac6127ae51456dc975dfe3065fc1f1c24e8a8d0 100644 (file)
@@ -1702,7 +1702,7 @@ float___getformat___impl(PyTypeObject *type, const char *typestr)
 
 /*[clinic input]
 @classmethod
-float.__set_format__
+float.__setformat__
 
     typestr: str
         Must be 'double' or 'float'.
@@ -1721,9 +1721,9 @@ This affects how floats are converted to and from binary strings.
 [clinic start generated code]*/
 
 static PyObject *
-float___set_format___impl(PyTypeObject *type, const char *typestr,
-                          const char *fmt)
-/*[clinic end generated code: output=504460f5dc85acbd input=5306fa2b81a997e4]*/
+float___setformat___impl(PyTypeObject *type, const char *typestr,
+                         const char *fmt)
+/*[clinic end generated code: output=06864de1fb5f1f04 input=c0e9e04dd87f9988]*/
 {
     float_format_type f;
     float_format_type detected;
@@ -1825,7 +1825,7 @@ static PyMethodDef float_methods[] = {
     FLOAT_IS_INTEGER_METHODDEF
     FLOAT___GETNEWARGS___METHODDEF
     FLOAT___GETFORMAT___METHODDEF
-    FLOAT___SET_FORMAT___METHODDEF
+    FLOAT___SETFORMAT___METHODDEF
     FLOAT___FORMAT___METHODDEF
     {NULL,              NULL}           /* sentinel */
 };
index 4bd5777f967dada104e3765bcaba88414065703b..6d156bd4e0827c9d262b94d3c64e7d9160b6e2c3 100644 (file)
@@ -1207,17 +1207,21 @@ set_intersection(PySetObject *so, PyObject *other)
         while (set_next((PySetObject *)other, &pos, &entry)) {
             key = entry->key;
             hash = entry->hash;
+            Py_INCREF(key);
             rv = set_contains_entry(so, key, hash);
             if (rv < 0) {
                 Py_DECREF(result);
+                Py_DECREF(key);
                 return NULL;
             }
             if (rv) {
                 if (set_add_entry(result, key, hash)) {
                     Py_DECREF(result);
+                    Py_DECREF(key);
                     return NULL;
                 }
             }
+            Py_DECREF(key);
         }
         return (PyObject *)result;
     }
@@ -1357,11 +1361,16 @@ set_isdisjoint(PySetObject *so, PyObject *other)
             other = tmp;
         }
         while (set_next((PySetObject *)other, &pos, &entry)) {
-            rv = set_contains_entry(so, entry->key, entry->hash);
-            if (rv < 0)
+            PyObject *key = entry->key;
+            Py_INCREF(key);
+            rv = set_contains_entry(so, key, entry->hash);
+            Py_DECREF(key);
+            if (rv < 0) {
                 return NULL;
-            if (rv)
+            }
+            if (rv) {
                 Py_RETURN_FALSE;
+            }
         }
         Py_RETURN_TRUE;
     }
@@ -1420,11 +1429,16 @@ set_difference_update_internal(PySetObject *so, PyObject *other)
             Py_INCREF(other);
         }
 
-        while (set_next((PySetObject *)other, &pos, &entry))
-            if (set_discard_entry(so, entry->key, entry->hash) < 0) {
+        while (set_next((PySetObject *)other, &pos, &entry)) {
+            PyObject *key = entry->key;
+            Py_INCREF(key);
+            if (set_discard_entry(so, key, entry->hash) < 0) {
                 Py_DECREF(other);
+                Py_DECREF(key);
                 return -1;
             }
+            Py_DECREF(key);
+        }
 
         Py_DECREF(other);
     } else {
@@ -1515,17 +1529,21 @@ set_difference(PySetObject *so, PyObject *other)
         while (set_next(so, &pos, &entry)) {
             key = entry->key;
             hash = entry->hash;
+            Py_INCREF(key);
             rv = _PyDict_Contains(other, key, hash);
             if (rv < 0) {
                 Py_DECREF(result);
+                Py_DECREF(key);
                 return NULL;
             }
             if (!rv) {
                 if (set_add_entry((PySetObject *)result, key, hash)) {
                     Py_DECREF(result);
+                    Py_DECREF(key);
                     return NULL;
                 }
             }
+            Py_DECREF(key);
         }
         return result;
     }
@@ -1534,17 +1552,21 @@ set_difference(PySetObject *so, PyObject *other)
     while (set_next(so, &pos, &entry)) {
         key = entry->key;
         hash = entry->hash;
+        Py_INCREF(key);
         rv = set_contains_entry((PySetObject *)other, key, hash);
         if (rv < 0) {
             Py_DECREF(result);
+            Py_DECREF(key);
             return NULL;
         }
         if (!rv) {
             if (set_add_entry((PySetObject *)result, key, hash)) {
                 Py_DECREF(result);
+                Py_DECREF(key);
                 return NULL;
             }
         }
+        Py_DECREF(key);
     }
     return result;
 }
@@ -1641,17 +1663,21 @@ set_symmetric_difference_update(PySetObject *so, PyObject *other)
     while (set_next(otherset, &pos, &entry)) {
         key = entry->key;
         hash = entry->hash;
+        Py_INCREF(key);
         rv = set_discard_entry(so, key, hash);
         if (rv < 0) {
             Py_DECREF(otherset);
+            Py_DECREF(key);
             return NULL;
         }
         if (rv == DISCARD_NOTFOUND) {
             if (set_add_entry(so, key, hash)) {
                 Py_DECREF(otherset);
+                Py_DECREF(key);
                 return NULL;
             }
         }
+        Py_DECREF(key);
     }
     Py_DECREF(otherset);
     Py_RETURN_NONE;
@@ -1726,11 +1752,16 @@ set_issubset(PySetObject *so, PyObject *other)
         Py_RETURN_FALSE;
 
     while (set_next(so, &pos, &entry)) {
-        rv = set_contains_entry((PySetObject *)other, entry->key, entry->hash);
-        if (rv < 0)
+        PyObject *key = entry->key;
+        Py_INCREF(key);
+        rv = set_contains_entry((PySetObject *)other, key, entry->hash);
+        Py_DECREF(key);
+        if (rv < 0) {
             return NULL;
-        if (!rv)
+        }
+        if (!rv) {
             Py_RETURN_FALSE;
+        }
     }
     Py_RETURN_TRUE;
 }
index 1cdf80bfcf5affe176967d82d2cf8c7d219879ae..cb0bb46145c6a749020e8cd1af884d14ceb60df6 100644 (file)
@@ -5622,24 +5622,29 @@ PyType_Ready(PyTypeObject *type)
 static int
 add_subclass(PyTypeObject *base, PyTypeObject *type)
 {
-    int result = -1;
-    PyObject *dict, *key, *newobj;
+    PyObject *key = PyLong_FromVoidPtr((void *) type);
+    if (key == NULL)
+        return -1;
 
-    dict = base->tp_subclasses;
+    PyObject *ref = PyWeakref_NewRef((PyObject *)type, NULL);
+    if (ref == NULL) {
+        Py_DECREF(key);
+        return -1;
+    }
+
+    // Only get tp_subclasses after creating the key and value.
+    // PyWeakref_NewRef() can trigger a garbage collection which can execute
+    // arbitrary Python code and so modify base->tp_subclasses.
+    PyObject *dict = base->tp_subclasses;
     if (dict == NULL) {
         base->tp_subclasses = dict = PyDict_New();
         if (dict == NULL)
             return -1;
     }
     assert(PyDict_CheckExact(dict));
-    key = PyLong_FromVoidPtr((void *) type);
-    if (key == NULL)
-        return -1;
-    newobj = PyWeakref_NewRef((PyObject *)type, NULL);
-    if (newobj != NULL) {
-        result = PyDict_SetItem(dict, key, newobj);
-        Py_DECREF(newobj);
-    }
+
+    int result = PyDict_SetItem(dict, key, ref);
+    Py_DECREF(ref);
     Py_DECREF(key);
     return result;
 }
@@ -7231,7 +7236,7 @@ static slotdef slotdefs[] = {
     UNSLOT("__abs__", nb_absolute, slot_nb_absolute, wrap_unaryfunc,
            "abs(self)"),
     UNSLOT("__bool__", nb_bool, slot_nb_bool, wrap_inquirypred,
-           "self != 0"),
+           "True if self else False"),
     UNSLOT("__invert__", nb_invert, slot_nb_invert, wrap_unaryfunc, "~self"),
     BINSLOT("__lshift__", nb_lshift, slot_nb_lshift, "<<"),
     RBINSLOT("__rlshift__", nb_lshift, slot_nb_lshift, "<<"),
index f00475c8da3129ec1703856b05840a8fdcaefe15..df361f8e3e2cd3248ffb9e82ff442483abaf9400 100644 (file)
@@ -1 +1 @@
-<CustomCapabilityDescriptor xmlns="http://schemas.microsoft.com/appx/2016/sccd" xmlns:s="http://schemas.microsoft.com/appx/2016/sccd"><CustomCapabilities><CustomCapability Name="Microsoft.classicAppCompat_8wekyb3d8bbwe"></CustomCapability></CustomCapabilities><AuthorizedEntities><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0" CertificateSignatureHash="0000000000000000000000000000000000000000000000000000000000000000"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0" CertificateSignatureHash="0000000000000000000000000000000000000000000000000000000000000000"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0" CertificateSignatureHash="0000000000000000000000000000000000000000000000000000000000000000"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0" CertificateSignatureHash="0000000000000000000000000000000000000000000000000000000000000000"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0" CertificateSignatureHash="0000000000000000000000000000000000000000000000000000000000000000"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0" CertificateSignatureHash="0000000000000000000000000000000000000000000000000000000000000000"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0" CertificateSignatureHash="0000000000000000000000000000000000000000000000000000000000000000"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.14_qbz5n2kfra8p0" CertificateSignatureHash="0000000000000000000000000000000000000000000000000000000000000000"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.15_qbz5n2kfra8p0" CertificateSignatureHash="0000000000000000000000000000000000000000000000000000000000000000"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.14_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.15_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity></AuthorizedEntities></CustomCapabilityDescriptor>
\ No newline at end of file
+<CustomCapabilityDescriptor xmlns="http://schemas.microsoft.com/appx/2016/sccd" xmlns:s="http://schemas.microsoft.com/appx/2016/sccd"><CustomCapabilities><CustomCapability Name="Microsoft.classicAppCompat_8wekyb3d8bbwe"></CustomCapability></CustomCapabilities><AuthorizedEntities><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.14_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.15_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.16_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.17_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.14_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.14_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.15_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.15_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.16_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.16_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.17_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity><AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.17_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity></AuthorizedEntities></CustomCapabilityDescriptor>
\ No newline at end of file
index 97648985a2ccb5acdc7089c0f3116fec2b9f3e5f..d7a70cdd0533c3dd385ea081612765e05a136229 100644 (file)
@@ -1,28 +1,41 @@
-<?xml version="1.0" encoding="utf-8"?>
-<CustomCapabilityDescriptor xmlns="http://schemas.microsoft.com/appx/2016/sccd" xmlns:s="http://schemas.microsoft.com/appx/2016/sccd">
-       <CustomCapabilities>
-               <CustomCapability Name="Microsoft.classicAppCompat_8wekyb3d8bbwe"/>
-       </CustomCapabilities>
-       <AuthorizedEntities>
-               <!--PFN for store installation-->
-               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0" CertificateSignatureHash="0000000000000000000000000000000000000000000000000000000000000000"/>
-               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0" CertificateSignatureHash="0000000000000000000000000000000000000000000000000000000000000000"/>
-               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0" CertificateSignatureHash="0000000000000000000000000000000000000000000000000000000000000000"/>
-               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0" CertificateSignatureHash="0000000000000000000000000000000000000000000000000000000000000000"/>
-               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0" CertificateSignatureHash="0000000000000000000000000000000000000000000000000000000000000000"/>
-               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0" CertificateSignatureHash="0000000000000000000000000000000000000000000000000000000000000000"/>
-               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0" CertificateSignatureHash="0000000000000000000000000000000000000000000000000000000000000000"/>
-               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.14_qbz5n2kfra8p0" CertificateSignatureHash="0000000000000000000000000000000000000000000000000000000000000000"/>
-               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.15_qbz5n2kfra8p0" CertificateSignatureHash="0000000000000000000000000000000000000000000000000000000000000000"/>
-               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"/>
-               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"/>
-               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"/>
-               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"/>
-               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"/>
-               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"/>
-               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"/>
-               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.14_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"/>
-               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.15_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"/>
-       </AuthorizedEntities>
-       <!--Once signed, this file can no longer be modified-->
-       <Catalog>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</Catalog></CustomCapabilityDescriptor>
+<?xml version="1.0" encoding="utf-8"?>\r
+<CustomCapabilityDescriptor xmlns="http://schemas.microsoft.com/appx/2016/sccd" xmlns:s="http://schemas.microsoft.com/appx/2016/sccd">\r
+       <CustomCapabilities>\r
+               <CustomCapability Name="Microsoft.classicAppCompat_8wekyb3d8bbwe"></CustomCapability>\r
+       </CustomCapabilities>\r
+       <AuthorizedEntities>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.14_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.15_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.16_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.17_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.14_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.14_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.15_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.15_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.16_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.16_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.17_qbz5n2kfra8p0" CertificateSignatureHash="6045e624888e299179d5ae0ceda57c9874ff6ccf889fa14b2d50f751bfb9e2f8"></AuthorizedEntity>\r
+               <AuthorizedEntity AppPackageFamilyName="PythonSoftwareFoundation.Python.3.17_qbz5n2kfra8p0" CertificateSignatureHash="279cd652c4e252bfbe5217ac722205d7729ba409148cfa9e6d9e5b1cb94eaff1"></AuthorizedEntity>\r
+       </AuthorizedEntities>\r
+       <Catalog>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</Catalog></CustomCapabilityDescriptor>\r
index d2655c72e7df49618b8c58795eccef7985e3be64..a403de5818cfecadf9516f5ca93322371240cd50 100644 (file)
Binary files a/PC/icons/logox128.png and b/PC/icons/logox128.png differ
index 5c184e6a745f36ff0dbc94b3a20a8d8595d218a2..629022a70bdc4443e761223af8dbb80b36bb2d38 100644 (file)
Binary files a/PC/icons/py.png and b/PC/icons/py.png differ
index 4c3eb316739c7989cabaad145e278b17741afe92..589873aeb100b2dac67580fd236552208c520f48 100644 (file)
Binary files a/PC/icons/pythonwx150.png and b/PC/icons/pythonwx150.png differ
index e3b32a871f90a747f46d0732b5bdd0cfddebb448..8cd8dd0286f681e040d2f0d8abb156f80139d91d 100644 (file)
Binary files a/PC/icons/pythonwx44.png and b/PC/icons/pythonwx44.png differ
index 5f8d30418386fda334cac5ddd882f55cdfaa38d9..e00aa758edcd4720b7ba43da2a135c546584c369 100644 (file)
Binary files a/PC/icons/pythonx150.png and b/PC/icons/pythonx150.png differ
index 3881daaef2335addf7df393d9bc1f7b8560ec8b0..db0e9b91d40fe558e507d2e0ba62a77c74838b46 100644 (file)
Binary files a/PC/icons/pythonx44.png and b/PC/icons/pythonx44.png differ
index 7cc3aecd0242b9670e3633faeb10201140793f83..8eb5ffce221faedfaafbf4e1a09f8c290e992e11 100644 (file)
Binary files a/PC/icons/pythonx50.png and b/PC/icons/pythonx50.png differ
index 15119b02a802a7bdc7f37c6eab8ca4b36396c358..427a36f31c8f9edb5f1059d84235198cf63dc00c 100644 (file)
@@ -412,14 +412,22 @@ def get_appxmanifest(ns):
         if value:
             node.text = value
 
-    winver = sys.getwindowsversion()[:3]
+    try:
+        winver = tuple(int(i) for i in os.getenv("APPX_DATA_WINVER", "").split(".", maxsplit=3))
+    except (TypeError, ValueError):
+        winver = ()
+
+    # Default "known good" version is 10.0.22000, first Windows 11 release
+    winver = winver or (10, 0, 22000)
+
     if winver < (10, 0, 17763):
         winver = 10, 0, 17763
     find_or_add(xml, "m:Dependencies/m:TargetDeviceFamily").set(
-        "MaxVersionTested", "{}.{}.{}.0".format(*winver)
+        "MaxVersionTested", "{}.{}.{}.{}".format(*(winver + (0, 0, 0, 0)[:4]))
     )
 
-    if winver > (10, 0, 17763):
+    # Only for Python 3.11 and later. Older versions do not disable virtualization
+    if (VER_MAJOR, VER_MINOR) >= (3, 11) and winver > (10, 0, 17763):
         disable_registry_virtualization(xml)
 
     app = add_application(
index 6cf0fe1d34c4ac7be1e4a978af93e769a8995d07..6efd8bcd5cbb5ef41622b4530795ac9253491f95 100644 (file)
@@ -16,7 +16,7 @@ def _unpack_hexversion():
         hexversion = int(os.getenv("PYTHON_HEXVERSION"), 16)
     except (TypeError, ValueError):
         hexversion = sys.hexversion
-    return struct.pack(">i", sys.hexversion)
+    return struct.pack(">i", hexversion)
 
 
 def _get_suffix(field4):
index 89fbf0d54dd4c87ea938af75c41301b35e6ae82b..475ddb363fa37233a6a0606042a6a688f9efb66b 100644 (file)
@@ -51,10 +51,10 @@ if NOT DEFINED PYTHON (
 echo.Fetching external libraries...\r
 \r
 set libraries=\r
-set libraries=%libraries%                                       bzip2-1.0.6\r
+set libraries=%libraries%                                       bzip2-1.0.8\r
 if NOT "%IncludeLibffiSrc%"=="false" set libraries=%libraries%  libffi-3.3.0\r
-if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries%     openssl-1.1.1m\r
-set libraries=%libraries%                                       sqlite-3.35.5.0\r
+if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries%     openssl-1.1.1n\r
+set libraries=%libraries%                                       sqlite-3.37.2.0\r
 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tcl-core-8.6.12.0\r
 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tk-8.6.12.0\r
 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tix-8.4.3.6\r
@@ -77,7 +77,7 @@ echo.Fetching external binaries...
 \r
 set binaries=\r
 if NOT "%IncludeLibffi%"=="false"  set binaries=%binaries% libffi-3.3.0\r
-if NOT "%IncludeSSL%"=="false"     set binaries=%binaries% openssl-bin-1.1.1m\r
+if NOT "%IncludeSSL%"=="false"     set binaries=%binaries% openssl-bin-1.1.1n\r
 if NOT "%IncludeTkinter%"=="false" set binaries=%binaries% tcltk-8.6.12.0\r
 if NOT "%IncludeSSLSrc%"=="false"  set binaries=%binaries% nasm-2.11.06\r
 \r
index 801077b47524c6ca429c2d5e2c609ede2b8d3028..3e4419899eef5a268d89655208d37c93fa935c25 100644 (file)
     <ExternalsDir>$(EXTERNALS_DIR)</ExternalsDir>\r
     <ExternalsDir Condition="$(ExternalsDir) == ''">$([System.IO.Path]::GetFullPath(`$(PySourcePath)externals`))</ExternalsDir>\r
     <ExternalsDir Condition="!HasTrailingSlash($(ExternalsDir))">$(ExternalsDir)\</ExternalsDir>\r
-    <sqlite3Dir>$(ExternalsDir)sqlite-3.35.5.0\</sqlite3Dir>\r
-    <bz2Dir>$(ExternalsDir)bzip2-1.0.6\</bz2Dir>\r
+    <sqlite3Dir>$(ExternalsDir)sqlite-3.37.2.0\</sqlite3Dir>\r
+    <bz2Dir>$(ExternalsDir)bzip2-1.0.8\</bz2Dir>\r
     <lzmaDir>$(ExternalsDir)xz-5.2.2\</lzmaDir>\r
     <libffiDir>$(ExternalsDir)libffi-3.3.0\</libffiDir>\r
     <libffiOutDir>$(ExternalsDir)libffi-3.3.0\$(ArchName)\</libffiOutDir>\r
     <libffiIncludeDir>$(libffiOutDir)include</libffiIncludeDir>\r
-    <opensslDir>$(ExternalsDir)openssl-1.1.1m\</opensslDir>\r
-    <opensslOutDir>$(ExternalsDir)openssl-bin-1.1.1m\$(ArchName)\</opensslOutDir>\r
+    <opensslDir>$(ExternalsDir)openssl-1.1.1n\</opensslDir>\r
+    <opensslOutDir>$(ExternalsDir)openssl-bin-1.1.1n\$(ArchName)\</opensslOutDir>\r
     <opensslIncludeDir>$(opensslOutDir)include</opensslIncludeDir>\r
     <nasmDir>$(ExternalsDir)\nasm-2.11.06\</nasmDir>\r
     <zlibDir>$(ExternalsDir)\zlib-1.2.11\</zlibDir>\r
index d9412dc2078bbe6c6411bbe04951dcc1a9d02e18..d21dd8e62967e3d4d8056764c3e1f63b4cc37414 100644 (file)
@@ -158,7 +158,7 @@ interpreter, but they do implement several major features.  See the
 about getting the source for building these libraries.  The sub-projects\r
 are:\r
 _bz2\r
-    Python wrapper for version 1.0.6 of the libbzip2 compression library\r
+    Python wrapper for version 1.0.8 of the libbzip2 compression library\r
     Homepage:\r
         http://www.bzip.org/\r
 _lzma\r
@@ -185,7 +185,7 @@ _ssl
     again when building.\r
 \r
 _sqlite3\r
-    Wraps SQLite 3.35.5, which is itself built by sqlite3.vcxproj\r
+    Wraps SQLite 3.37.2, which is itself built by sqlite3.vcxproj\r
     Homepage:\r
         http://www.sqlite.org/\r
 _tkinter\r
index f1df2c46a6cf6c736e38cdd9d8ccf27e14e536cf..15a132b4e054472bdb6d48e72f6fb214e2896805 100644 (file)
@@ -444,12 +444,23 @@ fstring_find_literal(Parser *p, const char **str, const char *end, int raw,
         if (!raw && ch == '\\' && s < end) {
             ch = *s++;
             if (ch == 'N') {
+                /* We need to look at and skip matching braces for "\N{name}"
+                   sequences because otherwise we'll think the opening '{'
+                   starts an expression, which is not the case with "\N".
+                   Keep looking for either a matched '{' '}' pair, or the end
+                   of the string. */
+
                 if (s < end && *s++ == '{') {
                     while (s < end && *s++ != '}') {
                     }
                     continue;
                 }
-                break;
+
+                /* This is an invalid "\N" sequence, since it's a "\N" not
+                   followed by a "{".  Just keep parsing this literal.  This
+                   error will be caught later by
+                   decode_unicode_with_escapes(). */
+                continue;
             }
             if (ch == '{' && warn_invalid_escape_sequence(p, ch, t) < 0) {
                 return -1;
@@ -493,7 +504,8 @@ done:
             *literal = PyUnicode_DecodeUTF8Stateful(literal_start,
                                                     s - literal_start,
                                                     NULL, NULL);
-        } else {
+        }
+        else {
             *literal = decode_unicode_with_escapes(p, literal_start,
                                                    s - literal_start, t);
         }
@@ -656,12 +668,12 @@ fstring_find_expr(Parser *p, const char **str, const char *end, int raw, int rec
                     *str += 1;
                     continue;
                 }
-                /* Don't get out of the loop for these, if they're single
-                   chars (not part of 2-char tokens). If by themselves, they
-                   don't end an expression (unlike say '!'). */
-                if (ch == '>' || ch == '<') {
-                    continue;
-                }
+            }
+            /* Don't get out of the loop for these, if they're single
+               chars (not part of 2-char tokens). If by themselves, they
+               don't end an expression (unlike say '!'). */
+            if (ch == '>' || ch == '<') {
+                continue;
             }
 
             /* Normal way out of this loop. */
@@ -688,10 +700,10 @@ fstring_find_expr(Parser *p, const char **str, const char *end, int raw, int rec
         }
     }
     expr_end = *str;
-    /* If we leave this loop in a string or with mismatched parens, we
-       don't care. We'll get a syntax error when compiling the
-       expression. But, we can produce a better error message, so
-       let's just do that.*/
+    /* If we leave the above loop in a string or with mismatched parens, we
+       don't really care. We'll get a syntax error when compiling the
+       expression. But, we can produce a better error message, so let's just
+       do that.*/
     if (quote_char) {
         RAISE_SYNTAX_ERROR("f-string: unterminated string");
         goto error;
index f426050ccef5bce2212c366d3cc9150769a8b6fe..28003b66bd4e6bc5637294a8c109918333747c5a 100644 (file)
@@ -2319,9 +2319,8 @@ compiler_class(struct compiler *c, stmt_ty s)
     /* ultimately generate code for:
          <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
        where:
-         <func> is a function/closure created from the class body;
-            it has a single argument (__locals__) where the dict
-            (or MutableSequence) representing the locals is passed
+         <func> is a zero arg function/closure created from the class body.
+            It mutates its locals to build the class namespace.
          <name> is the class name
          <bases> is the positional arguments and *varargs argument
          <keywords> is the keyword arguments and **kwds argument
index 6d40249e9cd76e03e0c4e1f8046aeed59ff58715..23af2cd20b9250260d9eb164f779e43e0924e71d 100644 (file)
@@ -1882,944 +1882,951 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     4,6,8,9,8,4,8,3,8,8,8,6,8,6,8,4,
     8,4,2,1,114,19,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,104,0,0,0,101,0,90,1,100,0,90,2,100,
-    1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,
-    0,90,5,100,6,100,7,132,0,90,6,100,8,100,9,132,
-    0,90,7,100,10,100,11,132,0,90,8,100,12,100,13,132,
-    0,90,9,100,14,100,15,132,0,90,10,100,16,100,17,132,
-    0,90,11,100,18,100,19,132,0,90,12,100,20,100,21,132,
-    0,90,13,100,22,100,23,132,0,90,14,100,24,83,0,41,
-    25,218,14,95,78,97,109,101,115,112,97,99,101,80,97,116,
-    104,97,38,1,0,0,82,101,112,114,101,115,101,110,116,115,
-    32,97,32,110,97,109,101,115,112,97,99,101,32,112,97,99,
-    107,97,103,101,39,115,32,112,97,116,104,46,32,32,73,116,
-    32,117,115,101,115,32,116,104,101,32,109,111,100,117,108,101,
-    32,110,97,109,101,10,32,32,32,32,116,111,32,102,105,110,
-    100,32,105,116,115,32,112,97,114,101,110,116,32,109,111,100,
-    117,108,101,44,32,97,110,100,32,102,114,111,109,32,116,104,
-    101,114,101,32,105,116,32,108,111,111,107,115,32,117,112,32,
-    116,104,101,32,112,97,114,101,110,116,39,115,10,32,32,32,
-    32,95,95,112,97,116,104,95,95,46,32,32,87,104,101,110,
-    32,116,104,105,115,32,99,104,97,110,103,101,115,44,32,116,
-    104,101,32,109,111,100,117,108,101,39,115,32,111,119,110,32,
-    112,97,116,104,32,105,115,32,114,101,99,111,109,112,117,116,
-    101,100,44,10,32,32,32,32,117,115,105,110,103,32,112,97,
-    116,104,95,102,105,110,100,101,114,46,32,32,70,111,114,32,
-    116,111,112,45,108,101,118,101,108,32,109,111,100,117,108,101,
-    115,44,32,116,104,101,32,112,97,114,101,110,116,32,109,111,
-    100,117,108,101,39,115,32,112,97,116,104,10,32,32,32,32,
-    105,115,32,115,121,115,46,112,97,116,104,46,99,4,0,0,
-    0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,
-    0,67,0,0,0,115,36,0,0,0,124,1,124,0,95,0,
-    124,2,124,0,95,1,116,2,124,0,160,3,161,0,131,1,
-    124,0,95,4,124,3,124,0,95,5,100,0,83,0,114,69,
-    0,0,0,41,6,218,5,95,110,97,109,101,218,5,95,112,
-    97,116,104,114,135,0,0,0,218,16,95,103,101,116,95,112,
-    97,114,101,110,116,95,112,97,116,104,218,17,95,108,97,115,
-    116,95,112,97,114,101,110,116,95,112,97,116,104,218,12,95,
-    112,97,116,104,95,102,105,110,100,101,114,169,4,114,142,0,
-    0,0,114,140,0,0,0,114,65,0,0,0,90,11,112,97,
-    116,104,95,102,105,110,100,101,114,114,10,0,0,0,114,10,
-    0,0,0,114,11,0,0,0,114,232,0,0,0,188,4,0,
-    0,115,8,0,0,0,0,1,6,1,6,1,14,1,122,23,
-    95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,
-    95,105,110,105,116,95,95,99,1,0,0,0,0,0,0,0,
-    0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,0,
-    115,38,0,0,0,124,0,106,0,160,1,100,1,161,1,92,
-    3,125,1,125,2,125,3,124,2,100,2,107,2,114,30,100,
-    3,83,0,124,1,100,4,102,2,83,0,41,5,122,62,82,
-    101,116,117,114,110,115,32,97,32,116,117,112,108,101,32,111,
-    102,32,40,112,97,114,101,110,116,45,109,111,100,117,108,101,
-    45,110,97,109,101,44,32,112,97,114,101,110,116,45,112,97,
-    116,104,45,97,116,116,114,45,110,97,109,101,41,114,96,0,
-    0,0,114,14,0,0,0,41,2,114,21,0,0,0,114,65,
-    0,0,0,90,8,95,95,112,97,116,104,95,95,41,2,114,
-    46,1,0,0,114,103,0,0,0,41,4,114,142,0,0,0,
-    114,38,1,0,0,218,3,100,111,116,90,2,109,101,114,10,
-    0,0,0,114,10,0,0,0,114,11,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,194,4,0,0,115,8,0,0,0,0,
-    2,18,1,8,2,4,3,122,38,95,78,97,109,101,115,112,
-    97,99,101,80,97,116,104,46,95,102,105,110,100,95,112,97,
-    114,101,110,116,95,112,97,116,104,95,110,97,109,101,115,99,
-    1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,
-    3,0,0,0,67,0,0,0,115,28,0,0,0,124,0,160,
-    0,161,0,92,2,125,1,125,2,116,1,116,2,106,3,124,
-    1,25,0,124,2,131,2,83,0,114,69,0,0,0,41,4,
-    114,53,1,0,0,114,154,0,0,0,114,21,0,0,0,218,
-    7,109,111,100,117,108,101,115,41,3,114,142,0,0,0,90,
-    18,112,97,114,101,110,116,95,109,111,100,117,108,101,95,110,
-    97,109,101,90,14,112,97,116,104,95,97,116,116,114,95,110,
-    97,109,101,114,10,0,0,0,114,10,0,0,0,114,11,0,
-    0,0,114,48,1,0,0,204,4,0,0,115,4,0,0,0,
-    0,1,12,1,122,31,95,78,97,109,101,115,112,97,99,101,
-    80,97,116,104,46,95,103,101,116,95,112,97,114,101,110,116,
-    95,112,97,116,104,99,1,0,0,0,0,0,0,0,0,0,
-    0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,80,
-    0,0,0,116,0,124,0,160,1,161,0,131,1,125,1,124,
-    1,124,0,106,2,107,3,114,74,124,0,160,3,124,0,106,
-    4,124,1,161,2,125,2,124,2,100,0,117,1,114,68,124,
-    2,106,5,100,0,117,0,114,68,124,2,106,6,114,68,124,
-    2,106,6,124,0,95,7,124,1,124,0,95,2,124,0,106,
-    7,83,0,114,69,0,0,0,41,8,114,135,0,0,0,114,
-    48,1,0,0,114,49,1,0,0,114,50,1,0,0,114,46,
-    1,0,0,114,164,0,0,0,114,202,0,0,0,114,47,1,
-    0,0,41,3,114,142,0,0,0,90,11,112,97,114,101,110,
-    116,95,112,97,116,104,114,210,0,0,0,114,10,0,0,0,
-    114,10,0,0,0,114,11,0,0,0,218,12,95,114,101,99,
-    97,108,99,117,108,97,116,101,208,4,0,0,115,16,0,0,
-    0,0,2,12,1,10,1,14,3,18,1,6,1,8,1,6,
-    1,122,27,95,78,97,109,101,115,112,97,99,101,80,97,116,
-    104,46,95,114,101,99,97,108,99,117,108,97,116,101,99,1,
-    0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,
-    0,0,0,67,0,0,0,115,12,0,0,0,116,0,124,0,
-    160,1,161,0,131,1,83,0,114,69,0,0,0,41,2,114,
-    29,1,0,0,114,55,1,0,0,114,13,1,0,0,114,10,
-    0,0,0,114,10,0,0,0,114,11,0,0,0,218,8,95,
-    95,105,116,101,114,95,95,221,4,0,0,115,2,0,0,0,
-    0,1,122,23,95,78,97,109,101,115,112,97,99,101,80,97,
-    116,104,46,95,95,105,116,101,114,95,95,99,2,0,0,0,
-    0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,
-    67,0,0,0,115,12,0,0,0,124,0,160,0,161,0,124,
-    1,25,0,83,0,114,69,0,0,0,169,1,114,55,1,0,
-    0,41,2,114,142,0,0,0,218,5,105,110,100,101,120,114,
-    10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,11,
-    95,95,103,101,116,105,116,101,109,95,95,224,4,0,0,115,
-    2,0,0,0,0,1,122,26,95,78,97,109,101,115,112,97,
-    99,101,80,97,116,104,46,95,95,103,101,116,105,116,101,109,
-    95,95,99,3,0,0,0,0,0,0,0,0,0,0,0,3,
-    0,0,0,3,0,0,0,67,0,0,0,115,14,0,0,0,
-    124,2,124,0,106,0,124,1,60,0,100,0,83,0,114,69,
-    0,0,0,41,1,114,47,1,0,0,41,3,114,142,0,0,
-    0,114,58,1,0,0,114,65,0,0,0,114,10,0,0,0,
-    114,10,0,0,0,114,11,0,0,0,218,11,95,95,115,101,
-    116,105,116,101,109,95,95,227,4,0,0,115,2,0,0,0,
-    0,1,122,26,95,78,97,109,101,115,112,97,99,101,80,97,
-    116,104,46,95,95,115,101,116,105,116,101,109,95,95,99,1,
-    0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,
-    0,0,0,67,0,0,0,115,12,0,0,0,116,0,124,0,
-    160,1,161,0,131,1,83,0,114,69,0,0,0,41,2,114,
-    6,0,0,0,114,55,1,0,0,114,13,1,0,0,114,10,
-    0,0,0,114,10,0,0,0,114,11,0,0,0,218,7,95,
-    95,108,101,110,95,95,230,4,0,0,115,2,0,0,0,0,
-    1,122,22,95,78,97,109,101,115,112,97,99,101,80,97,116,
-    104,46,95,95,108,101,110,95,95,99,1,0,0,0,0,0,
-    0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,
-    0,0,115,12,0,0,0,100,1,160,0,124,0,106,1,161,
-    1,83,0,41,2,78,122,20,95,78,97,109,101,115,112,97,
-    99,101,80,97,116,104,40,123,33,114,125,41,41,2,114,88,
-    0,0,0,114,47,1,0,0,114,13,1,0,0,114,10,0,
-    0,0,114,10,0,0,0,114,11,0,0,0,218,8,95,95,
-    114,101,112,114,95,95,233,4,0,0,115,2,0,0,0,0,
-    1,122,23,95,78,97,109,101,115,112,97,99,101,80,97,116,
-    104,46,95,95,114,101,112,114,95,95,99,2,0,0,0,0,
-    0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67,
-    0,0,0,115,12,0,0,0,124,1,124,0,160,0,161,0,
-    118,0,83,0,114,69,0,0,0,114,57,1,0,0,169,2,
-    114,142,0,0,0,218,4,105,116,101,109,114,10,0,0,0,
-    114,10,0,0,0,114,11,0,0,0,218,12,95,95,99,111,
-    110,116,97,105,110,115,95,95,236,4,0,0,115,2,0,0,
-    0,0,1,122,27,95,78,97,109,101,115,112,97,99,101,80,
-    97,116,104,46,95,95,99,111,110,116,97,105,110,115,95,95,
-    99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
-    0,3,0,0,0,67,0,0,0,115,16,0,0,0,124,0,
-    106,0,160,1,124,1,161,1,1,0,100,0,83,0,114,69,
-    0,0,0,41,2,114,47,1,0,0,114,61,0,0,0,114,
-    63,1,0,0,114,10,0,0,0,114,10,0,0,0,114,11,
-    0,0,0,114,61,0,0,0,239,4,0,0,115,2,0,0,
-    0,0,1,122,21,95,78,97,109,101,115,112,97,99,101,80,
-    97,116,104,46,97,112,112,101,110,100,78,41,15,114,149,0,
-    0,0,114,148,0,0,0,114,150,0,0,0,114,151,0,0,
-    0,114,232,0,0,0,114,53,1,0,0,114,48,1,0,0,
-    114,55,1,0,0,114,56,1,0,0,114,59,1,0,0,114,
-    60,1,0,0,114,61,1,0,0,114,62,1,0,0,114,65,
-    1,0,0,114,61,0,0,0,114,10,0,0,0,114,10,0,
-    0,0,114,10,0,0,0,114,11,0,0,0,114,45,1,0,
-    0,181,4,0,0,115,24,0,0,0,8,1,4,6,8,6,
-    8,10,8,4,8,13,8,3,8,3,8,3,8,3,8,3,
-    8,3,114,45,1,0,0,99,0,0,0,0,0,0,0,0,
-    0,0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,
-    115,80,0,0,0,101,0,90,1,100,0,90,2,100,1,100,
-    2,132,0,90,3,101,4,100,3,100,4,132,0,131,1,90,
-    5,100,5,100,6,132,0,90,6,100,7,100,8,132,0,90,
-    7,100,9,100,10,132,0,90,8,100,11,100,12,132,0,90,
-    9,100,13,100,14,132,0,90,10,100,15,100,16,132,0,90,
-    11,100,17,83,0,41,18,218,16,95,78,97,109,101,115,112,
-    97,99,101,76,111,97,100,101,114,99,4,0,0,0,0,0,
-    0,0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,
-    0,0,115,18,0,0,0,116,0,124,1,124,2,124,3,131,
-    3,124,0,95,1,100,0,83,0,114,69,0,0,0,41,2,
-    114,45,1,0,0,114,47,1,0,0,114,51,1,0,0,114,
+    0,0,115,108,0,0,0,101,0,90,1,100,0,90,2,100,
+    1,90,3,100,2,90,4,100,3,100,4,132,0,90,5,100,
+    5,100,6,132,0,90,6,100,7,100,8,132,0,90,7,100,
+    9,100,10,132,0,90,8,100,11,100,12,132,0,90,9,100,
+    13,100,14,132,0,90,10,100,15,100,16,132,0,90,11,100,
+    17,100,18,132,0,90,12,100,19,100,20,132,0,90,13,100,
+    21,100,22,132,0,90,14,100,23,100,24,132,0,90,15,100,
+    25,83,0,41,26,218,14,95,78,97,109,101,115,112,97,99,
+    101,80,97,116,104,97,38,1,0,0,82,101,112,114,101,115,
+    101,110,116,115,32,97,32,110,97,109,101,115,112,97,99,101,
+    32,112,97,99,107,97,103,101,39,115,32,112,97,116,104,46,
+    32,32,73,116,32,117,115,101,115,32,116,104,101,32,109,111,
+    100,117,108,101,32,110,97,109,101,10,32,32,32,32,116,111,
+    32,102,105,110,100,32,105,116,115,32,112,97,114,101,110,116,
+    32,109,111,100,117,108,101,44,32,97,110,100,32,102,114,111,
+    109,32,116,104,101,114,101,32,105,116,32,108,111,111,107,115,
+    32,117,112,32,116,104,101,32,112,97,114,101,110,116,39,115,
+    10,32,32,32,32,95,95,112,97,116,104,95,95,46,32,32,
+    87,104,101,110,32,116,104,105,115,32,99,104,97,110,103,101,
+    115,44,32,116,104,101,32,109,111,100,117,108,101,39,115,32,
+    111,119,110,32,112,97,116,104,32,105,115,32,114,101,99,111,
+    109,112,117,116,101,100,44,10,32,32,32,32,117,115,105,110,
+    103,32,112,97,116,104,95,102,105,110,100,101,114,46,32,32,
+    70,111,114,32,116,111,112,45,108,101,118,101,108,32,109,111,
+    100,117,108,101,115,44,32,116,104,101,32,112,97,114,101,110,
+    116,32,109,111,100,117,108,101,39,115,32,112,97,116,104,10,
+    32,32,32,32,105,115,32,115,121,115,46,112,97,116,104,46,
+    114,0,0,0,0,99,4,0,0,0,0,0,0,0,0,0,
+    0,0,4,0,0,0,3,0,0,0,67,0,0,0,115,44,
+    0,0,0,124,1,124,0,95,0,124,2,124,0,95,1,116,
+    2,124,0,160,3,161,0,131,1,124,0,95,4,124,0,106,
+    5,124,0,95,6,124,3,124,0,95,7,100,0,83,0,114,
+    69,0,0,0,41,8,218,5,95,110,97,109,101,218,5,95,
+    112,97,116,104,114,135,0,0,0,218,16,95,103,101,116,95,
+    112,97,114,101,110,116,95,112,97,116,104,218,17,95,108,97,
+    115,116,95,112,97,114,101,110,116,95,112,97,116,104,218,6,
+    95,101,112,111,99,104,218,11,95,108,97,115,116,95,101,112,
+    111,99,104,218,12,95,112,97,116,104,95,102,105,110,100,101,
+    114,169,4,114,142,0,0,0,114,140,0,0,0,114,65,0,
+    0,0,90,11,112,97,116,104,95,102,105,110,100,101,114,114,
     10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,232,
-    0,0,0,245,4,0,0,115,2,0,0,0,0,1,122,25,
-    95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,
-    46,95,95,105,110,105,116,95,95,99,2,0,0,0,0,0,
-    0,0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,
-    0,0,115,12,0,0,0,100,1,160,0,124,1,106,1,161,
-    1,83,0,41,2,122,115,82,101,116,117,114,110,32,114,101,
-    112,114,32,102,111,114,32,116,104,101,32,109,111,100,117,108,
-    101,46,10,10,32,32,32,32,32,32,32,32,84,104,101,32,
-    109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,
-    97,116,101,100,46,32,32,84,104,101,32,105,109,112,111,114,
-    116,32,109,97,99,104,105,110,101,114,121,32,100,111,101,115,
-    32,116,104,101,32,106,111,98,32,105,116,115,101,108,102,46,
-    10,10,32,32,32,32,32,32,32,32,122,25,60,109,111,100,
-    117,108,101,32,123,33,114,125,32,40,110,97,109,101,115,112,
-    97,99,101,41,62,41,2,114,88,0,0,0,114,149,0,0,
-    0,41,2,114,216,0,0,0,114,239,0,0,0,114,10,0,
-    0,0,114,10,0,0,0,114,11,0,0,0,218,11,109,111,
-    100,117,108,101,95,114,101,112,114,248,4,0,0,115,2,0,
-    0,0,0,7,122,28,95,78,97,109,101,115,112,97,99,101,
-    76,111,97,100,101,114,46,109,111,100,117,108,101,95,114,101,
-    112,114,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
-    0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,
-    100,1,83,0,41,2,78,84,114,10,0,0,0,114,242,0,
-    0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,
-    0,114,206,0,0,0,1,5,0,0,115,2,0,0,0,0,
-    1,122,27,95,78,97,109,101,115,112,97,99,101,76,111,97,
-    100,101,114,46,105,115,95,112,97,99,107,97,103,101,99,2,
-    0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,
-    0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,
-    41,2,78,114,14,0,0,0,114,10,0,0,0,114,242,0,
-    0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,
-    0,114,252,0,0,0,4,5,0,0,115,2,0,0,0,0,
-    1,122,27,95,78,97,109,101,115,112,97,99,101,76,111,97,
-    100,101,114,46,103,101,116,95,115,111,117,114,99,101,99,2,
-    0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,6,
-    0,0,0,67,0,0,0,115,16,0,0,0,116,0,100,1,
-    100,2,100,3,100,4,100,5,141,4,83,0,41,6,78,114,
-    14,0,0,0,122,8,60,115,116,114,105,110,103,62,114,238,
-    0,0,0,84,41,1,114,254,0,0,0,41,1,114,255,0,
-    0,0,114,242,0,0,0,114,10,0,0,0,114,10,0,0,
-    0,114,11,0,0,0,114,236,0,0,0,7,5,0,0,115,
-    2,0,0,0,0,1,122,25,95,78,97,109,101,115,112,97,
-    99,101,76,111,97,100,101,114,46,103,101,116,95,99,111,100,
-    101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,
-    0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,
-    1,83,0,114,233,0,0,0,114,10,0,0,0,114,234,0,
-    0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,
-    0,114,235,0,0,0,10,5,0,0,115,2,0,0,0,0,
-    1,122,30,95,78,97,109,101,115,112,97,99,101,76,111,97,
-    100,101,114,46,99,114,101,97,116,101,95,109,111,100,117,108,
-    101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,
-    0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,
-    0,83,0,114,69,0,0,0,114,10,0,0,0,114,20,1,
-    0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,
-    0,114,240,0,0,0,13,5,0,0,115,2,0,0,0,0,
-    1,122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,
-    100,101,114,46,101,120,101,99,95,109,111,100,117,108,101,99,
-    2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,
-    4,0,0,0,67,0,0,0,115,26,0,0,0,116,0,160,
-    1,100,1,124,0,106,2,161,2,1,0,116,0,160,3,124,
-    0,124,1,161,2,83,0,41,2,122,98,76,111,97,100,32,
-    97,32,110,97,109,101,115,112,97,99,101,32,109,111,100,117,
-    108,101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,
-    115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,
-    101,99,97,116,101,100,46,32,32,85,115,101,32,101,120,101,
-    99,95,109,111,100,117,108,101,40,41,32,105,110,115,116,101,
-    97,100,46,10,10,32,32,32,32,32,32,32,32,122,38,110,
-    97,109,101,115,112,97,99,101,32,109,111,100,117,108,101,32,
-    108,111,97,100,101,100,32,119,105,116,104,32,112,97,116,104,
-    32,123,33,114,125,41,4,114,158,0,0,0,114,173,0,0,
-    0,114,47,1,0,0,114,241,0,0,0,114,242,0,0,0,
-    114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,
-    243,0,0,0,16,5,0,0,115,8,0,0,0,0,7,6,
-    1,4,255,4,2,122,28,95,78,97,109,101,115,112,97,99,
-    101,76,111,97,100,101,114,46,108,111,97,100,95,109,111,100,
-    117,108,101,78,41,12,114,149,0,0,0,114,148,0,0,0,
-    114,150,0,0,0,114,232,0,0,0,114,230,0,0,0,114,
-    67,1,0,0,114,206,0,0,0,114,252,0,0,0,114,236,
-    0,0,0,114,235,0,0,0,114,240,0,0,0,114,243,0,
-    0,0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,
-    0,114,11,0,0,0,114,66,1,0,0,244,4,0,0,115,
-    18,0,0,0,8,1,8,3,2,1,10,8,8,3,8,3,
-    8,3,8,3,8,3,114,66,1,0,0,99,0,0,0,0,
-    0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
-    64,0,0,0,115,118,0,0,0,101,0,90,1,100,0,90,
-    2,100,1,90,3,101,4,100,2,100,3,132,0,131,1,90,
-    5,101,4,100,4,100,5,132,0,131,1,90,6,101,4,100,
-    6,100,7,132,0,131,1,90,7,101,4,100,8,100,9,132,
-    0,131,1,90,8,101,4,100,19,100,11,100,12,132,1,131,
-    1,90,9,101,4,100,20,100,13,100,14,132,1,131,1,90,
-    10,101,4,100,21,100,15,100,16,132,1,131,1,90,11,101,
-    4,100,17,100,18,132,0,131,1,90,12,100,10,83,0,41,
-    22,218,10,80,97,116,104,70,105,110,100,101,114,122,62,77,
-    101,116,97,32,112,97,116,104,32,102,105,110,100,101,114,32,
-    102,111,114,32,115,121,115,46,112,97,116,104,32,97,110,100,
-    32,112,97,99,107,97,103,101,32,95,95,112,97,116,104,95,
-    95,32,97,116,116,114,105,98,117,116,101,115,46,99,1,0,
+    0,0,0,192,4,0,0,115,10,0,0,0,0,1,6,1,
+    6,1,14,1,8,1,122,23,95,78,97,109,101,115,112,97,
+    99,101,80,97,116,104,46,95,95,105,110,105,116,95,95,99,
+    1,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
+    3,0,0,0,67,0,0,0,115,38,0,0,0,124,0,106,
+    0,160,1,100,1,161,1,92,3,125,1,125,2,125,3,124,
+    2,100,2,107,2,114,30,100,3,83,0,124,1,100,4,102,
+    2,83,0,41,5,122,62,82,101,116,117,114,110,115,32,97,
+    32,116,117,112,108,101,32,111,102,32,40,112,97,114,101,110,
+    116,45,109,111,100,117,108,101,45,110,97,109,101,44,32,112,
+    97,114,101,110,116,45,112,97,116,104,45,97,116,116,114,45,
+    110,97,109,101,41,114,96,0,0,0,114,14,0,0,0,41,
+    2,114,21,0,0,0,114,65,0,0,0,90,8,95,95,112,
+    97,116,104,95,95,41,2,114,46,1,0,0,114,103,0,0,
+    0,41,4,114,142,0,0,0,114,38,1,0,0,218,3,100,
+    111,116,90,2,109,101,114,10,0,0,0,114,10,0,0,0,
+    114,11,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,199,4,
+    0,0,115,8,0,0,0,0,2,18,1,8,2,4,3,122,
+    38,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,
+    95,102,105,110,100,95,112,97,114,101,110,116,95,112,97,116,
+    104,95,110,97,109,101,115,99,1,0,0,0,0,0,0,0,
+    0,0,0,0,3,0,0,0,3,0,0,0,67,0,0,0,
+    115,28,0,0,0,124,0,160,0,161,0,92,2,125,1,125,
+    2,116,1,116,2,106,3,124,1,25,0,124,2,131,2,83,
+    0,114,69,0,0,0,41,4,114,55,1,0,0,114,154,0,
+    0,0,114,21,0,0,0,218,7,109,111,100,117,108,101,115,
+    41,3,114,142,0,0,0,90,18,112,97,114,101,110,116,95,
+    109,111,100,117,108,101,95,110,97,109,101,90,14,112,97,116,
+    104,95,97,116,116,114,95,110,97,109,101,114,10,0,0,0,
+    114,10,0,0,0,114,11,0,0,0,114,48,1,0,0,209,
+    4,0,0,115,4,0,0,0,0,1,12,1,122,31,95,78,
+    97,109,101,115,112,97,99,101,80,97,116,104,46,95,103,101,
+    116,95,112,97,114,101,110,116,95,112,97,116,104,99,1,0,
     0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,
-    0,0,67,0,0,0,115,64,0,0,0,116,0,116,1,106,
-    2,160,3,161,0,131,1,68,0,93,44,92,2,125,1,125,
-    2,124,2,100,1,117,0,114,40,116,1,106,2,124,1,61,
-    0,113,14,116,4,124,2,100,2,131,2,114,14,124,2,160,
-    5,161,0,1,0,113,14,100,1,83,0,41,3,122,125,67,
-    97,108,108,32,116,104,101,32,105,110,118,97,108,105,100,97,
-    116,101,95,99,97,99,104,101,115,40,41,32,109,101,116,104,
-    111,100,32,111,110,32,97,108,108,32,112,97,116,104,32,101,
-    110,116,114,121,32,102,105,110,100,101,114,115,10,32,32,32,
-    32,32,32,32,32,115,116,111,114,101,100,32,105,110,32,115,
-    121,115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,
-    95,99,97,99,104,101,115,32,40,119,104,101,114,101,32,105,
-    109,112,108,101,109,101,110,116,101,100,41,46,78,218,17,105,
-    110,118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,
-    41,6,218,4,108,105,115,116,114,21,0,0,0,218,19,112,
-    97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,
-    104,101,218,5,105,116,101,109,115,114,152,0,0,0,114,69,
-    1,0,0,41,3,114,216,0,0,0,114,140,0,0,0,218,
-    6,102,105,110,100,101,114,114,10,0,0,0,114,10,0,0,
-    0,114,11,0,0,0,114,69,1,0,0,34,5,0,0,115,
-    10,0,0,0,0,4,22,1,8,1,10,1,10,1,122,28,
-    80,97,116,104,70,105,110,100,101,114,46,105,110,118,97,108,
-    105,100,97,116,101,95,99,97,99,104,101,115,99,2,0,0,
-    0,0,0,0,0,0,0,0,0,3,0,0,0,9,0,0,
-    0,67,0,0,0,115,82,0,0,0,116,0,106,1,100,1,
-    117,1,114,28,116,0,106,1,115,28,116,2,160,3,100,2,
-    116,4,161,2,1,0,116,0,106,1,68,0,93,42,125,2,
-    122,14,124,2,124,1,131,1,87,0,2,0,1,0,83,0,
-    4,0,116,5,121,74,1,0,1,0,1,0,89,0,113,34,
-    89,0,113,34,48,0,113,34,100,1,83,0,41,3,122,46,
-    83,101,97,114,99,104,32,115,121,115,46,112,97,116,104,95,
-    104,111,111,107,115,32,102,111,114,32,97,32,102,105,110,100,
-    101,114,32,102,111,114,32,39,112,97,116,104,39,46,78,122,
-    23,115,121,115,46,112,97,116,104,95,104,111,111,107,115,32,
-    105,115,32,101,109,112,116,121,41,6,114,21,0,0,0,218,
-    10,112,97,116,104,95,104,111,111,107,115,114,98,0,0,0,
-    114,99,0,0,0,114,162,0,0,0,114,141,0,0,0,41,
-    3,114,216,0,0,0,114,65,0,0,0,90,4,104,111,111,
-    107,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,
-    218,11,95,112,97,116,104,95,104,111,111,107,115,44,5,0,
-    0,115,16,0,0,0,0,3,16,1,12,1,10,1,2,1,
-    14,1,12,1,12,2,122,22,80,97,116,104,70,105,110,100,
-    101,114,46,95,112,97,116,104,95,104,111,111,107,115,99,2,
-    0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,
-    0,0,0,67,0,0,0,115,100,0,0,0,124,1,100,1,
-    107,2,114,42,122,12,116,0,160,1,161,0,125,1,87,0,
-    110,20,4,0,116,2,121,40,1,0,1,0,1,0,89,0,
-    100,2,83,0,48,0,122,14,116,3,106,4,124,1,25,0,
-    125,2,87,0,110,38,4,0,116,5,121,94,1,0,1,0,
-    1,0,124,0,160,6,124,1,161,1,125,2,124,2,116,3,
-    106,4,124,1,60,0,89,0,110,2,48,0,124,2,83,0,
-    41,3,122,210,71,101,116,32,116,104,101,32,102,105,110,100,
-    101,114,32,102,111,114,32,116,104,101,32,112,97,116,104,32,
-    101,110,116,114,121,32,102,114,111,109,32,115,121,115,46,112,
-    97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,
-    104,101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,
-    116,104,101,32,112,97,116,104,32,101,110,116,114,121,32,105,
-    115,32,110,111,116,32,105,110,32,116,104,101,32,99,97,99,
-    104,101,44,32,102,105,110,100,32,116,104,101,32,97,112,112,
-    114,111,112,114,105,97,116,101,32,102,105,110,100,101,114,10,
-    32,32,32,32,32,32,32,32,97,110,100,32,99,97,99,104,
-    101,32,105,116,46,32,73,102,32,110,111,32,102,105,110,100,
-    101,114,32,105,115,32,97,118,97,105,108,97,98,108,101,44,
-    32,115,116,111,114,101,32,78,111,110,101,46,10,10,32,32,
-    32,32,32,32,32,32,114,14,0,0,0,78,41,7,114,24,
-    0,0,0,114,81,0,0,0,114,26,1,0,0,114,21,0,
-    0,0,114,71,1,0,0,218,8,75,101,121,69,114,114,111,
-    114,114,75,1,0,0,41,3,114,216,0,0,0,114,65,0,
-    0,0,114,73,1,0,0,114,10,0,0,0,114,10,0,0,
-    0,114,11,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,57,5,0,0,
-    115,22,0,0,0,0,8,8,1,2,1,12,1,12,3,8,
-    1,2,1,14,1,12,1,10,1,16,1,122,31,80,97,116,
-    104,70,105,110,100,101,114,46,95,112,97,116,104,95,105,109,
-    112,111,114,116,101,114,95,99,97,99,104,101,99,3,0,0,
-    0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0,
-    0,67,0,0,0,115,82,0,0,0,116,0,124,2,100,1,
-    131,2,114,26,124,2,160,1,124,1,161,1,92,2,125,3,
-    125,4,110,14,124,2,160,2,124,1,161,1,125,3,103,0,
-    125,4,124,3,100,0,117,1,114,60,116,3,160,4,124,1,
-    124,3,161,2,83,0,116,3,160,5,124,1,100,0,161,2,
-    125,5,124,4,124,5,95,6,124,5,83,0,41,2,78,114,
-    161,0,0,0,41,7,114,152,0,0,0,114,161,0,0,0,
-    114,229,0,0,0,114,158,0,0,0,114,224,0,0,0,114,
-    207,0,0,0,114,202,0,0,0,41,6,114,216,0,0,0,
-    114,163,0,0,0,114,73,1,0,0,114,164,0,0,0,114,
-    165,0,0,0,114,210,0,0,0,114,10,0,0,0,114,10,
-    0,0,0,114,11,0,0,0,218,16,95,108,101,103,97,99,
-    121,95,103,101,116,95,115,112,101,99,79,5,0,0,115,18,
-    0,0,0,0,4,10,1,16,2,10,1,4,1,8,1,12,
-    1,12,1,6,1,122,27,80,97,116,104,70,105,110,100,101,
-    114,46,95,108,101,103,97,99,121,95,103,101,116,95,115,112,
-    101,99,78,99,4,0,0,0,0,0,0,0,0,0,0,0,
-    9,0,0,0,5,0,0,0,67,0,0,0,115,166,0,0,
-    0,103,0,125,4,124,2,68,0,93,134,125,5,116,0,124,
-    5,116,1,116,2,102,2,131,2,115,28,113,8,124,0,160,
-    3,124,5,161,1,125,6,124,6,100,1,117,1,114,8,116,
-    4,124,6,100,2,131,2,114,70,124,6,160,5,124,1,124,
-    3,161,2,125,7,110,12,124,0,160,6,124,1,124,6,161,
-    2,125,7,124,7,100,1,117,0,114,92,113,8,124,7,106,
-    7,100,1,117,1,114,110,124,7,2,0,1,0,83,0,124,
-    7,106,8,125,8,124,8,100,1,117,0,114,132,116,9,100,
-    3,131,1,130,1,124,4,160,10,124,8,161,1,1,0,113,
-    8,116,11,160,12,124,1,100,1,161,2,125,7,124,4,124,
-    7,95,8,124,7,83,0,41,4,122,63,70,105,110,100,32,
-    116,104,101,32,108,111,97,100,101,114,32,111,114,32,110,97,
-    109,101,115,112,97,99,101,95,112,97,116,104,32,102,111,114,
-    32,116,104,105,115,32,109,111,100,117,108,101,47,112,97,99,
-    107,97,103,101,32,110,97,109,101,46,78,114,226,0,0,0,
-    122,19,115,112,101,99,32,109,105,115,115,105,110,103,32,108,
-    111,97,100,101,114,41,13,114,185,0,0,0,114,108,0,0,
-    0,218,5,98,121,116,101,115,114,77,1,0,0,114,152,0,
-    0,0,114,226,0,0,0,114,78,1,0,0,114,164,0,0,
-    0,114,202,0,0,0,114,141,0,0,0,114,191,0,0,0,
-    114,158,0,0,0,114,207,0,0,0,41,9,114,216,0,0,
-    0,114,163,0,0,0,114,65,0,0,0,114,225,0,0,0,
-    218,14,110,97,109,101,115,112,97,99,101,95,112,97,116,104,
-    90,5,101,110,116,114,121,114,73,1,0,0,114,210,0,0,
-    0,114,165,0,0,0,114,10,0,0,0,114,10,0,0,0,
-    114,11,0,0,0,218,9,95,103,101,116,95,115,112,101,99,
-    94,5,0,0,115,40,0,0,0,0,5,4,1,8,1,14,
-    1,2,1,10,1,8,1,10,1,14,2,12,1,8,1,2,
-    1,10,1,8,1,6,1,8,1,8,5,12,2,12,1,6,
-    1,122,20,80,97,116,104,70,105,110,100,101,114,46,95,103,
-    101,116,95,115,112,101,99,99,4,0,0,0,0,0,0,0,
-    0,0,0,0,6,0,0,0,5,0,0,0,67,0,0,0,
-    115,100,0,0,0,124,2,100,1,117,0,114,14,116,0,106,
-    1,125,2,124,0,160,2,124,1,124,2,124,3,161,3,125,
-    4,124,4,100,1,117,0,114,40,100,1,83,0,124,4,106,
-    3,100,1,117,0,114,92,124,4,106,4,125,5,124,5,114,
-    86,100,1,124,4,95,5,116,6,124,1,124,5,124,0,106,
-    2,131,3,124,4,95,4,124,4,83,0,100,1,83,0,110,
-    4,124,4,83,0,100,1,83,0,41,2,122,141,84,114,121,
-    32,116,111,32,102,105,110,100,32,97,32,115,112,101,99,32,
-    102,111,114,32,39,102,117,108,108,110,97,109,101,39,32,111,
-    110,32,115,121,115,46,112,97,116,104,32,111,114,32,39,112,
-    97,116,104,39,46,10,10,32,32,32,32,32,32,32,32,84,
-    104,101,32,115,101,97,114,99,104,32,105,115,32,98,97,115,
-    101,100,32,111,110,32,115,121,115,46,112,97,116,104,95,104,
-    111,111,107,115,32,97,110,100,32,115,121,115,46,112,97,116,
+    0,0,67,0,0,0,115,100,0,0,0,116,0,124,0,160,
+    1,161,0,131,1,125,1,124,1,124,0,106,2,107,3,115,
+    34,124,0,106,3,124,0,106,4,107,3,114,94,124,0,160,
+    5,124,0,106,6,124,1,161,2,125,2,124,2,100,0,117,
+    1,114,80,124,2,106,7,100,0,117,0,114,80,124,2,106,
+    8,114,80,124,2,106,8,124,0,95,9,124,1,124,0,95,
+    2,124,0,106,3,124,0,95,4,124,0,106,9,83,0,114,
+    69,0,0,0,41,10,114,135,0,0,0,114,48,1,0,0,
+    114,49,1,0,0,114,50,1,0,0,114,51,1,0,0,114,
+    52,1,0,0,114,46,1,0,0,114,164,0,0,0,114,202,
+    0,0,0,114,47,1,0,0,41,3,114,142,0,0,0,90,
+    11,112,97,114,101,110,116,95,112,97,116,104,114,210,0,0,
+    0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,
+    218,12,95,114,101,99,97,108,99,117,108,97,116,101,213,4,
+    0,0,115,18,0,0,0,0,2,12,1,22,1,14,3,18,
+    1,6,1,8,1,6,1,8,1,122,27,95,78,97,109,101,
+    115,112,97,99,101,80,97,116,104,46,95,114,101,99,97,108,
+    99,117,108,97,116,101,99,1,0,0,0,0,0,0,0,0,
+    0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,
+    12,0,0,0,116,0,124,0,160,1,161,0,131,1,83,0,
+    114,69,0,0,0,41,2,114,29,1,0,0,114,57,1,0,
+    0,114,13,1,0,0,114,10,0,0,0,114,10,0,0,0,
+    114,11,0,0,0,218,8,95,95,105,116,101,114,95,95,227,
+    4,0,0,115,2,0,0,0,0,1,122,23,95,78,97,109,
+    101,115,112,97,99,101,80,97,116,104,46,95,95,105,116,101,
+    114,95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,
+    2,0,0,0,2,0,0,0,67,0,0,0,115,12,0,0,
+    0,124,0,160,0,161,0,124,1,25,0,83,0,114,69,0,
+    0,0,169,1,114,57,1,0,0,41,2,114,142,0,0,0,
+    218,5,105,110,100,101,120,114,10,0,0,0,114,10,0,0,
+    0,114,11,0,0,0,218,11,95,95,103,101,116,105,116,101,
+    109,95,95,230,4,0,0,115,2,0,0,0,0,1,122,26,
+    95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,
+    95,103,101,116,105,116,101,109,95,95,99,3,0,0,0,0,
+    0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,
+    0,0,0,115,14,0,0,0,124,2,124,0,106,0,124,1,
+    60,0,100,0,83,0,114,69,0,0,0,41,1,114,47,1,
+    0,0,41,3,114,142,0,0,0,114,60,1,0,0,114,65,
+    0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,
+    0,0,218,11,95,95,115,101,116,105,116,101,109,95,95,233,
+    4,0,0,115,2,0,0,0,0,1,122,26,95,78,97,109,
+    101,115,112,97,99,101,80,97,116,104,46,95,95,115,101,116,
+    105,116,101,109,95,95,99,1,0,0,0,0,0,0,0,0,
+    0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,
+    12,0,0,0,116,0,124,0,160,1,161,0,131,1,83,0,
+    114,69,0,0,0,41,2,114,6,0,0,0,114,57,1,0,
+    0,114,13,1,0,0,114,10,0,0,0,114,10,0,0,0,
+    114,11,0,0,0,218,7,95,95,108,101,110,95,95,236,4,
+    0,0,115,2,0,0,0,0,1,122,22,95,78,97,109,101,
+    115,112,97,99,101,80,97,116,104,46,95,95,108,101,110,95,
+    95,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,
+    0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,100,
+    1,160,0,124,0,106,1,161,1,83,0,41,2,78,122,20,
+    95,78,97,109,101,115,112,97,99,101,80,97,116,104,40,123,
+    33,114,125,41,41,2,114,88,0,0,0,114,47,1,0,0,
+    114,13,1,0,0,114,10,0,0,0,114,10,0,0,0,114,
+    11,0,0,0,218,8,95,95,114,101,112,114,95,95,239,4,
+    0,0,115,2,0,0,0,0,1,122,23,95,78,97,109,101,
+    115,112,97,99,101,80,97,116,104,46,95,95,114,101,112,114,
+    95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
+    0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,
+    124,1,124,0,160,0,161,0,118,0,83,0,114,69,0,0,
+    0,114,59,1,0,0,169,2,114,142,0,0,0,218,4,105,
+    116,101,109,114,10,0,0,0,114,10,0,0,0,114,11,0,
+    0,0,218,12,95,95,99,111,110,116,97,105,110,115,95,95,
+    242,4,0,0,115,2,0,0,0,0,1,122,27,95,78,97,
+    109,101,115,112,97,99,101,80,97,116,104,46,95,95,99,111,
+    110,116,97,105,110,115,95,95,99,2,0,0,0,0,0,0,
+    0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,
+    0,115,16,0,0,0,124,0,106,0,160,1,124,1,161,1,
+    1,0,100,0,83,0,114,69,0,0,0,41,2,114,47,1,
+    0,0,114,61,0,0,0,114,65,1,0,0,114,10,0,0,
+    0,114,10,0,0,0,114,11,0,0,0,114,61,0,0,0,
+    245,4,0,0,115,2,0,0,0,0,1,122,21,95,78,97,
+    109,101,115,112,97,99,101,80,97,116,104,46,97,112,112,101,
+    110,100,78,41,16,114,149,0,0,0,114,148,0,0,0,114,
+    150,0,0,0,114,151,0,0,0,114,50,1,0,0,114,232,
+    0,0,0,114,55,1,0,0,114,48,1,0,0,114,57,1,
+    0,0,114,58,1,0,0,114,61,1,0,0,114,62,1,0,
+    0,114,63,1,0,0,114,64,1,0,0,114,67,1,0,0,
+    114,61,0,0,0,114,10,0,0,0,114,10,0,0,0,114,
+    10,0,0,0,114,11,0,0,0,114,45,1,0,0,181,4,
+    0,0,115,26,0,0,0,8,1,4,8,4,2,8,7,8,
+    10,8,4,8,14,8,3,8,3,8,3,8,3,8,3,8,
+    3,114,45,1,0,0,99,0,0,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115,
+    80,0,0,0,101,0,90,1,100,0,90,2,100,1,100,2,
+    132,0,90,3,101,4,100,3,100,4,132,0,131,1,90,5,
+    100,5,100,6,132,0,90,6,100,7,100,8,132,0,90,7,
+    100,9,100,10,132,0,90,8,100,11,100,12,132,0,90,9,
+    100,13,100,14,132,0,90,10,100,15,100,16,132,0,90,11,
+    100,17,83,0,41,18,218,16,95,78,97,109,101,115,112,97,
+    99,101,76,111,97,100,101,114,99,4,0,0,0,0,0,0,
+    0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,
+    0,115,18,0,0,0,116,0,124,1,124,2,124,3,131,3,
+    124,0,95,1,100,0,83,0,114,69,0,0,0,41,2,114,
+    45,1,0,0,114,47,1,0,0,114,53,1,0,0,114,10,
+    0,0,0,114,10,0,0,0,114,11,0,0,0,114,232,0,
+    0,0,251,4,0,0,115,2,0,0,0,0,1,122,25,95,
+    78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,
+    95,95,105,110,105,116,95,95,99,2,0,0,0,0,0,0,
+    0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,
+    0,115,12,0,0,0,100,1,160,0,124,1,106,1,161,1,
+    83,0,41,2,122,115,82,101,116,117,114,110,32,114,101,112,
+    114,32,102,111,114,32,116,104,101,32,109,111,100,117,108,101,
+    46,10,10,32,32,32,32,32,32,32,32,84,104,101,32,109,
+    101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,
+    116,101,100,46,32,32,84,104,101,32,105,109,112,111,114,116,
+    32,109,97,99,104,105,110,101,114,121,32,100,111,101,115,32,
+    116,104,101,32,106,111,98,32,105,116,115,101,108,102,46,10,
+    10,32,32,32,32,32,32,32,32,122,25,60,109,111,100,117,
+    108,101,32,123,33,114,125,32,40,110,97,109,101,115,112,97,
+    99,101,41,62,41,2,114,88,0,0,0,114,149,0,0,0,
+    41,2,114,216,0,0,0,114,239,0,0,0,114,10,0,0,
+    0,114,10,0,0,0,114,11,0,0,0,218,11,109,111,100,
+    117,108,101,95,114,101,112,114,254,4,0,0,115,2,0,0,
+    0,0,7,122,28,95,78,97,109,101,115,112,97,99,101,76,
+    111,97,100,101,114,46,109,111,100,117,108,101,95,114,101,112,
+    114,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,
+    0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,
+    1,83,0,41,2,78,84,114,10,0,0,0,114,242,0,0,
+    0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,
+    114,206,0,0,0,7,5,0,0,115,2,0,0,0,0,1,
+    122,27,95,78,97,109,101,115,112,97,99,101,76,111,97,100,
+    101,114,46,105,115,95,112,97,99,107,97,103,101,99,2,0,
+    0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,
+    0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,
+    2,78,114,14,0,0,0,114,10,0,0,0,114,242,0,0,
+    0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,
+    114,252,0,0,0,10,5,0,0,115,2,0,0,0,0,1,
+    122,27,95,78,97,109,101,115,112,97,99,101,76,111,97,100,
+    101,114,46,103,101,116,95,115,111,117,114,99,101,99,2,0,
+    0,0,0,0,0,0,0,0,0,0,2,0,0,0,6,0,
+    0,0,67,0,0,0,115,16,0,0,0,116,0,100,1,100,
+    2,100,3,100,4,100,5,141,4,83,0,41,6,78,114,14,
+    0,0,0,122,8,60,115,116,114,105,110,103,62,114,238,0,
+    0,0,84,41,1,114,254,0,0,0,41,1,114,255,0,0,
+    0,114,242,0,0,0,114,10,0,0,0,114,10,0,0,0,
+    114,11,0,0,0,114,236,0,0,0,13,5,0,0,115,2,
+    0,0,0,0,1,122,25,95,78,97,109,101,115,112,97,99,
+    101,76,111,97,100,101,114,46,103,101,116,95,99,111,100,101,
+    99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
+    0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,
+    83,0,114,233,0,0,0,114,10,0,0,0,114,234,0,0,
+    0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,
+    114,235,0,0,0,16,5,0,0,115,2,0,0,0,0,1,
+    122,30,95,78,97,109,101,115,112,97,99,101,76,111,97,100,
+    101,114,46,99,114,101,97,116,101,95,109,111,100,117,108,101,
+    99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
+    0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,0,
+    83,0,114,69,0,0,0,114,10,0,0,0,114,20,1,0,
+    0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,
+    114,240,0,0,0,19,5,0,0,115,2,0,0,0,0,1,
+    122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,
+    101,114,46,101,120,101,99,95,109,111,100,117,108,101,99,2,
+    0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,
+    0,0,0,67,0,0,0,115,26,0,0,0,116,0,160,1,
+    100,1,124,0,106,2,161,2,1,0,116,0,160,3,124,0,
+    124,1,161,2,83,0,41,2,122,98,76,111,97,100,32,97,
+    32,110,97,109,101,115,112,97,99,101,32,109,111,100,117,108,
+    101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,
+    32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,
+    99,97,116,101,100,46,32,32,85,115,101,32,101,120,101,99,
+    95,109,111,100,117,108,101,40,41,32,105,110,115,116,101,97,
+    100,46,10,10,32,32,32,32,32,32,32,32,122,38,110,97,
+    109,101,115,112,97,99,101,32,109,111,100,117,108,101,32,108,
+    111,97,100,101,100,32,119,105,116,104,32,112,97,116,104,32,
+    123,33,114,125,41,4,114,158,0,0,0,114,173,0,0,0,
+    114,47,1,0,0,114,241,0,0,0,114,242,0,0,0,114,
+    10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,243,
+    0,0,0,22,5,0,0,115,8,0,0,0,0,7,6,1,
+    4,255,4,2,122,28,95,78,97,109,101,115,112,97,99,101,
+    76,111,97,100,101,114,46,108,111,97,100,95,109,111,100,117,
+    108,101,78,41,12,114,149,0,0,0,114,148,0,0,0,114,
+    150,0,0,0,114,232,0,0,0,114,230,0,0,0,114,69,
+    1,0,0,114,206,0,0,0,114,252,0,0,0,114,236,0,
+    0,0,114,235,0,0,0,114,240,0,0,0,114,243,0,0,
+    0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0,
+    114,11,0,0,0,114,68,1,0,0,250,4,0,0,115,18,
+    0,0,0,8,1,8,3,2,1,10,8,8,3,8,3,8,
+    3,8,3,8,3,114,68,1,0,0,99,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64,
+    0,0,0,115,118,0,0,0,101,0,90,1,100,0,90,2,
+    100,1,90,3,101,4,100,2,100,3,132,0,131,1,90,5,
+    101,4,100,4,100,5,132,0,131,1,90,6,101,4,100,6,
+    100,7,132,0,131,1,90,7,101,4,100,8,100,9,132,0,
+    131,1,90,8,101,4,100,19,100,11,100,12,132,1,131,1,
+    90,9,101,4,100,20,100,13,100,14,132,1,131,1,90,10,
+    101,4,100,21,100,15,100,16,132,1,131,1,90,11,101,4,
+    100,17,100,18,132,0,131,1,90,12,100,10,83,0,41,22,
+    218,10,80,97,116,104,70,105,110,100,101,114,122,62,77,101,
+    116,97,32,112,97,116,104,32,102,105,110,100,101,114,32,102,
+    111,114,32,115,121,115,46,112,97,116,104,32,97,110,100,32,
+    112,97,99,107,97,103,101,32,95,95,112,97,116,104,95,95,
+    32,97,116,116,114,105,98,117,116,101,115,46,99,1,0,0,
+    0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0,
+    0,67,0,0,0,115,78,0,0,0,116,0,116,1,106,2,
+    160,3,161,0,131,1,68,0,93,44,92,2,125,1,125,2,
+    124,2,100,1,117,0,114,40,116,1,106,2,124,1,61,0,
+    113,14,116,4,124,2,100,2,131,2,114,14,124,2,160,5,
+    161,0,1,0,113,14,116,6,4,0,106,7,100,3,55,0,
+    2,0,95,7,100,1,83,0,41,4,122,125,67,97,108,108,
+    32,116,104,101,32,105,110,118,97,108,105,100,97,116,101,95,
+    99,97,99,104,101,115,40,41,32,109,101,116,104,111,100,32,
+    111,110,32,97,108,108,32,112,97,116,104,32,101,110,116,114,
+    121,32,102,105,110,100,101,114,115,10,32,32,32,32,32,32,
+    32,32,115,116,111,114,101,100,32,105,110,32,115,121,115,46,
+    112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,
+    99,104,101,115,32,40,119,104,101,114,101,32,105,109,112,108,
+    101,109,101,110,116,101,100,41,46,78,218,17,105,110,118,97,
+    108,105,100,97,116,101,95,99,97,99,104,101,115,114,4,0,
+    0,0,41,8,218,4,108,105,115,116,114,21,0,0,0,218,
+    19,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,
+    97,99,104,101,218,5,105,116,101,109,115,114,152,0,0,0,
+    114,71,1,0,0,114,45,1,0,0,114,50,1,0,0,41,
+    3,114,216,0,0,0,114,140,0,0,0,218,6,102,105,110,
+    100,101,114,114,10,0,0,0,114,10,0,0,0,114,11,0,
+    0,0,114,71,1,0,0,40,5,0,0,115,12,0,0,0,
+    0,4,22,1,8,1,10,1,10,1,10,3,122,28,80,97,
+    116,104,70,105,110,100,101,114,46,105,110,118,97,108,105,100,
+    97,116,101,95,99,97,99,104,101,115,99,2,0,0,0,0,
+    0,0,0,0,0,0,0,3,0,0,0,9,0,0,0,67,
+    0,0,0,115,82,0,0,0,116,0,106,1,100,1,117,1,
+    114,28,116,0,106,1,115,28,116,2,160,3,100,2,116,4,
+    161,2,1,0,116,0,106,1,68,0,93,42,125,2,122,14,
+    124,2,124,1,131,1,87,0,2,0,1,0,83,0,4,0,
+    116,5,121,74,1,0,1,0,1,0,89,0,113,34,89,0,
+    113,34,48,0,113,34,100,1,83,0,41,3,122,46,83,101,
+    97,114,99,104,32,115,121,115,46,112,97,116,104,95,104,111,
+    111,107,115,32,102,111,114,32,97,32,102,105,110,100,101,114,
+    32,102,111,114,32,39,112,97,116,104,39,46,78,122,23,115,
+    121,115,46,112,97,116,104,95,104,111,111,107,115,32,105,115,
+    32,101,109,112,116,121,41,6,114,21,0,0,0,218,10,112,
+    97,116,104,95,104,111,111,107,115,114,98,0,0,0,114,99,
+    0,0,0,114,162,0,0,0,114,141,0,0,0,41,3,114,
+    216,0,0,0,114,65,0,0,0,90,4,104,111,111,107,114,
+    10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,11,
+    95,112,97,116,104,95,104,111,111,107,115,53,5,0,0,115,
+    16,0,0,0,0,3,16,1,12,1,10,1,2,1,14,1,
+    12,1,12,2,122,22,80,97,116,104,70,105,110,100,101,114,
+    46,95,112,97,116,104,95,104,111,111,107,115,99,2,0,0,
+    0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,
+    0,67,0,0,0,115,100,0,0,0,124,1,100,1,107,2,
+    114,42,122,12,116,0,160,1,161,0,125,1,87,0,110,20,
+    4,0,116,2,121,40,1,0,1,0,1,0,89,0,100,2,
+    83,0,48,0,122,14,116,3,106,4,124,1,25,0,125,2,
+    87,0,110,38,4,0,116,5,121,94,1,0,1,0,1,0,
+    124,0,160,6,124,1,161,1,125,2,124,2,116,3,106,4,
+    124,1,60,0,89,0,110,2,48,0,124,2,83,0,41,3,
+    122,210,71,101,116,32,116,104,101,32,102,105,110,100,101,114,
+    32,102,111,114,32,116,104,101,32,112,97,116,104,32,101,110,
+    116,114,121,32,102,114,111,109,32,115,121,115,46,112,97,116,
     104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,
-    46,10,32,32,32,32,32,32,32,32,78,41,7,114,21,0,
-    0,0,114,65,0,0,0,114,81,1,0,0,114,164,0,0,
-    0,114,202,0,0,0,114,205,0,0,0,114,45,1,0,0,
-    41,6,114,216,0,0,0,114,163,0,0,0,114,65,0,0,
-    0,114,225,0,0,0,114,210,0,0,0,114,80,1,0,0,
-    114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,
-    226,0,0,0,126,5,0,0,115,26,0,0,0,0,6,8,
-    1,6,1,14,1,8,1,4,1,10,1,6,1,4,3,6,
-    1,16,1,4,2,6,2,122,20,80,97,116,104,70,105,110,
-    100,101,114,46,102,105,110,100,95,115,112,101,99,99,3,0,
-    0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,
-    0,0,67,0,0,0,115,30,0,0,0,124,0,160,0,124,
-    1,124,2,161,2,125,3,124,3,100,1,117,0,114,24,100,
-    1,83,0,124,3,106,1,83,0,41,2,122,170,102,105,110,
-    100,32,116,104,101,32,109,111,100,117,108,101,32,111,110,32,
+    46,10,10,32,32,32,32,32,32,32,32,73,102,32,116,104,
+    101,32,112,97,116,104,32,101,110,116,114,121,32,105,115,32,
+    110,111,116,32,105,110,32,116,104,101,32,99,97,99,104,101,
+    44,32,102,105,110,100,32,116,104,101,32,97,112,112,114,111,
+    112,114,105,97,116,101,32,102,105,110,100,101,114,10,32,32,
+    32,32,32,32,32,32,97,110,100,32,99,97,99,104,101,32,
+    105,116,46,32,73,102,32,110,111,32,102,105,110,100,101,114,
+    32,105,115,32,97,118,97,105,108,97,98,108,101,44,32,115,
+    116,111,114,101,32,78,111,110,101,46,10,10,32,32,32,32,
+    32,32,32,32,114,14,0,0,0,78,41,7,114,24,0,0,
+    0,114,81,0,0,0,114,26,1,0,0,114,21,0,0,0,
+    114,73,1,0,0,218,8,75,101,121,69,114,114,111,114,114,
+    77,1,0,0,41,3,114,216,0,0,0,114,65,0,0,0,
+    114,75,1,0,0,114,10,0,0,0,114,10,0,0,0,114,
+    11,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,22,
+    0,0,0,0,8,8,1,2,1,12,1,12,3,8,1,2,
+    1,14,1,12,1,10,1,16,1,122,31,80,97,116,104,70,
+    105,110,100,101,114,46,95,112,97,116,104,95,105,109,112,111,
+    114,116,101,114,95,99,97,99,104,101,99,3,0,0,0,0,
+    0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,67,
+    0,0,0,115,82,0,0,0,116,0,124,2,100,1,131,2,
+    114,26,124,2,160,1,124,1,161,1,92,2,125,3,125,4,
+    110,14,124,2,160,2,124,1,161,1,125,3,103,0,125,4,
+    124,3,100,0,117,1,114,60,116,3,160,4,124,1,124,3,
+    161,2,83,0,116,3,160,5,124,1,100,0,161,2,125,5,
+    124,4,124,5,95,6,124,5,83,0,41,2,78,114,161,0,
+    0,0,41,7,114,152,0,0,0,114,161,0,0,0,114,229,
+    0,0,0,114,158,0,0,0,114,224,0,0,0,114,207,0,
+    0,0,114,202,0,0,0,41,6,114,216,0,0,0,114,163,
+    0,0,0,114,75,1,0,0,114,164,0,0,0,114,165,0,
+    0,0,114,210,0,0,0,114,10,0,0,0,114,10,0,0,
+    0,114,11,0,0,0,218,16,95,108,101,103,97,99,121,95,
+    103,101,116,95,115,112,101,99,88,5,0,0,115,18,0,0,
+    0,0,4,10,1,16,2,10,1,4,1,8,1,12,1,12,
+    1,6,1,122,27,80,97,116,104,70,105,110,100,101,114,46,
+    95,108,101,103,97,99,121,95,103,101,116,95,115,112,101,99,
+    78,99,4,0,0,0,0,0,0,0,0,0,0,0,9,0,
+    0,0,5,0,0,0,67,0,0,0,115,166,0,0,0,103,
+    0,125,4,124,2,68,0,93,134,125,5,116,0,124,5,116,
+    1,116,2,102,2,131,2,115,28,113,8,124,0,160,3,124,
+    5,161,1,125,6,124,6,100,1,117,1,114,8,116,4,124,
+    6,100,2,131,2,114,70,124,6,160,5,124,1,124,3,161,
+    2,125,7,110,12,124,0,160,6,124,1,124,6,161,2,125,
+    7,124,7,100,1,117,0,114,92,113,8,124,7,106,7,100,
+    1,117,1,114,110,124,7,2,0,1,0,83,0,124,7,106,
+    8,125,8,124,8,100,1,117,0,114,132,116,9,100,3,131,
+    1,130,1,124,4,160,10,124,8,161,1,1,0,113,8,116,
+    11,160,12,124,1,100,1,161,2,125,7,124,4,124,7,95,
+    8,124,7,83,0,41,4,122,63,70,105,110,100,32,116,104,
+    101,32,108,111,97,100,101,114,32,111,114,32,110,97,109,101,
+    115,112,97,99,101,95,112,97,116,104,32,102,111,114,32,116,
+    104,105,115,32,109,111,100,117,108,101,47,112,97,99,107,97,
+    103,101,32,110,97,109,101,46,78,114,226,0,0,0,122,19,
+    115,112,101,99,32,109,105,115,115,105,110,103,32,108,111,97,
+    100,101,114,41,13,114,185,0,0,0,114,108,0,0,0,218,
+    5,98,121,116,101,115,114,79,1,0,0,114,152,0,0,0,
+    114,226,0,0,0,114,80,1,0,0,114,164,0,0,0,114,
+    202,0,0,0,114,141,0,0,0,114,191,0,0,0,114,158,
+    0,0,0,114,207,0,0,0,41,9,114,216,0,0,0,114,
+    163,0,0,0,114,65,0,0,0,114,225,0,0,0,218,14,
+    110,97,109,101,115,112,97,99,101,95,112,97,116,104,90,5,
+    101,110,116,114,121,114,75,1,0,0,114,210,0,0,0,114,
+    165,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,
+    0,0,0,218,9,95,103,101,116,95,115,112,101,99,103,5,
+    0,0,115,40,0,0,0,0,5,4,1,8,1,14,1,2,
+    1,10,1,8,1,10,1,14,2,12,1,8,1,2,1,10,
+    1,8,1,6,1,8,1,8,5,12,2,12,1,6,1,122,
+    20,80,97,116,104,70,105,110,100,101,114,46,95,103,101,116,
+    95,115,112,101,99,99,4,0,0,0,0,0,0,0,0,0,
+    0,0,6,0,0,0,5,0,0,0,67,0,0,0,115,100,
+    0,0,0,124,2,100,1,117,0,114,14,116,0,106,1,125,
+    2,124,0,160,2,124,1,124,2,124,3,161,3,125,4,124,
+    4,100,1,117,0,114,40,100,1,83,0,124,4,106,3,100,
+    1,117,0,114,92,124,4,106,4,125,5,124,5,114,86,100,
+    1,124,4,95,5,116,6,124,1,124,5,124,0,106,2,131,
+    3,124,4,95,4,124,4,83,0,100,1,83,0,110,4,124,
+    4,83,0,100,1,83,0,41,2,122,141,84,114,121,32,116,
+    111,32,102,105,110,100,32,97,32,115,112,101,99,32,102,111,
+    114,32,39,102,117,108,108,110,97,109,101,39,32,111,110,32,
     115,121,115,46,112,97,116,104,32,111,114,32,39,112,97,116,
-    104,39,32,98,97,115,101,100,32,111,110,32,115,121,115,46,
-    112,97,116,104,95,104,111,111,107,115,32,97,110,100,10,32,
-    32,32,32,32,32,32,32,115,121,115,46,112,97,116,104,95,
+    104,39,46,10,10,32,32,32,32,32,32,32,32,84,104,101,
+    32,115,101,97,114,99,104,32,105,115,32,98,97,115,101,100,
+    32,111,110,32,115,121,115,46,112,97,116,104,95,104,111,111,
+    107,115,32,97,110,100,32,115,121,115,46,112,97,116,104,95,
     105,109,112,111,114,116,101,114,95,99,97,99,104,101,46,10,
-    10,32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,
-    116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,
-    101,100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,
-    101,99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,
-    32,32,32,32,32,32,32,78,114,227,0,0,0,114,228,0,
-    0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,
-    0,114,229,0,0,0,150,5,0,0,115,8,0,0,0,0,
-    8,12,1,8,1,4,1,122,22,80,97,116,104,70,105,110,
-    100,101,114,46,102,105,110,100,95,109,111,100,117,108,101,99,
-    1,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
-    4,0,0,0,79,0,0,0,115,28,0,0,0,100,1,100,
-    2,108,0,109,1,125,3,1,0,124,3,106,2,124,1,105,
-    0,124,2,164,1,142,1,83,0,41,3,97,32,1,0,0,
-    10,32,32,32,32,32,32,32,32,70,105,110,100,32,100,105,
-    115,116,114,105,98,117,116,105,111,110,115,46,10,10,32,32,
-    32,32,32,32,32,32,82,101,116,117,114,110,32,97,110,32,
-    105,116,101,114,97,98,108,101,32,111,102,32,97,108,108,32,
-    68,105,115,116,114,105,98,117,116,105,111,110,32,105,110,115,
-    116,97,110,99,101,115,32,99,97,112,97,98,108,101,32,111,
-    102,10,32,32,32,32,32,32,32,32,108,111,97,100,105,110,
-    103,32,116,104,101,32,109,101,116,97,100,97,116,97,32,102,
-    111,114,32,112,97,99,107,97,103,101,115,32,109,97,116,99,
-    104,105,110,103,32,96,96,99,111,110,116,101,120,116,46,110,
-    97,109,101,96,96,10,32,32,32,32,32,32,32,32,40,111,
-    114,32,97,108,108,32,110,97,109,101,115,32,105,102,32,96,
-    96,78,111,110,101,96,96,32,105,110,100,105,99,97,116,101,
-    100,41,32,97,108,111,110,103,32,116,104,101,32,112,97,116,
-    104,115,32,105,110,32,116,104,101,32,108,105,115,116,10,32,
-    32,32,32,32,32,32,32,111,102,32,100,105,114,101,99,116,
-    111,114,105,101,115,32,96,96,99,111,110,116,101,120,116,46,
-    112,97,116,104,96,96,46,10,32,32,32,32,32,32,32,32,
-    114,0,0,0,0,41,1,218,18,77,101,116,97,100,97,116,
-    97,80,97,116,104,70,105,110,100,101,114,41,3,90,18,105,
-    109,112,111,114,116,108,105,98,46,109,101,116,97,100,97,116,
-    97,114,82,1,0,0,218,18,102,105,110,100,95,100,105,115,
-    116,114,105,98,117,116,105,111,110,115,41,4,114,216,0,0,
-    0,114,143,0,0,0,114,144,0,0,0,114,82,1,0,0,
+    32,32,32,32,32,32,32,32,78,41,7,114,21,0,0,0,
+    114,65,0,0,0,114,83,1,0,0,114,164,0,0,0,114,
+    202,0,0,0,114,205,0,0,0,114,45,1,0,0,41,6,
+    114,216,0,0,0,114,163,0,0,0,114,65,0,0,0,114,
+    225,0,0,0,114,210,0,0,0,114,82,1,0,0,114,10,
+    0,0,0,114,10,0,0,0,114,11,0,0,0,114,226,0,
+    0,0,135,5,0,0,115,26,0,0,0,0,6,8,1,6,
+    1,14,1,8,1,4,1,10,1,6,1,4,3,6,1,16,
+    1,4,2,6,2,122,20,80,97,116,104,70,105,110,100,101,
+    114,46,102,105,110,100,95,115,112,101,99,99,3,0,0,0,
+    0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,
+    67,0,0,0,115,30,0,0,0,124,0,160,0,124,1,124,
+    2,161,2,125,3,124,3,100,1,117,0,114,24,100,1,83,
+    0,124,3,106,1,83,0,41,2,122,170,102,105,110,100,32,
+    116,104,101,32,109,111,100,117,108,101,32,111,110,32,115,121,
+    115,46,112,97,116,104,32,111,114,32,39,112,97,116,104,39,
+    32,98,97,115,101,100,32,111,110,32,115,121,115,46,112,97,
+    116,104,95,104,111,111,107,115,32,97,110,100,10,32,32,32,
+    32,32,32,32,32,115,121,115,46,112,97,116,104,95,105,109,
+    112,111,114,116,101,114,95,99,97,99,104,101,46,10,10,32,
+    32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,
+    111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,
+    46,32,32,85,115,101,32,102,105,110,100,95,115,112,101,99,
+    40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32,
+    32,32,32,32,32,78,114,227,0,0,0,114,228,0,0,0,
     114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,
-    83,1,0,0,163,5,0,0,115,4,0,0,0,0,10,12,
-    1,122,29,80,97,116,104,70,105,110,100,101,114,46,102,105,
-    110,100,95,100,105,115,116,114,105,98,117,116,105,111,110,115,
-    41,1,78,41,2,78,78,41,1,78,41,13,114,149,0,0,
-    0,114,148,0,0,0,114,150,0,0,0,114,151,0,0,0,
-    114,230,0,0,0,114,69,1,0,0,114,75,1,0,0,114,
-    77,1,0,0,114,78,1,0,0,114,81,1,0,0,114,226,
-    0,0,0,114,229,0,0,0,114,83,1,0,0,114,10,0,
-    0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,
-    0,114,68,1,0,0,30,5,0,0,115,34,0,0,0,8,
-    2,4,2,2,1,10,9,2,1,10,12,2,1,10,21,2,
-    1,10,14,2,1,12,31,2,1,12,23,2,1,12,12,2,
-    1,114,68,1,0,0,99,0,0,0,0,0,0,0,0,0,
-    0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115,
-    90,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,
-    100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5,
-    101,6,90,7,100,6,100,7,132,0,90,8,100,8,100,9,
-    132,0,90,9,100,19,100,11,100,12,132,1,90,10,100,13,
-    100,14,132,0,90,11,101,12,100,15,100,16,132,0,131,1,
-    90,13,100,17,100,18,132,0,90,14,100,10,83,0,41,20,
-    218,10,70,105,108,101,70,105,110,100,101,114,122,172,70,105,
-    108,101,45,98,97,115,101,100,32,102,105,110,100,101,114,46,
-    10,10,32,32,32,32,73,110,116,101,114,97,99,116,105,111,
-    110,115,32,119,105,116,104,32,116,104,101,32,102,105,108,101,
-    32,115,121,115,116,101,109,32,97,114,101,32,99,97,99,104,
-    101,100,32,102,111,114,32,112,101,114,102,111,114,109,97,110,
-    99,101,44,32,98,101,105,110,103,10,32,32,32,32,114,101,
-    102,114,101,115,104,101,100,32,119,104,101,110,32,116,104,101,
-    32,100,105,114,101,99,116,111,114,121,32,116,104,101,32,102,
-    105,110,100,101,114,32,105,115,32,104,97,110,100,108,105,110,
-    103,32,104,97,115,32,98,101,101,110,32,109,111,100,105,102,
-    105,101,100,46,10,10,32,32,32,32,99,2,0,0,0,0,
-    0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,7,
-    0,0,0,115,112,0,0,0,103,0,125,3,124,2,68,0,
-    93,32,92,2,137,0,125,4,124,3,160,0,135,0,102,1,
-    100,1,100,2,132,8,124,4,68,0,131,1,161,1,1,0,
-    113,8,124,3,124,0,95,1,124,1,112,54,100,3,124,0,
-    95,2,116,3,124,0,106,2,131,1,115,86,116,4,116,5,
-    160,6,161,0,124,0,106,2,131,2,124,0,95,2,100,4,
-    124,0,95,7,116,8,131,0,124,0,95,9,116,8,131,0,
-    124,0,95,10,100,5,83,0,41,6,122,154,73,110,105,116,
-    105,97,108,105,122,101,32,119,105,116,104,32,116,104,101,32,
-    112,97,116,104,32,116,111,32,115,101,97,114,99,104,32,111,
-    110,32,97,110,100,32,97,32,118,97,114,105,97,98,108,101,
-    32,110,117,109,98,101,114,32,111,102,10,32,32,32,32,32,
-    32,32,32,50,45,116,117,112,108,101,115,32,99,111,110,116,
-    97,105,110,105,110,103,32,116,104,101,32,108,111,97,100,101,
-    114,32,97,110,100,32,116,104,101,32,102,105,108,101,32,115,
-    117,102,102,105,120,101,115,32,116,104,101,32,108,111,97,100,
-    101,114,10,32,32,32,32,32,32,32,32,114,101,99,111,103,
-    110,105,122,101,115,46,99,1,0,0,0,0,0,0,0,0,
-    0,0,0,2,0,0,0,3,0,0,0,51,0,0,0,115,
-    22,0,0,0,124,0,93,14,125,1,124,1,136,0,102,2,
-    86,0,1,0,113,2,100,0,83,0,114,69,0,0,0,114,
-    10,0,0,0,114,40,1,0,0,169,1,114,164,0,0,0,
-    114,10,0,0,0,114,11,0,0,0,114,12,0,0,0,192,
-    5,0,0,114,13,0,0,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,96,0,0,0,114,129,0,0,0,78,41,11,114,191,0,
-    0,0,218,8,95,108,111,97,100,101,114,115,114,65,0,0,
-    0,114,85,0,0,0,114,67,0,0,0,114,24,0,0,0,
-    114,81,0,0,0,218,11,95,112,97,116,104,95,109,116,105,
-    109,101,218,3,115,101,116,218,11,95,112,97,116,104,95,99,
-    97,99,104,101,218,19,95,114,101,108,97,120,101,100,95,112,
-    97,116,104,95,99,97,99,104,101,41,5,114,142,0,0,0,
-    114,65,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,212,
-    0,0,0,114,10,0,0,0,114,85,1,0,0,114,11,0,
-    0,0,114,232,0,0,0,186,5,0,0,115,20,0,0,0,
-    0,4,4,1,12,1,26,1,6,2,10,1,10,1,18,1,
-    6,1,8,1,122,19,70,105,108,101,70,105,110,100,101,114,
-    46,95,95,105,110,105,116,95,95,99,1,0,0,0,0,0,
-    0,0,0,0,0,0,1,0,0,0,2,0,0,0,67,0,
-    0,0,115,10,0,0,0,100,1,124,0,95,0,100,2,83,
-    0,41,3,122,31,73,110,118,97,108,105,100,97,116,101,32,
-    116,104,101,32,100,105,114,101,99,116,111,114,121,32,109,116,
-    105,109,101,46,114,129,0,0,0,78,41,1,114,87,1,0,
-    0,114,13,1,0,0,114,10,0,0,0,114,10,0,0,0,
-    114,11,0,0,0,114,69,1,0,0,202,5,0,0,115,2,
-    0,0,0,0,2,122,28,70,105,108,101,70,105,110,100,101,
-    114,46,105,110,118,97,108,105,100,97,116,101,95,99,97,99,
-    104,101,115,99,2,0,0,0,0,0,0,0,0,0,0,0,
-    3,0,0,0,3,0,0,0,67,0,0,0,115,42,0,0,
-    0,124,0,160,0,124,1,161,1,125,2,124,2,100,1,117,
-    0,114,26,100,1,103,0,102,2,83,0,124,2,106,1,124,
-    2,106,2,112,38,103,0,102,2,83,0,41,2,122,197,84,
-    114,121,32,116,111,32,102,105,110,100,32,97,32,108,111,97,
-    100,101,114,32,102,111,114,32,116,104,101,32,115,112,101,99,
-    105,102,105,101,100,32,109,111,100,117,108,101,44,32,111,114,
-    32,116,104,101,32,110,97,109,101,115,112,97,99,101,10,32,
-    32,32,32,32,32,32,32,112,97,99,107,97,103,101,32,112,
-    111,114,116,105,111,110,115,46,32,82,101,116,117,114,110,115,
-    32,40,108,111,97,100,101,114,44,32,108,105,115,116,45,111,
-    102,45,112,111,114,116,105,111,110,115,41,46,10,10,32,32,
-    32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,
-    100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,
-    32,32,85,115,101,32,102,105,110,100,95,115,112,101,99,40,
-    41,32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,
-    32,32,32,32,78,41,3,114,226,0,0,0,114,164,0,0,
-    0,114,202,0,0,0,41,3,114,142,0,0,0,114,163,0,
-    0,0,114,210,0,0,0,114,10,0,0,0,114,10,0,0,
-    0,114,11,0,0,0,114,161,0,0,0,208,5,0,0,115,
-    8,0,0,0,0,7,10,1,8,1,8,1,122,22,70,105,
-    108,101,70,105,110,100,101,114,46,102,105,110,100,95,108,111,
-    97,100,101,114,99,6,0,0,0,0,0,0,0,0,0,0,
-    0,7,0,0,0,6,0,0,0,67,0,0,0,115,26,0,
-    0,0,124,1,124,2,124,3,131,2,125,6,116,0,124,2,
-    124,3,124,6,124,4,100,1,141,4,83,0,41,2,78,114,
-    201,0,0,0,41,1,114,213,0,0,0,41,7,114,142,0,
-    0,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,10,0,0,0,114,10,0,0,0,114,11,0,0,0,
-    114,81,1,0,0,220,5,0,0,115,8,0,0,0,0,1,
-    10,1,8,1,2,255,122,20,70,105,108,101,70,105,110,100,
-    101,114,46,95,103,101,116,95,115,112,101,99,78,99,3,0,
-    0,0,0,0,0,0,0,0,0,0,14,0,0,0,9,0,
-    0,0,67,0,0,0,115,126,1,0,0,100,1,125,3,124,
-    1,160,0,100,2,161,1,100,3,25,0,125,4,122,24,116,
-    1,124,0,106,2,112,34,116,3,160,4,161,0,131,1,106,
-    5,125,5,87,0,110,22,4,0,116,6,121,64,1,0,1,
-    0,1,0,100,4,125,5,89,0,110,2,48,0,124,5,124,
-    0,106,7,107,3,114,90,124,0,160,8,161,0,1,0,124,
-    5,124,0,95,7,116,9,131,0,114,112,124,0,106,10,125,
-    6,124,4,160,11,161,0,125,7,110,10,124,0,106,12,125,
-    6,124,4,125,7,124,7,124,6,118,0,114,216,116,13,124,
-    0,106,2,124,4,131,2,125,8,124,0,106,14,68,0,93,
-    58,92,2,125,9,125,10,100,5,124,9,23,0,125,11,116,
-    13,124,8,124,11,131,2,125,12,116,15,124,12,131,1,114,
-    148,124,0,160,16,124,10,124,1,124,12,124,8,103,1,124,
-    2,161,5,2,0,1,0,83,0,113,148,116,17,124,8,131,
-    1,125,3,124,0,106,14,68,0,93,112,92,2,125,9,125,
-    10,122,20,116,13,124,0,106,2,124,4,124,9,23,0,131,
-    2,125,12,87,0,110,24,4,0,116,18,144,1,121,18,1,
-    0,1,0,1,0,89,0,1,0,100,6,83,0,48,0,116,
-    19,106,20,100,7,124,12,100,3,100,8,141,3,1,0,124,
-    7,124,9,23,0,124,6,118,0,114,222,116,15,124,12,131,
-    1,114,222,124,0,160,16,124,10,124,1,124,12,100,6,124,
-    2,161,5,2,0,1,0,83,0,113,222,124,3,144,1,114,
-    122,116,19,160,20,100,9,124,8,161,2,1,0,116,19,160,
-    21,124,1,100,6,161,2,125,13,124,8,103,1,124,13,95,
-    22,124,13,83,0,100,6,83,0,41,10,122,111,84,114,121,
-    32,116,111,32,102,105,110,100,32,97,32,115,112,101,99,32,
-    102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,
-    100,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,
-    32,32,32,82,101,116,117,114,110,115,32,116,104,101,32,109,
-    97,116,99,104,105,110,103,32,115,112,101,99,44,32,111,114,
-    32,78,111,110,101,32,105,102,32,110,111,116,32,102,111,117,
-    110,100,46,10,32,32,32,32,32,32,32,32,70,114,96,0,
-    0,0,114,45,0,0,0,114,129,0,0,0,114,232,0,0,
-    0,78,122,9,116,114,121,105,110,103,32,123,125,41,1,90,
-    9,118,101,114,98,111,115,105,116,121,122,25,112,111,115,115,
-    105,98,108,101,32,110,97,109,101,115,112,97,99,101,32,102,
-    111,114,32,123,125,41,23,114,103,0,0,0,114,75,0,0,
-    0,114,65,0,0,0,114,24,0,0,0,114,81,0,0,0,
-    114,33,1,0,0,114,76,0,0,0,114,87,1,0,0,218,
-    11,95,102,105,108,108,95,99,97,99,104,101,114,27,0,0,
-    0,114,90,1,0,0,114,130,0,0,0,114,89,1,0,0,
-    114,67,0,0,0,114,86,1,0,0,114,80,0,0,0,114,
-    81,1,0,0,114,82,0,0,0,114,110,0,0,0,114,158,
-    0,0,0,114,173,0,0,0,114,207,0,0,0,114,202,0,
-    0,0,41,14,114,142,0,0,0,114,163,0,0,0,114,225,
-    0,0,0,90,12,105,115,95,110,97,109,101,115,112,97,99,
-    101,90,11,116,97,105,108,95,109,111,100,117,108,101,114,193,
-    0,0,0,90,5,99,97,99,104,101,90,12,99,97,99,104,
-    101,95,109,111,100,117,108,101,90,9,98,97,115,101,95,112,
-    97,116,104,114,41,1,0,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,10,0,0,
-    0,114,10,0,0,0,114,11,0,0,0,114,226,0,0,0,
-    225,5,0,0,115,78,0,0,0,0,5,4,1,14,1,2,
-    1,24,1,12,1,10,1,10,1,8,1,6,2,6,1,6,
-    1,10,2,6,1,4,2,8,1,12,1,14,1,8,1,10,
-    1,8,1,26,4,8,2,14,1,2,1,20,1,14,1,10,
-    1,16,1,12,1,8,1,10,1,4,255,10,2,6,1,12,
-    1,12,1,8,1,4,1,122,20,70,105,108,101,70,105,110,
-    100,101,114,46,102,105,110,100,95,115,112,101,99,99,1,0,
-    0,0,0,0,0,0,0,0,0,0,9,0,0,0,10,0,
-    0,0,67,0,0,0,115,188,0,0,0,124,0,106,0,125,
-    1,122,22,116,1,160,2,124,1,112,22,116,1,160,3,161,
-    0,161,1,125,2,87,0,110,28,4,0,116,4,116,5,116,
-    6,102,3,121,56,1,0,1,0,1,0,103,0,125,2,89,
-    0,110,2,48,0,116,7,106,8,160,9,100,1,161,1,115,
-    82,116,10,124,2,131,1,124,0,95,11,110,74,116,10,131,
-    0,125,3,124,2,68,0,93,56,125,4,124,4,160,12,100,
-    2,161,1,92,3,125,5,125,6,125,7,124,6,114,134,100,
-    3,160,13,124,5,124,7,160,14,161,0,161,2,125,8,110,
-    4,124,5,125,8,124,3,160,15,124,8,161,1,1,0,113,
-    92,124,3,124,0,95,11,116,7,106,8,160,9,116,16,161,
-    1,114,184,100,4,100,5,132,0,124,2,68,0,131,1,124,
-    0,95,17,100,6,83,0,41,7,122,68,70,105,108,108,32,
-    116,104,101,32,99,97,99,104,101,32,111,102,32,112,111,116,
-    101,110,116,105,97,108,32,109,111,100,117,108,101,115,32,97,
-    110,100,32,112,97,99,107,97,103,101,115,32,102,111,114,32,
-    116,104,105,115,32,100,105,114,101,99,116,111,114,121,46,114,
-    20,0,0,0,114,96,0,0,0,114,87,0,0,0,99,1,
-    0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,
-    0,0,0,83,0,0,0,115,20,0,0,0,104,0,124,0,
-    93,12,125,1,124,1,160,0,161,0,146,2,113,4,83,0,
-    114,10,0,0,0,41,1,114,130,0,0,0,41,2,114,8,
-    0,0,0,90,2,102,110,114,10,0,0,0,114,10,0,0,
-    0,114,11,0,0,0,114,19,0,0,0,49,6,0,0,114,
-    13,0,0,0,122,41,70,105,108,101,70,105,110,100,101,114,
-    46,95,102,105,108,108,95,99,97,99,104,101,46,60,108,111,
-    99,97,108,115,62,46,60,115,101,116,99,111,109,112,62,78,
-    41,18,114,65,0,0,0,114,24,0,0,0,114,30,1,0,
-    0,114,81,0,0,0,114,26,1,0,0,218,15,80,101,114,
-    109,105,115,115,105,111,110,69,114,114,111,114,218,18,78,111,
-    116,65,68,105,114,101,99,116,111,114,121,69,114,114,111,114,
-    114,21,0,0,0,114,28,0,0,0,114,29,0,0,0,114,
-    88,1,0,0,114,89,1,0,0,114,125,0,0,0,114,88,
-    0,0,0,114,130,0,0,0,218,3,97,100,100,114,30,0,
-    0,0,114,90,1,0,0,41,9,114,142,0,0,0,114,65,
-    0,0,0,114,31,1,0,0,90,21,108,111,119,101,114,95,
-    115,117,102,102,105,120,95,99,111,110,116,101,110,116,115,114,
-    64,1,0,0,114,140,0,0,0,114,52,1,0,0,114,41,
-    1,0,0,90,8,110,101,119,95,110,97,109,101,114,10,0,
-    0,0,114,10,0,0,0,114,11,0,0,0,114,92,1,0,
-    0,20,6,0,0,115,34,0,0,0,0,2,6,1,2,1,
-    22,1,18,3,10,3,12,1,12,7,6,1,8,1,16,1,
-    4,1,18,2,4,1,12,1,6,1,12,1,122,22,70,105,
-    108,101,70,105,110,100,101,114,46,95,102,105,108,108,95,99,
-    97,99,104,101,99,1,0,0,0,0,0,0,0,0,0,0,
-    0,3,0,0,0,3,0,0,0,7,0,0,0,115,18,0,
-    0,0,135,0,135,1,102,2,100,1,100,2,132,8,125,2,
-    124,2,83,0,41,3,97,20,1,0,0,65,32,99,108,97,
-    115,115,32,109,101,116,104,111,100,32,119,104,105,99,104,32,
-    114,101,116,117,114,110,115,32,97,32,99,108,111,115,117,114,
-    101,32,116,111,32,117,115,101,32,111,110,32,115,121,115,46,
-    112,97,116,104,95,104,111,111,107,10,32,32,32,32,32,32,
-    32,32,119,104,105,99,104,32,119,105,108,108,32,114,101,116,
-    117,114,110,32,97,110,32,105,110,115,116,97,110,99,101,32,
-    117,115,105,110,103,32,116,104,101,32,115,112,101,99,105,102,
-    105,101,100,32,108,111,97,100,101,114,115,32,97,110,100,32,
-    116,104,101,32,112,97,116,104,10,32,32,32,32,32,32,32,
-    32,99,97,108,108,101,100,32,111,110,32,116,104,101,32,99,
-    108,111,115,117,114,101,46,10,10,32,32,32,32,32,32,32,
-    32,73,102,32,116,104,101,32,112,97,116,104,32,99,97,108,
-    108,101,100,32,111,110,32,116,104,101,32,99,108,111,115,117,
-    114,101,32,105,115,32,110,111,116,32,97,32,100,105,114,101,
-    99,116,111,114,121,44,32,73,109,112,111,114,116,69,114,114,
-    111,114,32,105,115,10,32,32,32,32,32,32,32,32,114,97,
-    105,115,101,100,46,10,10,32,32,32,32,32,32,32,32,99,
-    1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
-    4,0,0,0,19,0,0,0,115,36,0,0,0,116,0,124,
-    0,131,1,115,20,116,1,100,1,124,0,100,2,141,2,130,
-    1,136,0,124,0,103,1,136,1,162,1,82,0,142,0,83,
-    0,41,3,122,45,80,97,116,104,32,104,111,111,107,32,102,
-    111,114,32,105,109,112,111,114,116,108,105,98,46,109,97,99,
-    104,105,110,101,114,121,46,70,105,108,101,70,105,110,100,101,
-    114,46,122,30,111,110,108,121,32,100,105,114,101,99,116,111,
-    114,105,101,115,32,97,114,101,32,115,117,112,112,111,114,116,
-    101,100,114,71,0,0,0,41,2,114,82,0,0,0,114,141,
-    0,0,0,114,71,0,0,0,169,2,114,216,0,0,0,114,
-    91,1,0,0,114,10,0,0,0,114,11,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,61,6,0,0,115,6,0,0,
-    0,0,2,8,1,12,1,122,54,70,105,108,101,70,105,110,
-    100,101,114,46,112,97,116,104,95,104,111,111,107,46,60,108,
-    111,99,97,108,115,62,46,112,97,116,104,95,104,111,111,107,
-    95,102,111,114,95,70,105,108,101,70,105,110,100,101,114,114,
-    10,0,0,0,41,3,114,216,0,0,0,114,91,1,0,0,
-    114,97,1,0,0,114,10,0,0,0,114,96,1,0,0,114,
-    11,0,0,0,218,9,112,97,116,104,95,104,111,111,107,51,
-    6,0,0,115,4,0,0,0,0,10,14,6,122,20,70,105,
-    108,101,70,105,110,100,101,114,46,112,97,116,104,95,104,111,
-    111,107,99,1,0,0,0,0,0,0,0,0,0,0,0,1,
-    0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,
-    100,1,160,0,124,0,106,1,161,1,83,0,41,2,78,122,
-    16,70,105,108,101,70,105,110,100,101,114,40,123,33,114,125,
-    41,41,2,114,88,0,0,0,114,65,0,0,0,114,13,1,
-    0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,
-    0,114,62,1,0,0,69,6,0,0,115,2,0,0,0,0,
-    1,122,19,70,105,108,101,70,105,110,100,101,114,46,95,95,
-    114,101,112,114,95,95,41,1,78,41,15,114,149,0,0,0,
-    114,148,0,0,0,114,150,0,0,0,114,151,0,0,0,114,
-    232,0,0,0,114,69,1,0,0,114,167,0,0,0,114,229,
-    0,0,0,114,161,0,0,0,114,81,1,0,0,114,226,0,
-    0,0,114,92,1,0,0,114,230,0,0,0,114,98,1,0,
-    0,114,62,1,0,0,114,10,0,0,0,114,10,0,0,0,
-    114,10,0,0,0,114,11,0,0,0,114,84,1,0,0,177,
-    5,0,0,115,22,0,0,0,8,2,4,7,8,16,8,4,
-    4,2,8,12,8,5,10,51,8,31,2,1,10,17,114,84,
-    1,0,0,99,4,0,0,0,0,0,0,0,0,0,0,0,
-    6,0,0,0,8,0,0,0,67,0,0,0,115,144,0,0,
-    0,124,0,160,0,100,1,161,1,125,4,124,0,160,0,100,
-    2,161,1,125,5,124,4,115,66,124,5,114,36,124,5,106,
-    1,125,4,110,30,124,2,124,3,107,2,114,56,116,2,124,
-    1,124,2,131,2,125,4,110,10,116,3,124,1,124,2,131,
-    2,125,4,124,5,115,84,116,4,124,1,124,2,124,4,100,
-    3,141,3,125,5,122,36,124,5,124,0,100,2,60,0,124,
-    4,124,0,100,1,60,0,124,2,124,0,100,4,60,0,124,
-    3,124,0,100,5,60,0,87,0,110,18,4,0,116,5,121,
-    138,1,0,1,0,1,0,89,0,110,2,48,0,100,0,83,
-    0,41,6,78,218,10,95,95,108,111,97,100,101,114,95,95,
-    218,8,95,95,115,112,101,99,95,95,114,85,1,0,0,90,
-    8,95,95,102,105,108,101,95,95,90,10,95,95,99,97,99,
-    104,101,100,95,95,41,6,218,3,103,101,116,114,164,0,0,
-    0,114,39,1,0,0,114,32,1,0,0,114,213,0,0,0,
-    218,9,69,120,99,101,112,116,105,111,110,41,6,90,2,110,
-    115,114,140,0,0,0,90,8,112,97,116,104,110,97,109,101,
-    90,9,99,112,97,116,104,110,97,109,101,114,164,0,0,0,
+    229,0,0,0,159,5,0,0,115,8,0,0,0,0,8,12,
+    1,8,1,4,1,122,22,80,97,116,104,70,105,110,100,101,
+    114,46,102,105,110,100,95,109,111,100,117,108,101,99,1,0,
+    0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,
+    0,0,79,0,0,0,115,28,0,0,0,100,1,100,2,108,
+    0,109,1,125,3,1,0,124,3,106,2,124,1,105,0,124,
+    2,164,1,142,1,83,0,41,3,97,32,1,0,0,10,32,
+    32,32,32,32,32,32,32,70,105,110,100,32,100,105,115,116,
+    114,105,98,117,116,105,111,110,115,46,10,10,32,32,32,32,
+    32,32,32,32,82,101,116,117,114,110,32,97,110,32,105,116,
+    101,114,97,98,108,101,32,111,102,32,97,108,108,32,68,105,
+    115,116,114,105,98,117,116,105,111,110,32,105,110,115,116,97,
+    110,99,101,115,32,99,97,112,97,98,108,101,32,111,102,10,
+    32,32,32,32,32,32,32,32,108,111,97,100,105,110,103,32,
+    116,104,101,32,109,101,116,97,100,97,116,97,32,102,111,114,
+    32,112,97,99,107,97,103,101,115,32,109,97,116,99,104,105,
+    110,103,32,96,96,99,111,110,116,101,120,116,46,110,97,109,
+    101,96,96,10,32,32,32,32,32,32,32,32,40,111,114,32,
+    97,108,108,32,110,97,109,101,115,32,105,102,32,96,96,78,
+    111,110,101,96,96,32,105,110,100,105,99,97,116,101,100,41,
+    32,97,108,111,110,103,32,116,104,101,32,112,97,116,104,115,
+    32,105,110,32,116,104,101,32,108,105,115,116,10,32,32,32,
+    32,32,32,32,32,111,102,32,100,105,114,101,99,116,111,114,
+    105,101,115,32,96,96,99,111,110,116,101,120,116,46,112,97,
+    116,104,96,96,46,10,32,32,32,32,32,32,32,32,114,0,
+    0,0,0,41,1,218,18,77,101,116,97,100,97,116,97,80,
+    97,116,104,70,105,110,100,101,114,41,3,90,18,105,109,112,
+    111,114,116,108,105,98,46,109,101,116,97,100,97,116,97,114,
+    84,1,0,0,218,18,102,105,110,100,95,100,105,115,116,114,
+    105,98,117,116,105,111,110,115,41,4,114,216,0,0,0,114,
+    143,0,0,0,114,144,0,0,0,114,84,1,0,0,114,10,
+    0,0,0,114,10,0,0,0,114,11,0,0,0,114,85,1,
+    0,0,172,5,0,0,115,4,0,0,0,0,10,12,1,122,
+    29,80,97,116,104,70,105,110,100,101,114,46,102,105,110,100,
+    95,100,105,115,116,114,105,98,117,116,105,111,110,115,41,1,
+    78,41,2,78,78,41,1,78,41,13,114,149,0,0,0,114,
+    148,0,0,0,114,150,0,0,0,114,151,0,0,0,114,230,
+    0,0,0,114,71,1,0,0,114,77,1,0,0,114,79,1,
+    0,0,114,80,1,0,0,114,83,1,0,0,114,226,0,0,
+    0,114,229,0,0,0,114,85,1,0,0,114,10,0,0,0,
+    114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,
+    70,1,0,0,36,5,0,0,115,34,0,0,0,8,2,4,
+    2,2,1,10,12,2,1,10,12,2,1,10,21,2,1,10,
+    14,2,1,12,31,2,1,12,23,2,1,12,12,2,1,114,
+    70,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,
+    0,0,0,0,0,3,0,0,0,64,0,0,0,115,90,0,
+    0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,
+    100,3,132,0,90,4,100,4,100,5,132,0,90,5,101,6,
+    90,7,100,6,100,7,132,0,90,8,100,8,100,9,132,0,
+    90,9,100,19,100,11,100,12,132,1,90,10,100,13,100,14,
+    132,0,90,11,101,12,100,15,100,16,132,0,131,1,90,13,
+    100,17,100,18,132,0,90,14,100,10,83,0,41,20,218,10,
+    70,105,108,101,70,105,110,100,101,114,122,172,70,105,108,101,
+    45,98,97,115,101,100,32,102,105,110,100,101,114,46,10,10,
+    32,32,32,32,73,110,116,101,114,97,99,116,105,111,110,115,
+    32,119,105,116,104,32,116,104,101,32,102,105,108,101,32,115,
+    121,115,116,101,109,32,97,114,101,32,99,97,99,104,101,100,
+    32,102,111,114,32,112,101,114,102,111,114,109,97,110,99,101,
+    44,32,98,101,105,110,103,10,32,32,32,32,114,101,102,114,
+    101,115,104,101,100,32,119,104,101,110,32,116,104,101,32,100,
+    105,114,101,99,116,111,114,121,32,116,104,101,32,102,105,110,
+    100,101,114,32,105,115,32,104,97,110,100,108,105,110,103,32,
+    104,97,115,32,98,101,101,110,32,109,111,100,105,102,105,101,
+    100,46,10,10,32,32,32,32,99,2,0,0,0,0,0,0,
+    0,0,0,0,0,5,0,0,0,6,0,0,0,7,0,0,
+    0,115,112,0,0,0,103,0,125,3,124,2,68,0,93,32,
+    92,2,137,0,125,4,124,3,160,0,135,0,102,1,100,1,
+    100,2,132,8,124,4,68,0,131,1,161,1,1,0,113,8,
+    124,3,124,0,95,1,124,1,112,54,100,3,124,0,95,2,
+    116,3,124,0,106,2,131,1,115,86,116,4,116,5,160,6,
+    161,0,124,0,106,2,131,2,124,0,95,2,100,4,124,0,
+    95,7,116,8,131,0,124,0,95,9,116,8,131,0,124,0,
+    95,10,100,5,83,0,41,6,122,154,73,110,105,116,105,97,
+    108,105,122,101,32,119,105,116,104,32,116,104,101,32,112,97,
+    116,104,32,116,111,32,115,101,97,114,99,104,32,111,110,32,
+    97,110,100,32,97,32,118,97,114,105,97,98,108,101,32,110,
+    117,109,98,101,114,32,111,102,10,32,32,32,32,32,32,32,
+    32,50,45,116,117,112,108,101,115,32,99,111,110,116,97,105,
+    110,105,110,103,32,116,104,101,32,108,111,97,100,101,114,32,
+    97,110,100,32,116,104,101,32,102,105,108,101,32,115,117,102,
+    102,105,120,101,115,32,116,104,101,32,108,111,97,100,101,114,
+    10,32,32,32,32,32,32,32,32,114,101,99,111,103,110,105,
+    122,101,115,46,99,1,0,0,0,0,0,0,0,0,0,0,
+    0,2,0,0,0,3,0,0,0,51,0,0,0,115,22,0,
+    0,0,124,0,93,14,125,1,124,1,136,0,102,2,86,0,
+    1,0,113,2,100,0,83,0,114,69,0,0,0,114,10,0,
+    0,0,114,40,1,0,0,169,1,114,164,0,0,0,114,10,
+    0,0,0,114,11,0,0,0,114,12,0,0,0,201,5,0,
+    0,114,13,0,0,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,96,
+    0,0,0,114,129,0,0,0,78,41,11,114,191,0,0,0,
+    218,8,95,108,111,97,100,101,114,115,114,65,0,0,0,114,
+    85,0,0,0,114,67,0,0,0,114,24,0,0,0,114,81,
+    0,0,0,218,11,95,112,97,116,104,95,109,116,105,109,101,
+    218,3,115,101,116,218,11,95,112,97,116,104,95,99,97,99,
+    104,101,218,19,95,114,101,108,97,120,101,100,95,112,97,116,
+    104,95,99,97,99,104,101,41,5,114,142,0,0,0,114,65,
+    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,212,0,0,
+    0,114,10,0,0,0,114,87,1,0,0,114,11,0,0,0,
+    114,232,0,0,0,195,5,0,0,115,20,0,0,0,0,4,
+    4,1,12,1,26,1,6,2,10,1,10,1,18,1,6,1,
+    8,1,122,19,70,105,108,101,70,105,110,100,101,114,46,95,
+    95,105,110,105,116,95,95,99,1,0,0,0,0,0,0,0,
+    0,0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,
+    115,10,0,0,0,100,1,124,0,95,0,100,2,83,0,41,
+    3,122,31,73,110,118,97,108,105,100,97,116,101,32,116,104,
+    101,32,100,105,114,101,99,116,111,114,121,32,109,116,105,109,
+    101,46,114,129,0,0,0,78,41,1,114,89,1,0,0,114,
+    13,1,0,0,114,10,0,0,0,114,10,0,0,0,114,11,
+    0,0,0,114,71,1,0,0,211,5,0,0,115,2,0,0,
+    0,0,2,122,28,70,105,108,101,70,105,110,100,101,114,46,
+    105,110,118,97,108,105,100,97,116,101,95,99,97,99,104,101,
+    115,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,
+    0,0,3,0,0,0,67,0,0,0,115,42,0,0,0,124,
+    0,160,0,124,1,161,1,125,2,124,2,100,1,117,0,114,
+    26,100,1,103,0,102,2,83,0,124,2,106,1,124,2,106,
+    2,112,38,103,0,102,2,83,0,41,2,122,197,84,114,121,
+    32,116,111,32,102,105,110,100,32,97,32,108,111,97,100,101,
+    114,32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,
+    105,101,100,32,109,111,100,117,108,101,44,32,111,114,32,116,
+    104,101,32,110,97,109,101,115,112,97,99,101,10,32,32,32,
+    32,32,32,32,32,112,97,99,107,97,103,101,32,112,111,114,
+    116,105,111,110,115,46,32,82,101,116,117,114,110,115,32,40,
+    108,111,97,100,101,114,44,32,108,105,115,116,45,111,102,45,
+    112,111,114,116,105,111,110,115,41,46,10,10,32,32,32,32,
+    32,32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,
+    105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,
+    85,115,101,32,102,105,110,100,95,115,112,101,99,40,41,32,
+    105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,
+    32,32,78,41,3,114,226,0,0,0,114,164,0,0,0,114,
+    202,0,0,0,41,3,114,142,0,0,0,114,163,0,0,0,
     114,210,0,0,0,114,10,0,0,0,114,10,0,0,0,114,
-    11,0,0,0,218,14,95,102,105,120,95,117,112,95,109,111,
-    100,117,108,101,75,6,0,0,115,34,0,0,0,0,2,10,
-    1,10,1,4,1,4,1,8,1,8,1,12,2,10,1,4,
-    1,14,1,2,1,8,1,8,1,8,1,12,1,12,2,114,
-    103,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,
-    0,3,0,0,0,3,0,0,0,67,0,0,0,115,38,0,
-    0,0,116,0,116,1,160,2,161,0,102,2,125,0,116,3,
-    116,4,102,2,125,1,116,5,116,6,102,2,125,2,124,0,
-    124,1,124,2,103,3,83,0,41,1,122,95,82,101,116,117,
-    114,110,115,32,97,32,108,105,115,116,32,111,102,32,102,105,
-    108,101,45,98,97,115,101,100,32,109,111,100,117,108,101,32,
-    108,111,97,100,101,114,115,46,10,10,32,32,32,32,69,97,
-    99,104,32,105,116,101,109,32,105,115,32,97,32,116,117,112,
-    108,101,32,40,108,111,97,100,101,114,44,32,115,117,102,102,
-    105,120,101,115,41,46,10,32,32,32,32,41,7,114,19,1,
-    0,0,114,187,0,0,0,218,18,101,120,116,101,110,115,105,
-    111,110,95,115,117,102,102,105,120,101,115,114,32,1,0,0,
-    114,126,0,0,0,114,39,1,0,0,114,112,0,0,0,41,
-    3,90,10,101,120,116,101,110,115,105,111,110,115,90,6,115,
-    111,117,114,99,101,90,8,98,121,116,101,99,111,100,101,114,
-    10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,208,
-    0,0,0,98,6,0,0,115,8,0,0,0,0,5,12,1,
-    8,1,8,1,114,208,0,0,0,99,1,0,0,0,0,0,
-    0,0,0,0,0,0,10,0,0,0,9,0,0,0,67,0,
-    0,0,115,132,1,0,0,124,0,97,0,116,0,106,1,97,
-    1,116,0,106,2,97,2,116,1,106,3,116,4,25,0,125,
-    1,100,1,100,2,103,1,102,2,100,3,100,4,100,2,103,
-    2,102,2,102,2,125,2,124,2,68,0,93,108,92,2,125,
-    3,125,4,116,5,100,5,100,6,132,0,124,4,68,0,131,
-    1,131,1,115,82,74,0,130,1,124,4,100,7,25,0,125,
-    5,124,3,116,1,106,3,118,0,114,116,116,1,106,3,124,
-    3,25,0,125,6,1,0,113,170,113,52,122,20,116,0,160,
-    6,124,3,161,1,125,6,87,0,1,0,113,170,87,0,113,
-    52,4,0,116,7,121,158,1,0,1,0,1,0,89,0,113,
-    52,89,0,113,52,48,0,113,52,116,7,100,8,131,1,130,
-    1,116,8,124,1,100,9,124,6,131,3,1,0,116,8,124,
-    1,100,10,124,5,131,3,1,0,116,8,124,1,100,11,100,
-    12,160,9,124,4,161,1,131,3,1,0,116,8,124,1,100,
-    13,100,14,100,15,132,0,124,4,68,0,131,1,131,3,1,
-    0,103,0,100,16,162,1,125,7,124,3,100,3,107,2,144,
-    1,114,6,124,7,160,10,100,17,161,1,1,0,124,7,68,
-    0,93,52,125,8,124,8,116,1,106,3,118,1,144,1,114,
-    38,116,0,160,6,124,8,161,1,125,9,110,10,116,1,106,
-    3,124,8,25,0,125,9,116,8,124,1,124,8,124,9,131,
-    3,1,0,144,1,113,10,116,8,124,1,100,18,116,11,131,
-    0,131,3,1,0,116,12,160,13,116,2,160,14,161,0,161,
-    1,1,0,124,3,100,3,107,2,144,1,114,128,116,15,160,
-    10,100,19,161,1,1,0,100,20,116,12,118,0,144,1,114,
-    128,100,21,116,16,95,17,100,22,83,0,41,23,122,205,83,
-    101,116,117,112,32,116,104,101,32,112,97,116,104,45,98,97,
-    115,101,100,32,105,109,112,111,114,116,101,114,115,32,102,111,
-    114,32,105,109,112,111,114,116,108,105,98,32,98,121,32,105,
-    109,112,111,114,116,105,110,103,32,110,101,101,100,101,100,10,
-    32,32,32,32,98,117,105,108,116,45,105,110,32,109,111,100,
-    117,108,101,115,32,97,110,100,32,105,110,106,101,99,116,105,
-    110,103,32,116,104,101,109,32,105,110,116,111,32,116,104,101,
-    32,103,108,111,98,97,108,32,110,97,109,101,115,112,97,99,
-    101,46,10,10,32,32,32,32,79,116,104,101,114,32,99,111,
-    109,112,111,110,101,110,116,115,32,97,114,101,32,101,120,116,
-    114,97,99,116,101,100,32,102,114,111,109,32,116,104,101,32,
-    99,111,114,101,32,98,111,111,116,115,116,114,97,112,32,109,
-    111,100,117,108,101,46,10,10,32,32,32,32,218,5,112,111,
-    115,105,120,114,2,0,0,0,218,2,110,116,114,1,0,0,
-    0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,
-    0,0,3,0,0,0,115,0,0,0,115,26,0,0,0,124,
-    0,93,18,125,1,116,0,124,1,131,1,100,0,107,2,86,
-    0,1,0,113,2,100,1,83,0,114,3,0,0,0,114,5,
-    0,0,0,114,7,0,0,0,114,10,0,0,0,114,10,0,
-    0,0,114,11,0,0,0,114,12,0,0,0,127,6,0,0,
-    114,13,0,0,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,0,0,0,0,122,30,105,109,112,111,114,116,108,105,98,
-    32,114,101,113,117,105,114,101,115,32,112,111,115,105,120,32,
-    111,114,32,110,116,114,24,0,0,0,114,59,0,0,0,114,
-    50,0,0,0,114,14,0,0,0,218,20,95,112,97,116,104,
-    115,101,112,115,95,119,105,116,104,95,99,111,108,111,110,99,
+    11,0,0,0,114,161,0,0,0,217,5,0,0,115,8,0,
+    0,0,0,7,10,1,8,1,8,1,122,22,70,105,108,101,
+    70,105,110,100,101,114,46,102,105,110,100,95,108,111,97,100,
+    101,114,99,6,0,0,0,0,0,0,0,0,0,0,0,7,
+    0,0,0,6,0,0,0,67,0,0,0,115,26,0,0,0,
+    124,1,124,2,124,3,131,2,125,6,116,0,124,2,124,3,
+    124,6,124,4,100,1,141,4,83,0,41,2,78,114,201,0,
+    0,0,41,1,114,213,0,0,0,41,7,114,142,0,0,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,
+    10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,83,
+    1,0,0,229,5,0,0,115,8,0,0,0,0,1,10,1,
+    8,1,2,255,122,20,70,105,108,101,70,105,110,100,101,114,
+    46,95,103,101,116,95,115,112,101,99,78,99,3,0,0,0,
+    0,0,0,0,0,0,0,0,14,0,0,0,9,0,0,0,
+    67,0,0,0,115,126,1,0,0,100,1,125,3,124,1,160,
+    0,100,2,161,1,100,3,25,0,125,4,122,24,116,1,124,
+    0,106,2,112,34,116,3,160,4,161,0,131,1,106,5,125,
+    5,87,0,110,22,4,0,116,6,121,64,1,0,1,0,1,
+    0,100,4,125,5,89,0,110,2,48,0,124,5,124,0,106,
+    7,107,3,114,90,124,0,160,8,161,0,1,0,124,5,124,
+    0,95,7,116,9,131,0,114,112,124,0,106,10,125,6,124,
+    4,160,11,161,0,125,7,110,10,124,0,106,12,125,6,124,
+    4,125,7,124,7,124,6,118,0,114,216,116,13,124,0,106,
+    2,124,4,131,2,125,8,124,0,106,14,68,0,93,58,92,
+    2,125,9,125,10,100,5,124,9,23,0,125,11,116,13,124,
+    8,124,11,131,2,125,12,116,15,124,12,131,1,114,148,124,
+    0,160,16,124,10,124,1,124,12,124,8,103,1,124,2,161,
+    5,2,0,1,0,83,0,113,148,116,17,124,8,131,1,125,
+    3,124,0,106,14,68,0,93,112,92,2,125,9,125,10,122,
+    20,116,13,124,0,106,2,124,4,124,9,23,0,131,2,125,
+    12,87,0,110,24,4,0,116,18,144,1,121,18,1,0,1,
+    0,1,0,89,0,1,0,100,6,83,0,48,0,116,19,106,
+    20,100,7,124,12,100,3,100,8,141,3,1,0,124,7,124,
+    9,23,0,124,6,118,0,114,222,116,15,124,12,131,1,114,
+    222,124,0,160,16,124,10,124,1,124,12,100,6,124,2,161,
+    5,2,0,1,0,83,0,113,222,124,3,144,1,114,122,116,
+    19,160,20,100,9,124,8,161,2,1,0,116,19,160,21,124,
+    1,100,6,161,2,125,13,124,8,103,1,124,13,95,22,124,
+    13,83,0,100,6,83,0,41,10,122,111,84,114,121,32,116,
+    111,32,102,105,110,100,32,97,32,115,112,101,99,32,102,111,
+    114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,
+    109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,
+    32,82,101,116,117,114,110,115,32,116,104,101,32,109,97,116,
+    99,104,105,110,103,32,115,112,101,99,44,32,111,114,32,78,
+    111,110,101,32,105,102,32,110,111,116,32,102,111,117,110,100,
+    46,10,32,32,32,32,32,32,32,32,70,114,96,0,0,0,
+    114,45,0,0,0,114,129,0,0,0,114,232,0,0,0,78,
+    122,9,116,114,121,105,110,103,32,123,125,41,1,90,9,118,
+    101,114,98,111,115,105,116,121,122,25,112,111,115,115,105,98,
+    108,101,32,110,97,109,101,115,112,97,99,101,32,102,111,114,
+    32,123,125,41,23,114,103,0,0,0,114,75,0,0,0,114,
+    65,0,0,0,114,24,0,0,0,114,81,0,0,0,114,33,
+    1,0,0,114,76,0,0,0,114,89,1,0,0,218,11,95,
+    102,105,108,108,95,99,97,99,104,101,114,27,0,0,0,114,
+    92,1,0,0,114,130,0,0,0,114,91,1,0,0,114,67,
+    0,0,0,114,88,1,0,0,114,80,0,0,0,114,83,1,
+    0,0,114,82,0,0,0,114,110,0,0,0,114,158,0,0,
+    0,114,173,0,0,0,114,207,0,0,0,114,202,0,0,0,
+    41,14,114,142,0,0,0,114,163,0,0,0,114,225,0,0,
+    0,90,12,105,115,95,110,97,109,101,115,112,97,99,101,90,
+    11,116,97,105,108,95,109,111,100,117,108,101,114,193,0,0,
+    0,90,5,99,97,99,104,101,90,12,99,97,99,104,101,95,
+    109,111,100,117,108,101,90,9,98,97,115,101,95,112,97,116,
+    104,114,41,1,0,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,10,0,0,0,114,
+    10,0,0,0,114,11,0,0,0,114,226,0,0,0,234,5,
+    0,0,115,78,0,0,0,0,5,4,1,14,1,2,1,24,
+    1,12,1,10,1,10,1,8,1,6,2,6,1,6,1,10,
+    2,6,1,4,2,8,1,12,1,14,1,8,1,10,1,8,
+    1,26,4,8,2,14,1,2,1,20,1,14,1,10,1,16,
+    1,12,1,8,1,10,1,4,255,10,2,6,1,12,1,12,
+    1,8,1,4,1,122,20,70,105,108,101,70,105,110,100,101,
+    114,46,102,105,110,100,95,115,112,101,99,99,1,0,0,0,
+    0,0,0,0,0,0,0,0,9,0,0,0,10,0,0,0,
+    67,0,0,0,115,188,0,0,0,124,0,106,0,125,1,122,
+    22,116,1,160,2,124,1,112,22,116,1,160,3,161,0,161,
+    1,125,2,87,0,110,28,4,0,116,4,116,5,116,6,102,
+    3,121,56,1,0,1,0,1,0,103,0,125,2,89,0,110,
+    2,48,0,116,7,106,8,160,9,100,1,161,1,115,82,116,
+    10,124,2,131,1,124,0,95,11,110,74,116,10,131,0,125,
+    3,124,2,68,0,93,56,125,4,124,4,160,12,100,2,161,
+    1,92,3,125,5,125,6,125,7,124,6,114,134,100,3,160,
+    13,124,5,124,7,160,14,161,0,161,2,125,8,110,4,124,
+    5,125,8,124,3,160,15,124,8,161,1,1,0,113,92,124,
+    3,124,0,95,11,116,7,106,8,160,9,116,16,161,1,114,
+    184,100,4,100,5,132,0,124,2,68,0,131,1,124,0,95,
+    17,100,6,83,0,41,7,122,68,70,105,108,108,32,116,104,
+    101,32,99,97,99,104,101,32,111,102,32,112,111,116,101,110,
+    116,105,97,108,32,109,111,100,117,108,101,115,32,97,110,100,
+    32,112,97,99,107,97,103,101,115,32,102,111,114,32,116,104,
+    105,115,32,100,105,114,101,99,116,111,114,121,46,114,20,0,
+    0,0,114,96,0,0,0,114,87,0,0,0,99,1,0,0,
+    0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,
+    0,83,0,0,0,115,20,0,0,0,104,0,124,0,93,12,
+    125,1,124,1,160,0,161,0,146,2,113,4,83,0,114,10,
+    0,0,0,41,1,114,130,0,0,0,41,2,114,8,0,0,
+    0,90,2,102,110,114,10,0,0,0,114,10,0,0,0,114,
+    11,0,0,0,114,19,0,0,0,58,6,0,0,114,13,0,
+    0,0,122,41,70,105,108,101,70,105,110,100,101,114,46,95,
+    102,105,108,108,95,99,97,99,104,101,46,60,108,111,99,97,
+    108,115,62,46,60,115,101,116,99,111,109,112,62,78,41,18,
+    114,65,0,0,0,114,24,0,0,0,114,30,1,0,0,114,
+    81,0,0,0,114,26,1,0,0,218,15,80,101,114,109,105,
+    115,115,105,111,110,69,114,114,111,114,218,18,78,111,116,65,
+    68,105,114,101,99,116,111,114,121,69,114,114,111,114,114,21,
+    0,0,0,114,28,0,0,0,114,29,0,0,0,114,90,1,
+    0,0,114,91,1,0,0,114,125,0,0,0,114,88,0,0,
+    0,114,130,0,0,0,218,3,97,100,100,114,30,0,0,0,
+    114,92,1,0,0,41,9,114,142,0,0,0,114,65,0,0,
+    0,114,31,1,0,0,90,21,108,111,119,101,114,95,115,117,
+    102,102,105,120,95,99,111,110,116,101,110,116,115,114,66,1,
+    0,0,114,140,0,0,0,114,54,1,0,0,114,41,1,0,
+    0,90,8,110,101,119,95,110,97,109,101,114,10,0,0,0,
+    114,10,0,0,0,114,11,0,0,0,114,94,1,0,0,29,
+    6,0,0,115,34,0,0,0,0,2,6,1,2,1,22,1,
+    18,3,10,3,12,1,12,7,6,1,8,1,16,1,4,1,
+    18,2,4,1,12,1,6,1,12,1,122,22,70,105,108,101,
+    70,105,110,100,101,114,46,95,102,105,108,108,95,99,97,99,
+    104,101,99,1,0,0,0,0,0,0,0,0,0,0,0,3,
+    0,0,0,3,0,0,0,7,0,0,0,115,18,0,0,0,
+    135,0,135,1,102,2,100,1,100,2,132,8,125,2,124,2,
+    83,0,41,3,97,20,1,0,0,65,32,99,108,97,115,115,
+    32,109,101,116,104,111,100,32,119,104,105,99,104,32,114,101,
+    116,117,114,110,115,32,97,32,99,108,111,115,117,114,101,32,
+    116,111,32,117,115,101,32,111,110,32,115,121,115,46,112,97,
+    116,104,95,104,111,111,107,10,32,32,32,32,32,32,32,32,
+    119,104,105,99,104,32,119,105,108,108,32,114,101,116,117,114,
+    110,32,97,110,32,105,110,115,116,97,110,99,101,32,117,115,
+    105,110,103,32,116,104,101,32,115,112,101,99,105,102,105,101,
+    100,32,108,111,97,100,101,114,115,32,97,110,100,32,116,104,
+    101,32,112,97,116,104,10,32,32,32,32,32,32,32,32,99,
+    97,108,108,101,100,32,111,110,32,116,104,101,32,99,108,111,
+    115,117,114,101,46,10,10,32,32,32,32,32,32,32,32,73,
+    102,32,116,104,101,32,112,97,116,104,32,99,97,108,108,101,
+    100,32,111,110,32,116,104,101,32,99,108,111,115,117,114,101,
+    32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,
+    111,114,121,44,32,73,109,112,111,114,116,69,114,114,111,114,
+    32,105,115,10,32,32,32,32,32,32,32,32,114,97,105,115,
+    101,100,46,10,10,32,32,32,32,32,32,32,32,99,1,0,
+    0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,
+    0,0,19,0,0,0,115,36,0,0,0,116,0,124,0,131,
+    1,115,20,116,1,100,1,124,0,100,2,141,2,130,1,136,
+    0,124,0,103,1,136,1,162,1,82,0,142,0,83,0,41,
+    3,122,45,80,97,116,104,32,104,111,111,107,32,102,111,114,
+    32,105,109,112,111,114,116,108,105,98,46,109,97,99,104,105,
+    110,101,114,121,46,70,105,108,101,70,105,110,100,101,114,46,
+    122,30,111,110,108,121,32,100,105,114,101,99,116,111,114,105,
+    101,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,
+    114,71,0,0,0,41,2,114,82,0,0,0,114,141,0,0,
+    0,114,71,0,0,0,169,2,114,216,0,0,0,114,93,1,
+    0,0,114,10,0,0,0,114,11,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,70,6,0,0,115,6,0,0,0,0,
+    2,8,1,12,1,122,54,70,105,108,101,70,105,110,100,101,
+    114,46,112,97,116,104,95,104,111,111,107,46,60,108,111,99,
+    97,108,115,62,46,112,97,116,104,95,104,111,111,107,95,102,
+    111,114,95,70,105,108,101,70,105,110,100,101,114,114,10,0,
+    0,0,41,3,114,216,0,0,0,114,93,1,0,0,114,99,
+    1,0,0,114,10,0,0,0,114,98,1,0,0,114,11,0,
+    0,0,218,9,112,97,116,104,95,104,111,111,107,60,6,0,
+    0,115,4,0,0,0,0,10,14,6,122,20,70,105,108,101,
+    70,105,110,100,101,114,46,112,97,116,104,95,104,111,111,107,
+    99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+    0,3,0,0,0,67,0,0,0,115,12,0,0,0,100,1,
+    160,0,124,0,106,1,161,1,83,0,41,2,78,122,16,70,
+    105,108,101,70,105,110,100,101,114,40,123,33,114,125,41,41,
+    2,114,88,0,0,0,114,65,0,0,0,114,13,1,0,0,
+    114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,
+    64,1,0,0,78,6,0,0,115,2,0,0,0,0,1,122,
+    19,70,105,108,101,70,105,110,100,101,114,46,95,95,114,101,
+    112,114,95,95,41,1,78,41,15,114,149,0,0,0,114,148,
+    0,0,0,114,150,0,0,0,114,151,0,0,0,114,232,0,
+    0,0,114,71,1,0,0,114,167,0,0,0,114,229,0,0,
+    0,114,161,0,0,0,114,83,1,0,0,114,226,0,0,0,
+    114,94,1,0,0,114,230,0,0,0,114,100,1,0,0,114,
+    64,1,0,0,114,10,0,0,0,114,10,0,0,0,114,10,
+    0,0,0,114,11,0,0,0,114,86,1,0,0,186,5,0,
+    0,115,22,0,0,0,8,2,4,7,8,16,8,4,4,2,
+    8,12,8,5,10,51,8,31,2,1,10,17,114,86,1,0,
+    0,99,4,0,0,0,0,0,0,0,0,0,0,0,6,0,
+    0,0,8,0,0,0,67,0,0,0,115,144,0,0,0,124,
+    0,160,0,100,1,161,1,125,4,124,0,160,0,100,2,161,
+    1,125,5,124,4,115,66,124,5,114,36,124,5,106,1,125,
+    4,110,30,124,2,124,3,107,2,114,56,116,2,124,1,124,
+    2,131,2,125,4,110,10,116,3,124,1,124,2,131,2,125,
+    4,124,5,115,84,116,4,124,1,124,2,124,4,100,3,141,
+    3,125,5,122,36,124,5,124,0,100,2,60,0,124,4,124,
+    0,100,1,60,0,124,2,124,0,100,4,60,0,124,3,124,
+    0,100,5,60,0,87,0,110,18,4,0,116,5,121,138,1,
+    0,1,0,1,0,89,0,110,2,48,0,100,0,83,0,41,
+    6,78,218,10,95,95,108,111,97,100,101,114,95,95,218,8,
+    95,95,115,112,101,99,95,95,114,87,1,0,0,90,8,95,
+    95,102,105,108,101,95,95,90,10,95,95,99,97,99,104,101,
+    100,95,95,41,6,218,3,103,101,116,114,164,0,0,0,114,
+    39,1,0,0,114,32,1,0,0,114,213,0,0,0,218,9,
+    69,120,99,101,112,116,105,111,110,41,6,90,2,110,115,114,
+    140,0,0,0,90,8,112,97,116,104,110,97,109,101,90,9,
+    99,112,97,116,104,110,97,109,101,114,164,0,0,0,114,210,
+    0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,
+    0,0,218,14,95,102,105,120,95,117,112,95,109,111,100,117,
+    108,101,84,6,0,0,115,34,0,0,0,0,2,10,1,10,
+    1,4,1,4,1,8,1,8,1,12,2,10,1,4,1,14,
+    1,2,1,8,1,8,1,8,1,12,1,12,2,114,105,1,
+    0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,3,
+    0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0,
+    116,0,116,1,160,2,161,0,102,2,125,0,116,3,116,4,
+    102,2,125,1,116,5,116,6,102,2,125,2,124,0,124,1,
+    124,2,103,3,83,0,41,1,122,95,82,101,116,117,114,110,
+    115,32,97,32,108,105,115,116,32,111,102,32,102,105,108,101,
+    45,98,97,115,101,100,32,109,111,100,117,108,101,32,108,111,
+    97,100,101,114,115,46,10,10,32,32,32,32,69,97,99,104,
+    32,105,116,101,109,32,105,115,32,97,32,116,117,112,108,101,
+    32,40,108,111,97,100,101,114,44,32,115,117,102,102,105,120,
+    101,115,41,46,10,32,32,32,32,41,7,114,19,1,0,0,
+    114,187,0,0,0,218,18,101,120,116,101,110,115,105,111,110,
+    95,115,117,102,102,105,120,101,115,114,32,1,0,0,114,126,
+    0,0,0,114,39,1,0,0,114,112,0,0,0,41,3,90,
+    10,101,120,116,101,110,115,105,111,110,115,90,6,115,111,117,
+    114,99,101,90,8,98,121,116,101,99,111,100,101,114,10,0,
+    0,0,114,10,0,0,0,114,11,0,0,0,114,208,0,0,
+    0,107,6,0,0,115,8,0,0,0,0,5,12,1,8,1,
+    8,1,114,208,0,0,0,99,1,0,0,0,0,0,0,0,
+    0,0,0,0,10,0,0,0,9,0,0,0,67,0,0,0,
+    115,132,1,0,0,124,0,97,0,116,0,106,1,97,1,116,
+    0,106,2,97,2,116,1,106,3,116,4,25,0,125,1,100,
+    1,100,2,103,1,102,2,100,3,100,4,100,2,103,2,102,
+    2,102,2,125,2,124,2,68,0,93,108,92,2,125,3,125,
+    4,116,5,100,5,100,6,132,0,124,4,68,0,131,1,131,
+    1,115,82,74,0,130,1,124,4,100,7,25,0,125,5,124,
+    3,116,1,106,3,118,0,114,116,116,1,106,3,124,3,25,
+    0,125,6,1,0,113,170,113,52,122,20,116,0,160,6,124,
+    3,161,1,125,6,87,0,1,0,113,170,87,0,113,52,4,
+    0,116,7,121,158,1,0,1,0,1,0,89,0,113,52,89,
+    0,113,52,48,0,113,52,116,7,100,8,131,1,130,1,116,
+    8,124,1,100,9,124,6,131,3,1,0,116,8,124,1,100,
+    10,124,5,131,3,1,0,116,8,124,1,100,11,100,12,160,
+    9,124,4,161,1,131,3,1,0,116,8,124,1,100,13,100,
+    14,100,15,132,0,124,4,68,0,131,1,131,3,1,0,103,
+    0,100,16,162,1,125,7,124,3,100,3,107,2,144,1,114,
+    6,124,7,160,10,100,17,161,1,1,0,124,7,68,0,93,
+    52,125,8,124,8,116,1,106,3,118,1,144,1,114,38,116,
+    0,160,6,124,8,161,1,125,9,110,10,116,1,106,3,124,
+    8,25,0,125,9,116,8,124,1,124,8,124,9,131,3,1,
+    0,144,1,113,10,116,8,124,1,100,18,116,11,131,0,131,
+    3,1,0,116,12,160,13,116,2,160,14,161,0,161,1,1,
+    0,124,3,100,3,107,2,144,1,114,128,116,15,160,10,100,
+    19,161,1,1,0,100,20,116,12,118,0,144,1,114,128,100,
+    21,116,16,95,17,100,22,83,0,41,23,122,205,83,101,116,
+    117,112,32,116,104,101,32,112,97,116,104,45,98,97,115,101,
+    100,32,105,109,112,111,114,116,101,114,115,32,102,111,114,32,
+    105,109,112,111,114,116,108,105,98,32,98,121,32,105,109,112,
+    111,114,116,105,110,103,32,110,101,101,100,101,100,10,32,32,
+    32,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,
+    101,115,32,97,110,100,32,105,110,106,101,99,116,105,110,103,
+    32,116,104,101,109,32,105,110,116,111,32,116,104,101,32,103,
+    108,111,98,97,108,32,110,97,109,101,115,112,97,99,101,46,
+    10,10,32,32,32,32,79,116,104,101,114,32,99,111,109,112,
+    111,110,101,110,116,115,32,97,114,101,32,101,120,116,114,97,
+    99,116,101,100,32,102,114,111,109,32,116,104,101,32,99,111,
+    114,101,32,98,111,111,116,115,116,114,97,112,32,109,111,100,
+    117,108,101,46,10,10,32,32,32,32,218,5,112,111,115,105,
+    120,114,2,0,0,0,218,2,110,116,114,1,0,0,0,99,
     1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,
-    4,0,0,0,83,0,0,0,115,22,0,0,0,104,0,124,
-    0,93,14,125,1,100,0,124,1,155,0,157,2,146,2,113,
-    4,83,0,114,15,0,0,0,114,10,0,0,0,114,17,0,
-    0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,
-    0,114,19,0,0,0,144,6,0,0,114,13,0,0,0,122,
-    25,95,115,101,116,117,112,46,60,108,111,99,97,108,115,62,
-    46,60,115,101,116,99,111,109,112,62,41,3,114,90,0,0,
-    0,114,98,0,0,0,114,184,0,0,0,114,215,0,0,0,
-    114,27,0,0,0,122,4,46,112,121,119,122,6,95,100,46,
-    112,121,100,84,78,41,18,114,158,0,0,0,114,21,0,0,
-    0,114,187,0,0,0,114,54,1,0,0,114,149,0,0,0,
-    218,3,97,108,108,90,18,95,98,117,105,108,116,105,110,95,
-    102,114,111,109,95,110,97,109,101,114,141,0,0,0,114,153,
-    0,0,0,114,62,0,0,0,114,61,0,0,0,114,32,0,
-    0,0,114,44,1,0,0,114,191,0,0,0,114,104,1,0,
-    0,114,126,0,0,0,114,214,0,0,0,114,218,0,0,0,
-    41,10,218,17,95,98,111,111,116,115,116,114,97,112,95,109,
-    111,100,117,108,101,90,11,115,101,108,102,95,109,111,100,117,
-    108,101,90,10,111,115,95,100,101,116,97,105,108,115,90,10,
-    98,117,105,108,116,105,110,95,111,115,114,50,0,0,0,114,
-    59,0,0,0,90,9,111,115,95,109,111,100,117,108,101,90,
-    13,98,117,105,108,116,105,110,95,110,97,109,101,115,90,12,
-    98,117,105,108,116,105,110,95,110,97,109,101,90,14,98,117,
-    105,108,116,105,110,95,109,111,100,117,108,101,114,10,0,0,
-    0,114,10,0,0,0,114,11,0,0,0,218,6,95,115,101,
-    116,117,112,109,6,0,0,115,70,0,0,0,0,8,4,1,
-    6,1,6,2,10,3,22,1,12,2,22,1,8,1,10,1,
-    10,1,6,2,2,1,10,1,10,1,12,1,12,2,8,2,
-    12,1,12,1,18,1,22,3,8,1,10,1,10,1,8,1,
-    12,1,12,2,10,1,16,3,14,1,14,1,10,1,10,1,
-    10,1,114,110,1,0,0,99,1,0,0,0,0,0,0,0,
-    0,0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,
-    115,50,0,0,0,116,0,124,0,131,1,1,0,116,1,131,
-    0,125,1,116,2,106,3,160,4,116,5,106,6,124,1,142,
-    0,103,1,161,1,1,0,116,2,106,7,160,8,116,9,161,
-    1,1,0,100,1,83,0,41,2,122,41,73,110,115,116,97,
-    108,108,32,116,104,101,32,112,97,116,104,45,98,97,115,101,
-    100,32,105,109,112,111,114,116,32,99,111,109,112,111,110,101,
-    110,116,115,46,78,41,10,114,110,1,0,0,114,208,0,0,
-    0,114,21,0,0,0,114,74,1,0,0,114,191,0,0,0,
-    114,84,1,0,0,114,98,1,0,0,218,9,109,101,116,97,
-    95,112,97,116,104,114,61,0,0,0,114,68,1,0,0,41,
-    2,114,109,1,0,0,90,17,115,117,112,112,111,114,116,101,
-    100,95,108,111,97,100,101,114,115,114,10,0,0,0,114,10,
-    0,0,0,114,11,0,0,0,218,8,95,105,110,115,116,97,
-    108,108,166,6,0,0,115,8,0,0,0,0,2,8,1,6,
-    1,20,1,114,112,1,0,0,41,1,114,86,0,0,0,41,
-    1,78,41,3,78,78,78,41,2,114,0,0,0,0,114,0,
-    0,0,0,41,1,84,41,1,78,41,1,78,41,81,114,151,
-    0,0,0,114,187,0,0,0,114,90,0,0,0,114,21,0,
-    0,0,114,98,0,0,0,114,184,0,0,0,114,28,0,0,
-    0,90,11,95,77,83,95,87,73,78,68,79,87,83,114,106,
-    1,0,0,114,24,0,0,0,114,215,0,0,0,114,105,1,
-    0,0,114,50,0,0,0,114,108,1,0,0,114,59,0,0,
-    0,114,135,0,0,0,114,57,0,0,0,114,62,0,0,0,
-    114,107,1,0,0,114,31,0,0,0,90,37,95,67,65,83,
-    69,95,73,78,83,69,78,83,73,84,73,86,69,95,80,76,
-    65,84,70,79,82,77,83,95,66,89,84,69,83,95,75,69,
-    89,114,30,0,0,0,114,32,0,0,0,114,39,0,0,0,
-    114,44,0,0,0,114,46,0,0,0,114,67,0,0,0,114,
-    74,0,0,0,114,75,0,0,0,114,79,0,0,0,114,80,
-    0,0,0,114,82,0,0,0,114,85,0,0,0,114,94,0,
-    0,0,218,4,116,121,112,101,218,8,95,95,99,111,100,101,
-    95,95,114,186,0,0,0,114,37,0,0,0,114,172,0,0,
-    0,114,36,0,0,0,114,41,0,0,0,114,3,1,0,0,
-    114,115,0,0,0,114,111,0,0,0,114,126,0,0,0,114,
-    112,0,0,0,90,23,68,69,66,85,71,95,66,89,84,69,
-    67,79,68,69,95,83,85,70,70,73,88,69,83,90,27,79,
-    80,84,73,77,73,90,69,68,95,66,89,84,69,67,79,68,
-    69,95,83,85,70,70,73,88,69,83,114,120,0,0,0,114,
-    127,0,0,0,114,134,0,0,0,114,136,0,0,0,114,138,
-    0,0,0,114,160,0,0,0,114,167,0,0,0,114,176,0,
-    0,0,114,180,0,0,0,114,182,0,0,0,114,189,0,0,
-    0,114,194,0,0,0,114,195,0,0,0,114,200,0,0,0,
-    218,6,111,98,106,101,99,116,114,209,0,0,0,114,213,0,
-    0,0,114,214,0,0,0,114,231,0,0,0,114,244,0,0,
-    0,114,6,1,0,0,114,32,1,0,0,114,39,1,0,0,
-    114,44,1,0,0,114,19,1,0,0,114,45,1,0,0,114,
-    66,1,0,0,114,68,1,0,0,114,84,1,0,0,114,103,
-    1,0,0,114,208,0,0,0,114,110,1,0,0,114,112,1,
-    0,0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,
-    0,114,11,0,0,0,218,8,60,109,111,100,117,108,101,62,
-    1,0,0,0,115,170,0,0,0,4,22,8,1,8,1,8,
-    1,8,1,8,3,10,1,4,1,8,1,10,2,8,3,4,
-    1,10,2,6,2,22,1,8,1,8,1,10,1,14,4,4,
-    1,4,1,2,1,2,255,4,4,8,17,8,5,8,5,8,
-    6,4,1,10,30,8,6,8,8,8,10,8,9,8,5,8,
-    7,6,1,10,8,8,5,10,22,10,127,0,20,16,1,12,
-    2,4,1,4,2,6,2,6,2,8,2,16,71,8,40,8,
-    19,8,12,8,12,8,28,8,17,8,33,8,28,8,24,10,
-    13,10,10,10,11,8,14,6,3,4,1,2,255,12,68,14,
-    64,14,29,16,127,0,17,14,72,18,45,18,26,4,3,18,
-    58,14,63,14,42,14,127,0,20,14,127,0,27,10,23,8,
-    11,8,57,
+    3,0,0,0,115,0,0,0,115,26,0,0,0,124,0,93,
+    18,125,1,116,0,124,1,131,1,100,0,107,2,86,0,1,
+    0,113,2,100,1,83,0,114,3,0,0,0,114,5,0,0,
+    0,114,7,0,0,0,114,10,0,0,0,114,10,0,0,0,
+    114,11,0,0,0,114,12,0,0,0,136,6,0,0,114,13,
+    0,0,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,0,
+    0,0,0,122,30,105,109,112,111,114,116,108,105,98,32,114,
+    101,113,117,105,114,101,115,32,112,111,115,105,120,32,111,114,
+    32,110,116,114,24,0,0,0,114,59,0,0,0,114,50,0,
+    0,0,114,14,0,0,0,218,20,95,112,97,116,104,115,101,
+    112,115,95,119,105,116,104,95,99,111,108,111,110,99,1,0,
+    0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,
+    0,0,83,0,0,0,115,22,0,0,0,104,0,124,0,93,
+    14,125,1,100,0,124,1,155,0,157,2,146,2,113,4,83,
+    0,114,15,0,0,0,114,10,0,0,0,114,17,0,0,0,
+    114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,
+    19,0,0,0,153,6,0,0,114,13,0,0,0,122,25,95,
+    115,101,116,117,112,46,60,108,111,99,97,108,115,62,46,60,
+    115,101,116,99,111,109,112,62,41,3,114,90,0,0,0,114,
+    98,0,0,0,114,184,0,0,0,114,215,0,0,0,114,27,
+    0,0,0,122,4,46,112,121,119,122,6,95,100,46,112,121,
+    100,84,78,41,18,114,158,0,0,0,114,21,0,0,0,114,
+    187,0,0,0,114,56,1,0,0,114,149,0,0,0,218,3,
+    97,108,108,90,18,95,98,117,105,108,116,105,110,95,102,114,
+    111,109,95,110,97,109,101,114,141,0,0,0,114,153,0,0,
+    0,114,62,0,0,0,114,61,0,0,0,114,32,0,0,0,
+    114,44,1,0,0,114,191,0,0,0,114,106,1,0,0,114,
+    126,0,0,0,114,214,0,0,0,114,218,0,0,0,41,10,
+    218,17,95,98,111,111,116,115,116,114,97,112,95,109,111,100,
+    117,108,101,90,11,115,101,108,102,95,109,111,100,117,108,101,
+    90,10,111,115,95,100,101,116,97,105,108,115,90,10,98,117,
+    105,108,116,105,110,95,111,115,114,50,0,0,0,114,59,0,
+    0,0,90,9,111,115,95,109,111,100,117,108,101,90,13,98,
+    117,105,108,116,105,110,95,110,97,109,101,115,90,12,98,117,
+    105,108,116,105,110,95,110,97,109,101,90,14,98,117,105,108,
+    116,105,110,95,109,111,100,117,108,101,114,10,0,0,0,114,
+    10,0,0,0,114,11,0,0,0,218,6,95,115,101,116,117,
+    112,118,6,0,0,115,70,0,0,0,0,8,4,1,6,1,
+    6,2,10,3,22,1,12,2,22,1,8,1,10,1,10,1,
+    6,2,2,1,10,1,10,1,12,1,12,2,8,2,12,1,
+    12,1,18,1,22,3,8,1,10,1,10,1,8,1,12,1,
+    12,2,10,1,16,3,14,1,14,1,10,1,10,1,10,1,
+    114,112,1,0,0,99,1,0,0,0,0,0,0,0,0,0,
+    0,0,2,0,0,0,4,0,0,0,67,0,0,0,115,50,
+    0,0,0,116,0,124,0,131,1,1,0,116,1,131,0,125,
+    1,116,2,106,3,160,4,116,5,106,6,124,1,142,0,103,
+    1,161,1,1,0,116,2,106,7,160,8,116,9,161,1,1,
+    0,100,1,83,0,41,2,122,41,73,110,115,116,97,108,108,
+    32,116,104,101,32,112,97,116,104,45,98,97,115,101,100,32,
+    105,109,112,111,114,116,32,99,111,109,112,111,110,101,110,116,
+    115,46,78,41,10,114,112,1,0,0,114,208,0,0,0,114,
+    21,0,0,0,114,76,1,0,0,114,191,0,0,0,114,86,
+    1,0,0,114,100,1,0,0,218,9,109,101,116,97,95,112,
+    97,116,104,114,61,0,0,0,114,70,1,0,0,41,2,114,
+    111,1,0,0,90,17,115,117,112,112,111,114,116,101,100,95,
+    108,111,97,100,101,114,115,114,10,0,0,0,114,10,0,0,
+    0,114,11,0,0,0,218,8,95,105,110,115,116,97,108,108,
+    175,6,0,0,115,8,0,0,0,0,2,8,1,6,1,20,
+    1,114,114,1,0,0,41,1,114,86,0,0,0,41,1,78,
+    41,3,78,78,78,41,2,114,0,0,0,0,114,0,0,0,
+    0,41,1,84,41,1,78,41,1,78,41,81,114,151,0,0,
+    0,114,187,0,0,0,114,90,0,0,0,114,21,0,0,0,
+    114,98,0,0,0,114,184,0,0,0,114,28,0,0,0,90,
+    11,95,77,83,95,87,73,78,68,79,87,83,114,108,1,0,
+    0,114,24,0,0,0,114,215,0,0,0,114,107,1,0,0,
+    114,50,0,0,0,114,110,1,0,0,114,59,0,0,0,114,
+    135,0,0,0,114,57,0,0,0,114,62,0,0,0,114,109,
+    1,0,0,114,31,0,0,0,90,37,95,67,65,83,69,95,
+    73,78,83,69,78,83,73,84,73,86,69,95,80,76,65,84,
+    70,79,82,77,83,95,66,89,84,69,83,95,75,69,89,114,
+    30,0,0,0,114,32,0,0,0,114,39,0,0,0,114,44,
+    0,0,0,114,46,0,0,0,114,67,0,0,0,114,74,0,
+    0,0,114,75,0,0,0,114,79,0,0,0,114,80,0,0,
+    0,114,82,0,0,0,114,85,0,0,0,114,94,0,0,0,
+    218,4,116,121,112,101,218,8,95,95,99,111,100,101,95,95,
+    114,186,0,0,0,114,37,0,0,0,114,172,0,0,0,114,
+    36,0,0,0,114,41,0,0,0,114,3,1,0,0,114,115,
+    0,0,0,114,111,0,0,0,114,126,0,0,0,114,112,0,
+    0,0,90,23,68,69,66,85,71,95,66,89,84,69,67,79,
+    68,69,95,83,85,70,70,73,88,69,83,90,27,79,80,84,
+    73,77,73,90,69,68,95,66,89,84,69,67,79,68,69,95,
+    83,85,70,70,73,88,69,83,114,120,0,0,0,114,127,0,
+    0,0,114,134,0,0,0,114,136,0,0,0,114,138,0,0,
+    0,114,160,0,0,0,114,167,0,0,0,114,176,0,0,0,
+    114,180,0,0,0,114,182,0,0,0,114,189,0,0,0,114,
+    194,0,0,0,114,195,0,0,0,114,200,0,0,0,218,6,
+    111,98,106,101,99,116,114,209,0,0,0,114,213,0,0,0,
+    114,214,0,0,0,114,231,0,0,0,114,244,0,0,0,114,
+    6,1,0,0,114,32,1,0,0,114,39,1,0,0,114,44,
+    1,0,0,114,19,1,0,0,114,45,1,0,0,114,68,1,
+    0,0,114,70,1,0,0,114,86,1,0,0,114,105,1,0,
+    0,114,208,0,0,0,114,112,1,0,0,114,114,1,0,0,
+    114,10,0,0,0,114,10,0,0,0,114,10,0,0,0,114,
+    11,0,0,0,218,8,60,109,111,100,117,108,101,62,1,0,
+    0,0,115,170,0,0,0,4,22,8,1,8,1,8,1,8,
+    1,8,3,10,1,4,1,8,1,10,2,8,3,4,1,10,
+    2,6,2,22,1,8,1,8,1,10,1,14,4,4,1,4,
+    1,2,1,2,255,4,4,8,17,8,5,8,5,8,6,4,
+    1,10,30,8,6,8,8,8,10,8,9,8,5,8,7,6,
+    1,10,8,8,5,10,22,10,127,0,20,16,1,12,2,4,
+    1,4,2,6,2,6,2,8,2,16,71,8,40,8,19,8,
+    12,8,12,8,28,8,17,8,33,8,28,8,24,10,13,10,
+    10,10,11,8,14,6,3,4,1,2,255,12,68,14,64,14,
+    29,16,127,0,17,14,72,18,45,18,26,4,3,18,58,14,
+    69,14,42,14,127,0,23,14,127,0,27,10,23,8,11,8,
+    57,
 };
index 2d921be5e03d4d1df91279511494b7bdd40b0ef7..8856328f9d0bf9d31940062a55559a380a5a21f5 100644 (file)
@@ -1,4 +1,4 @@
-This is Python version 3.9.10
+This is Python version 3.9.11
 =============================
 
 .. image:: https://travis-ci.org/python/cpython.svg?branch=3.9
index c85ee4564d83872a6358bb7c94a608b46f02929d..0a4382f3e0223e375f9111e70042314a74aa13c8 100644 (file)
@@ -363,6 +363,8 @@ of Python's files.
 Within this install directory is the following approximate layout:
 
 .\python[w].exe The core executable files
+.\python3x.dll  The core interpreter
+.\python3.dll   The stable ABI reference
 .\DLLs          Stdlib extensions (*.pyd) and dependencies
 .\Doc           Documentation (*.chm)
 .\include       Development headers (*.h)
@@ -373,14 +375,6 @@ Within this install directory is the following approximate layout:
 .\tcl           Tcl dependencies (*.dll, *.tcl and others)
 .\Tools         Tool scripts (*.py)
 
-When installed for all users, the following files are installed to
-either "%SystemRoot%\System32" or "%SystemRoot%\SysWOW64" as
-appropriate. For the current user, they are installed in the Python
-install directory.
-
-.\python3x.dll      The core interpreter
-.\python3.dll       The stable ABI reference
-
 When installed for all users, the following files are installed to
 "%SystemRoot%" (typically "C:\Windows") to ensure they are always
 available on PATH. (See Launching Python below.) For the current user,
@@ -388,6 +382,7 @@ they are installed in "%LocalAppData%\Programs\Python\PyLauncher".
 
 .\py[w].exe         PEP 397 launcher
 
+
 System Settings
 ===============
 
index afff903564e081cc22fc6bb03712a1c848677182..a153bd8f01b4c3719f174cb3a33cae0d5620072f 100644 (file)
@@ -27,25 +27,26 @@ call "%PCBUILD%find_msbuild.bat" %MSBUILD%
 if ERRORLEVEL 1 (echo Cannot locate MSBuild.exe on PATH or as MSBUILD variable & exit /b 2)\r
 \r
 if defined BUILDX86 (\r
-    call "%PCBUILD%build.bat" -d -e %REBUILD% %BUILDTEST%\r
-    if errorlevel 1 goto :eof\r
-    call "%PCBUILD%build.bat" -e %REBUILD% %BUILDTEST%\r
-    if errorlevel 1 goto :eof\r
+    call "%PCBUILD%build.bat" -p Win32 -d -e %REBUILD% %BUILDTEST%\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
+    call "%PCBUILD%build.bat" -p Win32 -e %REBUILD% %BUILDTEST%\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
 )\r
 if defined BUILDX64 (\r
     call "%PCBUILD%build.bat" -p x64 -d -e %REBUILD% %BUILDTEST%\r
-    if errorlevel 1 goto :eof\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
     call "%PCBUILD%build.bat" -p x64 -e %REBUILD% %BUILDTEST%\r
-    if errorlevel 1 goto :eof\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
 )\r
 \r
 if defined BUILDDOC (\r
     call "%PCBUILD%..\Doc\make.bat" htmlhelp\r
-    if errorlevel 1 goto :eof\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
 )\r
 \r
 rem Build the launcher MSI separately\r
 %MSBUILD% "%D%launcher\launcher.wixproj" /p:Platform=x86\r
+if errorlevel 1 exit /B %ERRORLEVEL%\r
 \r
 set BUILD_CMD="%D%bundle\snapshot.wixproj"\r
 if defined BUILDTEST (\r
@@ -59,12 +60,12 @@ if defined REBUILD (
 )\r
 \r
 if defined BUILDX86 (\r
-    %MSBUILD% %BUILD_CMD%\r
-    if errorlevel 1 goto :eof\r
+    %MSBUILD% /p:Platform=x86 %BUILD_CMD%\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
 )\r
 if defined BUILDX64 (\r
     %MSBUILD% /p:Platform=x64 %BUILD_CMD%\r
-    if errorlevel 1 goto :eof\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
 )\r
 \r
 exit /B 0\r
index 1c8670ebc15d34f36d13afc18286e4a4617ad521..d7ae31b40037091f6b7b5259c7d4598d0f3d4b58 100644 (file)
@@ -80,7 +80,7 @@ if "%SKIPBUILD%" EQU "1" goto skipdoc
 if "%SKIPDOC%" EQU "1" goto skipdoc\r
 \r
 call "%D%..\..\doc\make.bat" htmlhelp\r
-if errorlevel 1 goto :eof\r
+if errorlevel 1 exit /B %ERRORLEVEL%\r
 :skipdoc\r
 \r
 where dlltool /q && goto skipdlltoolsearch\r
@@ -93,16 +93,17 @@ set _DLLTOOL_PATH=
 \r
 if defined BUILDX86 (\r
     call :build x86\r
-    if errorlevel 1 exit /B\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
 )\r
 \r
 if defined BUILDX64 (\r
     call :build x64 "%PGO%"\r
-    if errorlevel 1 exit /B\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
 )\r
 \r
 if defined TESTTARGETDIR (\r
     call "%D%testrelease.bat" -t "%TESTTARGETDIR%"\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
 )\r
 \r
 exit /B 0\r
@@ -128,19 +129,19 @@ if "%1" EQU "x86" (
 if exist "%BUILD%en-us" (\r
     echo Deleting %BUILD%en-us\r
     rmdir /q/s "%BUILD%en-us"\r
-    if errorlevel 1 exit /B\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
 )\r
 \r
 if exist "%D%obj\Debug_%OBJDIR_PLAT%" (\r
     echo Deleting "%D%obj\Debug_%OBJDIR_PLAT%"\r
     rmdir /q/s "%D%obj\Debug_%OBJDIR_PLAT%"\r
-    if errorlevel 1 exit /B\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
 )\r
 \r
 if exist "%D%obj\Release_%OBJDIR_PLAT%" (\r
     echo Deleting "%D%obj\Release_%OBJDIR_PLAT%"\r
     rmdir /q/s "%D%obj\Release_%OBJDIR_PLAT%"\r
-    if errorlevel 1 exit /B\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
 )\r
 \r
 if not "%CERTNAME%" EQU "" (\r
@@ -156,41 +157,41 @@ if not "%PGO%" EQU "" (
 if not "%SKIPBUILD%" EQU "1" (\r
     @echo call "%PCBUILD%build.bat" -e -p %BUILD_PLAT% -t %TARGET% %PGOOPTS% %CERTOPTS%\r
     @call "%PCBUILD%build.bat" -e -p %BUILD_PLAT% -t %TARGET% %PGOOPTS% %CERTOPTS%\r
-    @if errorlevel 1 exit /B\r
+    @if errorlevel 1 exit /B %ERRORLEVEL%\r
     @rem build.bat turns echo back on, so we disable it again\r
     @echo off\r
 \r
     @echo call "%PCBUILD%build.bat" -d -e -p %BUILD_PLAT% -t %TARGET%\r
     @call "%PCBUILD%build.bat" -d -e -p %BUILD_PLAT% -t %TARGET%\r
-    @if errorlevel 1 exit /B\r
+    @if errorlevel 1 exit /B %ERRORLEVEL%\r
     @rem build.bat turns echo back on, so we disable it again\r
     @echo off\r
 )\r
 \r
 if "%OUTDIR_PLAT%" EQU "win32" (\r
     %MSBUILD% "%D%launcher\launcher.wixproj" /p:Platform=x86 %CERTOPTS% /p:ReleaseUri=%RELEASE_URI%\r
-    if errorlevel 1 exit /B\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
 ) else if not exist "%Py_OutDir%win32\en-us\launcher.msi" (\r
     %MSBUILD% "%D%launcher\launcher.wixproj" /p:Platform=x86 %CERTOPTS% /p:ReleaseUri=%RELEASE_URI%\r
-    if errorlevel 1 exit /B\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
 )\r
 \r
 set BUILDOPTS=/p:Platform=%1 /p:BuildForRelease=true /p:DownloadUrl=%DOWNLOAD_URL% /p:DownloadUrlBase=%DOWNLOAD_URL_BASE% /p:ReleaseUri=%RELEASE_URI%\r
 if defined BUILDMSI (\r
     %MSBUILD% "%D%bundle\releaselocal.wixproj" /t:Rebuild %BUILDOPTS% %CERTOPTS% /p:RebuildAll=true\r
-    if errorlevel 1 exit /B\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
     %MSBUILD% "%D%bundle\releaseweb.wixproj" /t:Rebuild %BUILDOPTS% %CERTOPTS% /p:RebuildAll=false\r
-    if errorlevel 1 exit /B\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
 )\r
 \r
 if defined BUILDZIP (\r
     %MSBUILD% "%D%make_zip.proj" /t:Build %BUILDOPTS% %CERTOPTS% /p:OutputPath="%BUILD%en-us"\r
-    if errorlevel 1 exit /B\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
 )\r
 \r
 if defined BUILDNUGET (\r
     %MSBUILD% "%D%..\nuget\make_pkg.proj" /t:Build /p:Configuration=Release /p:Platform=%1 /p:OutputPath="%BUILD%en-us"\r
-    if errorlevel 1 exit /B\r
+    if errorlevel 1 exit /B %ERRORLEVEL%\r
 )\r
 \r
 if not "%OUTDIR%" EQU "" (\r
index a23ce5e145848836c6ee21cc0cb4603263630455..52f15dd46c18fe5af1dbb57b91bf4782d763732d 100644 (file)
Binary files a/Tools/msi/bundle/SideBar.png and b/Tools/msi/bundle/SideBar.png differ
index e2f871889340fb6bbb8f96efb2ec16a8a892846d..0c28db6f90b7259807b0c6a41e7370d3e0eba185 100644 (file)
@@ -95,8 +95,8 @@
     <Chain ParallelCache="yes">
       <PackageGroupRef Id="crt" />
       <PackageGroupRef Id="core" />
-      <PackageGroupRef Id="dev" />
       <PackageGroupRef Id="exe" />
+      <PackageGroupRef Id="dev" />
       <PackageGroupRef Id="lib" />
       <PackageGroupRef Id="test" />
       <PackageGroupRef Id="doc" />
index 398d94a24d554f8327ab0f5805f5b2877423c297..4554e80014a2900f0f229ef8d0062833c330cd74 100644 (file)
     </Fragment>
     
     <Fragment>
-    <?ifdef InstallDirectoryGuidSeed ?>
         <Directory Id="TARGETDIR" Name="SourceDir">
+        <?ifdef InstallDirectoryGuidSeed ?>
             <Directory Id="InstallDirectory" ComponentGuidGenerationSeed="$(var.InstallDirectoryGuidSeed)" />
+        <?endif ?>
         </Directory>
-    <?endif ?>
+    </Fragment>
+
+    <Fragment>
+        <?ifdef PythonExeComponentGuid ?>
+        <!-- Locate TARGETDIR automatically assuming we have executables installed -->
+        <Property Id="TARGETDIR">
+            <ComponentSearch Id="PythonExe_Directory" Guid="$(var.PythonExeComponentGuid)">
+                <DirectorySearch Id="PythonExe_Directory" AssignToProperty="yes" Path=".">
+                    <FileSearch Id="PythonExe_DirectoryFile" Name="python.exe" />
+                </DirectorySearch>
+            </ComponentSearch>
+        </Property>
+        <?endif ?>
+        <Property Id="DetectTargetDir" Value="1" />
     </Fragment>
     
     <!-- Top-level directories -->
index 23a710df87d55ce24b9ae918e132b70a4ada8b37..2ddeb31afc770fe82723b334f334224c74e897c3 100644 (file)
@@ -4,6 +4,7 @@
         <Package InstallerVersion="300" Compressed="yes" InstallScope="perUser" Platform="$(var.Platform)" />
         <MediaTemplate EmbedCab="yes" CompressionLevel="high" />
         
+        <PropertyRef Id="DetectTargetDir" />
         <PropertyRef Id="UpgradeTable" />
         
         <Feature Id="DefaultFeature" AllowAdvertise="no" Title="!(loc.Title)" Description="!(loc.Description)">
index cd1a68cc2601ae5b3e1e78f1c9bc63ac92624453..cc5bdb493e5fefefdc8ed84ee5569bcfd2ac8110 100644 (file)
@@ -4,6 +4,7 @@
         <Package InstallerVersion="300" Compressed="yes" InstallScope="perUser" Platform="$(var.Platform)" />
         <MediaTemplate EmbedCab="yes" CompressionLevel="high" />
         
+        <PropertyRef Id="DetectTargetDir" />
         <PropertyRef Id="UpgradeTable" />
         <PropertyRef Id="REGISTRYKEY" />
         
index 2a3b9ecfeef8d01147092f8afb02455e008e3667..b38cd9114be740bff83ea718b3f8aff035a058bd 100644 (file)
@@ -4,6 +4,7 @@
         <Package InstallerVersion="300" Compressed="yes" InstallScope="perUser" Platform="$(var.Platform)" />
         <MediaTemplate EmbedCab="yes" CompressionLevel="high" />
         
+        <PropertyRef Id="DetectTargetDir" />
         <PropertyRef Id="UpgradeTable" />
         <PropertyRef Id="REGISTRYKEY" />
         
index 8b37936cc938f2602f47acc72595c50b89dc88a0..017b812270c5b2e9ba4ec785f0f7812edd0d3059 100644 (file)
@@ -2,7 +2,8 @@
 <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
     <Product Id="*" Language="!(loc.LCID)" Name="!(loc.Title)" Version="$(var.Version)" Manufacturer="!(loc.Manufacturer)" UpgradeCode="$(var.UpgradeCode)">
         <Package InstallerVersion="300" Compressed="yes" InstallScope="perUser" Platform="$(var.Platform)" />
-        
+
+        <PropertyRef Id="DetectTargetDir" />
         <PropertyRef Id="UpgradeTable" />
         <PropertyRef Id="REGISTRYKEY" />
         
index eeae8e8b0dfa5fd9927e4dbf7b222e5e18161331..bbf6ac70fadf691c2cfa0abf1e8968b95a4b5105 100644 (file)
@@ -4,6 +4,7 @@
         <Package InstallerVersion="300" Compressed="yes" InstallScope="perUser" Platform="$(var.Platform)" />
         <MediaTemplate EmbedCab="yes" CompressionLevel="high" />
         
+        <PropertyRef Id="DetectTargetDir" />
         <PropertyRef Id="UpgradeTable" />
         <PropertyRef Id="REGISTRYKEY" />
         
index f2ed64f07bf281dc4bc36b2f645100a915e1e078..e8f514a222366b6ceef9ac0c78f023db21192e3b 100644 (file)
@@ -4,6 +4,7 @@
         <Package InstallerVersion="300" Compressed="yes" InstallScope="perUser" Platform="$(var.Platform)" />
         <MediaTemplate EmbedCab="yes" CompressionLevel="high" />
         
+        <PropertyRef Id="DetectTargetDir" />
         <PropertyRef Id="UpgradeTable" />
         <PropertyRef Id="REGISTRYKEY" />
         
index 7a805d0612e080523e1d11e0b519ea1f4d270b30..133a743efccae67130821b92ab9a7d0215ad317e 100644 (file)
@@ -4,6 +4,7 @@
         <Package InstallerVersion="300" Compressed="yes" InstallScope="perUser" Platform="$(var.Platform)" />
         <MediaTemplate EmbedCab="yes" CompressionLevel="high" />
         
+        <PropertyRef Id="DetectTargetDir" />
         <PropertyRef Id="UpgradeTable" />
         
         <Feature Id="DefaultFeature" AllowAdvertise="no" Title="!(loc.Title)" Description="!(loc.Description)">
index 76e56820c53b23ef3f070eb18b34cdf49cd03b44..94fd3f0e97488068de5e32ee414b46b7cb210f2c 100644 (file)
@@ -4,6 +4,7 @@
         <Package InstallerVersion="300" Compressed="yes" InstallScope="perUser" Platform="$(var.Platform)" />
         <MediaTemplate EmbedCab="yes" CompressionLevel="high" />
         
+        <PropertyRef Id="DetectTargetDir" />
         <PropertyRef Id="UpgradeTable" />
         <PropertyRef Id="REGISTRYKEY" />
         
index 931ffc787523b541287171bba667c424ca4fd340..109fb9ecc7adcd3052afbb9a9ac82ea62754c1cc 100644 (file)
@@ -1,6 +1,7 @@
 import pathlib
 import shutil
 import tokenize
+import sys
 import sysconfig
 import tempfile
 import itertools
@@ -33,6 +34,7 @@ def compile_c_extension(
     build_dir: Optional[str] = None,
     verbose: bool = False,
     keep_asserts: bool = True,
+    disable_optimization: bool = True,  # Significant test_peg_generator speedup.
 ) -> str:
     """Compile the generated source for a parser generator into an extension module.
 
@@ -59,6 +61,14 @@ def compile_c_extension(
     extra_link_args = get_extra_flags("LDFLAGS", "PY_LDFLAGS_NODIST")
     if keep_asserts:
         extra_compile_args.append("-UNDEBUG")
+    if disable_optimization:
+        if sys.platform == 'win32':
+            extra_compile_args.append("/Od")
+            extra_link_args.append("/LTCG:OFF")
+        else:
+            extra_compile_args.append("-O0")
+            if sysconfig.get_config_var("GNULD") == "yes":
+                extra_link_args.append("-fno-lto")
     extension = [
         Extension(
             extension_name,
index 437efb22914b84534209ad45ed923f2bf188d1d7..14c4918acc2735d8a254a78cc13d6b6787bfe21e 100755 (executable)
@@ -49,8 +49,8 @@ OPENSSL_OLD_VERSIONS = [
 ]
 
 OPENSSL_RECENT_VERSIONS = [
-    "1.1.1m",
-    "3.0.1"
+    "1.1.1n",
+    "3.0.2"
 ]
 
 LIBRESSL_OLD_VERSIONS = [
index d078887b2f4856c739daf34db84732d07d62f9c4..7f9749091dc011fa5d8ae00dc0dae2f6cf620363 100755 (executable)
--- a/configure
+++ b/configure
@@ -8042,7 +8042,7 @@ sys/stat.h sys/syscall.h sys/sys_domain.h sys/termio.h sys/time.h \
 sys/times.h sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h pty.h \
 libutil.h sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \
 linux/tipc.h linux/random.h spawn.h util.h alloca.h endian.h \
-sys/endian.h sys/sysmacros.h linux/memfd.h linux/wait.h sys/memfd.h sys/mman.h
+sys/endian.h sys/sysmacros.h linux/auxvec.h linux/memfd.h linux/wait.h sys/memfd.h sys/mman.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
 
 # checks for compiler characteristics
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether char is unsigned" >&5
-$as_echo_n "checking whether char is unsigned... " >&6; }
-if ${ac_cv_c_char_unsigned+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-static int test_array [1 - 2 * !(((char) -1) < 0)];
-test_array [0] = 0;
-return test_array [0];
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_char_unsigned=no
-else
-  ac_cv_c_char_unsigned=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_char_unsigned" >&5
-$as_echo "$ac_cv_c_char_unsigned" >&6; }
-if test $ac_cv_c_char_unsigned = yes && test "$GCC" != yes; then
-  $as_echo "#define __CHAR_UNSIGNED__ 1" >>confdefs.h
-
-fi
-
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
 $as_echo_n "checking for an ANSI C-conforming const... " >&6; }
 if ${ac_cv_c_const+:} false; then :
index 431d66197bc7ffd1652be7f06c62d47b703a777f..1354cc0a8dd68b473c9a0a309556c3e87f0c1aa3 100644 (file)
@@ -2228,7 +2228,7 @@ sys/stat.h sys/syscall.h sys/sys_domain.h sys/termio.h sys/time.h \
 sys/times.h sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h pty.h \
 libutil.h sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \
 linux/tipc.h linux/random.h spawn.h util.h alloca.h endian.h \
-sys/endian.h sys/sysmacros.h linux/memfd.h linux/wait.h sys/memfd.h sys/mman.h)
+sys/endian.h sys/sysmacros.h linux/auxvec.h linux/memfd.h linux/wait.h sys/memfd.h sys/mman.h)
 AC_HEADER_DIRENT
 AC_HEADER_MAJOR
 
@@ -4309,7 +4309,6 @@ fi
 
 # checks for compiler characteristics
 
-AC_C_CHAR_UNSIGNED
 AC_C_CONST
 
 works=no
index 188faeeb1202076b17b1cbf05008308799090e90..ce850fcad8280a115ebdbb8cb4138b7436e5f60b 100644 (file)
 /* Define to 1 if you have the `linkat' function. */
 #undef HAVE_LINKAT
 
+/* Define to 1 if you have the <linux/auxvec.h> header file. */
+#undef HAVE_LINUX_AUXVEC_H
+
 /* Define to 1 if you have the <linux/can/bcm.h> header file. */
 #undef HAVE_LINUX_CAN_BCM_H
 
 /* Define on FreeBSD to activate all library features */
 #undef __BSD_VISIBLE
 
-/* Define to 1 if type `char' is unsigned and you are not using gcc.  */
-#ifndef __CHAR_UNSIGNED__
-# undef __CHAR_UNSIGNED__
-#endif
-
 /* Define to 'long' if <time.h> doesn't define. */
 #undef clock_t
 
index c6023e1ab6353e8ac60a86ffe15c489b939517d2..0bec170d3f2448cd344f7abb0659dbdfa700c1cc 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -682,7 +682,9 @@ class PyBuildExt(build_ext):
         tmpfile = os.path.join(self.build_temp, 'ccpaths')
         if not os.path.exists(self.build_temp):
             os.makedirs(self.build_temp)
-        ret = run_command('%s -E -v - </dev/null 2>%s 1>/dev/null' % (CC, tmpfile))
+        # bpo-38472: With a German locale, GCC returns "gcc-Version 9.1.0
+        # (GCC)", whereas it returns "gcc version 9.1.0" with the C locale.
+        ret = run_command('LC_ALL=C %s -E -v - </dev/null 2>%s 1>/dev/null' % (CC, tmpfile))
         is_gcc = False
         is_clang = False
         in_incdirs = False