summaryrefslogtreecommitdiffstats
path: root/third_party/python/yarl
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:22:09 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:22:09 +0000
commit43a97878ce14b72f0981164f87f2e35e14151312 (patch)
tree620249daf56c0258faa40cbdcf9cfba06de2a846 /third_party/python/yarl
parentInitial commit. (diff)
downloadfirefox-upstream.tar.xz
firefox-upstream.zip
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/python/yarl')
-rw-r--r--third_party/python/yarl/CHANGES.rst572
-rw-r--r--third_party/python/yarl/LICENSE201
-rw-r--r--third_party/python/yarl/MANIFEST.in13
-rw-r--r--third_party/python/yarl/PKG-INFO797
-rw-r--r--third_party/python/yarl/README.rst202
-rw-r--r--third_party/python/yarl/pyproject.toml7
-rw-r--r--third_party/python/yarl/setup.cfg27
-rw-r--r--third_party/python/yarl/setup.py83
-rw-r--r--third_party/python/yarl/yarl.egg-info/PKG-INFO797
-rw-r--r--third_party/python/yarl/yarl.egg-info/SOURCES.txt42
-rw-r--r--third_party/python/yarl/yarl.egg-info/dependency_links.txt1
-rw-r--r--third_party/python/yarl/yarl.egg-info/requires.txt5
-rw-r--r--third_party/python/yarl/yarl.egg-info/top_level.txt1
-rw-r--r--third_party/python/yarl/yarl/__init__.py5
-rw-r--r--third_party/python/yarl/yarl/__init__.pyi111
-rw-r--r--third_party/python/yarl/yarl/_quoting.py18
-rw-r--r--third_party/python/yarl/yarl/_quoting_c.c11612
-rw-r--r--third_party/python/yarl/yarl/_quoting_c.pyi16
-rw-r--r--third_party/python/yarl/yarl/_quoting_c.pyx371
-rw-r--r--third_party/python/yarl/yarl/_quoting_py.py198
-rw-r--r--third_party/python/yarl/yarl/_url.py1144
-rw-r--r--third_party/python/yarl/yarl/py.typed1
22 files changed, 16224 insertions, 0 deletions
diff --git a/third_party/python/yarl/CHANGES.rst b/third_party/python/yarl/CHANGES.rst
new file mode 100644
index 0000000000..58ee2e4828
--- /dev/null
+++ b/third_party/python/yarl/CHANGES.rst
@@ -0,0 +1,572 @@
+=========
+Changelog
+=========
+
+..
+ You should *NOT* be adding new change log entries to this file, this
+ file is managed by towncrier. You *may* edit previous change logs to
+ fix problems like typo corrections or such.
+ To add a new change log entry, please see
+ https://pip.pypa.io/en/latest/development/#adding-a-news-entry
+ we named the news folder "changes".
+
+ WARNING: Don't drop the next directive!
+
+.. towncrier release notes start
+
+1.6.3 (2020-11-14)
+==================
+
+Bugfixes
+--------
+
+- No longer loose characters when decoding incorrect percent-sequences (like ``%e2%82%f8``). All non-decodable percent-sequences are now preserved.
+ `#517 <https://github.com/aio-libs/yarl/issues/517>`_
+- Provide x86 Windows wheels.
+ `#535 <https://github.com/aio-libs/yarl/issues/535>`_
+
+
+----
+
+
+1.6.2 (2020-10-12)
+==================
+
+
+Bugfixes
+--------
+
+- Provide generated ``.c`` files in TarBall distribution.
+ `#530 <https://github.com/aio-libs/multidict/issues/530>`_
+
+1.6.1 (2020-10-12)
+==================
+
+Features
+--------
+
+- Provide wheels for ``aarch64``, ``i686``, ``ppc64le``, ``s390x`` architectures on
+ Linux as well as ``x86_64``.
+ `#507 <https://github.com/aio-libs/yarl/issues/507>`_
+- Provide wheels for Python 3.9.
+ `#526 <https://github.com/aio-libs/yarl/issues/526>`_
+
+Bugfixes
+--------
+
+- ``human_repr()`` now always produces valid representation equivalent to the original URL (if the original URL is valid).
+ `#511 <https://github.com/aio-libs/yarl/issues/511>`_
+- Fixed requoting a single percent followed by a percent-encoded character in the Cython implementation.
+ `#514 <https://github.com/aio-libs/yarl/issues/514>`_
+- Fix ValueError when decoding ``%`` which is not followed by two hexadecimal digits.
+ `#516 <https://github.com/aio-libs/yarl/issues/516>`_
+- Fix decoding ``%`` followed by a space and hexadecimal digit.
+ `#520 <https://github.com/aio-libs/yarl/issues/520>`_
+- Fix annotation of ``with_query()``/``update_query()`` methods for ``key=[val1, val2]`` case.
+ `#528 <https://github.com/aio-libs/yarl/issues/528>`_
+
+Removal
+-------
+
+- Drop Python 3.5 support; Python 3.6 is the minimal supported Python version.
+
+
+----
+
+
+1.6.0 (2020-09-23)
+==================
+
+Features
+--------
+
+- Allow for int and float subclasses in query, while still denying bool.
+ `#492 <https://github.com/aio-libs/yarl/issues/492>`_
+
+
+Bugfixes
+--------
+
+- Do not requote arguments in ``URL.build()``, ``with_xxx()`` and in ``/`` operator.
+ `#502 <https://github.com/aio-libs/yarl/issues/502>`_
+- Keep IPv6 brackets in ``origin()``.
+ `#504 <https://github.com/aio-libs/yarl/issues/504>`_
+
+
+----
+
+
+1.5.1 (2020-08-01)
+==================
+
+Bugfixes
+--------
+
+- Fix including relocated internal ``yarl._quoting_c`` C-extension into published PyPI dists.
+ `#485 <https://github.com/aio-libs/yarl/issues/485>`_
+
+
+Misc
+----
+
+- `#484 <https://github.com/aio-libs/yarl/issues/484>`_
+
+
+----
+
+
+1.5.0 (2020-07-26)
+==================
+
+Features
+--------
+
+- Convert host to lowercase on URL building.
+ `#386 <https://github.com/aio-libs/yarl/issues/386>`_
+- Allow using ``mod`` operator (`%`) for updating query string (an alias for ``update_query()`` method).
+ `#435 <https://github.com/aio-libs/yarl/issues/435>`_
+- Allow use of sequences such as ``list`` and ``tuple`` in the values
+ of a mapping such as ``dict`` to represent that a key has many values::
+
+ url = URL("http://example.com")
+ assert url.with_query({"a": [1, 2]}) == URL("http://example.com/?a=1&a=2")
+
+ `#443 <https://github.com/aio-libs/yarl/issues/443>`_
+- Support URL.build() with scheme and path (creates a relative URL).
+ `#464 <https://github.com/aio-libs/yarl/issues/464>`_
+- Cache slow IDNA encode/decode calls.
+ `#476 <https://github.com/aio-libs/yarl/issues/476>`_
+- Add ``@final`` / ``Final`` type hints
+ `#477 <https://github.com/aio-libs/yarl/issues/477>`_
+- Support URL authority/raw_authority properties and authority argument of ``URL.build()`` method.
+ `#478 <https://github.com/aio-libs/yarl/issues/478>`_
+- Hide the library implementation details, make the exposed public list very clean.
+ `#483 <https://github.com/aio-libs/yarl/issues/483>`_
+
+
+Bugfixes
+--------
+
+- Fix tests with newer Python (3.7.6, 3.8.1 and 3.9.0+).
+ `#409 <https://github.com/aio-libs/yarl/issues/409>`_
+- Fix a bug where query component, passed in a form of mapping or sequence, is unquoted in unexpected way.
+ `#426 <https://github.com/aio-libs/yarl/issues/426>`_
+- Hide `Query` and `QueryVariable` type aliases in `__init__.pyi`, now they are prefixed with underscore.
+ `#431 <https://github.com/aio-libs/yarl/issues/431>`_
+- Keep ipv6 brackets after updating port/user/password.
+ `#451 <https://github.com/aio-libs/yarl/issues/451>`_
+
+
+----
+
+
+1.4.2 (2019-12-05)
+==================
+
+Features
+--------
+
+- Workaround for missing `str.isascii()` in Python 3.6
+ `#389 <https://github.com/aio-libs/yarl/issues/389>`_
+
+
+----
+
+
+1.4.1 (2019-11-29)
+==================
+
+* Fix regression, make the library work on Python 3.5 and 3.6 again.
+
+1.4.0 (2019-11-29)
+==================
+
+* Distinguish an empty password in URL from a password not provided at all (#262)
+
+* Fixed annotations for optional parameters of ``URL.build`` (#309)
+
+* Use None as default value of ``user`` parameter of ``URL.build`` (#309)
+
+* Enforce building C Accelerated modules when installing from source tarball, use
+ ``YARL_NO_EXTENSIONS`` environment variable for falling back to (slower) Pure Python
+ implementation (#329)
+
+* Drop Python 3.5 support
+
+* Fix quoting of plus in path by pure python version (#339)
+
+* Don't create a new URL if fragment is unchanged (#292)
+
+* Included in error msg the path that produces starting slash forbidden error (#376)
+
+* Skip slow IDNA encoding for ASCII-only strings (#387)
+
+
+1.3.0 (2018-12-11)
+==================
+
+* Fix annotations for ``query`` parameter (#207)
+
+* An incoming query sequence can have int variables (the same as for
+ Mapping type) (#208)
+
+* Add ``URL.explicit_port`` property (#218)
+
+* Give a friendlier error when port cant be converted to int (#168)
+
+* ``bool(URL())`` now returns ``False`` (#272)
+
+1.2.6 (2018-06-14)
+==================
+
+* Drop Python 3.4 trove classifier (#205)
+
+1.2.5 (2018-05-23)
+==================
+
+* Fix annotations for ``build`` (#199)
+
+1.2.4 (2018-05-08)
+==================
+
+* Fix annotations for ``cached_property`` (#195)
+
+1.2.3 (2018-05-03)
+==================
+
+* Accept ``str`` subclasses in ``URL`` constructor (#190)
+
+1.2.2 (2018-05-01)
+==================
+
+* Fix build
+
+1.2.1 (2018-04-30)
+==================
+
+* Pin minimal required Python to 3.5.3 (#189)
+
+1.2.0 (2018-04-30)
+==================
+
+* Forbid inheritance, replace ``__init__`` with ``__new__`` (#171)
+
+* Support PEP-561 (provide type hinting marker) (#182)
+
+1.1.1 (2018-02-17)
+==================
+
+* Fix performance regression: don't encode enmpty netloc (#170)
+
+1.1.0 (2018-01-21)
+==================
+
+* Make pure Python quoter consistent with Cython version (#162)
+
+1.0.0 (2018-01-15)
+==================
+
+* Use fast path if quoted string does not need requoting (#154)
+
+* Speed up quoting/unquoting by ``_Quoter`` and ``_Unquoter`` classes (#155)
+
+* Drop ``yarl.quote`` and ``yarl.unquote`` public functions (#155)
+
+* Add custom string writer, reuse static buffer if available (#157)
+ Code is 50-80 times faster than Pure Python version (was 4-5 times faster)
+
+* Don't recode IP zone (#144)
+
+* Support ``encoded=True`` in ``yarl.URL.build()`` (#158)
+
+* Fix updating query with multiple keys (#160)
+
+0.18.0 (2018-01-10)
+===================
+
+* Fallback to IDNA 2003 if domain name is not IDNA 2008 compatible (#152)
+
+0.17.0 (2017-12-30)
+===================
+
+* Use IDNA 2008 for domain name processing (#149)
+
+0.16.0 (2017-12-07)
+===================
+
+* Fix raising ``TypeError`` by ``url.query_string()`` after
+ ``url.with_query({})`` (empty mapping) (#141)
+
+0.15.0 (2017-11-23)
+===================
+
+* Add ``raw_path_qs`` attribute (#137)
+
+0.14.2 (2017-11-14)
+===================
+
+* Restore ``strict`` parameter as no-op in ``quote`` / ``unquote``
+
+0.14.1 (2017-11-13)
+===================
+
+* Restore ``strict`` parameter as no-op for sake of compatibility with
+ aiohttp 2.2
+
+0.14.0 (2017-11-11)
+===================
+
+* Drop strict mode (#123)
+
+* Fix ``"ValueError: Unallowed PCT %"`` when there's a ``"%"`` in the url (#124)
+
+0.13.0 (2017-10-01)
+===================
+
+* Document ``encoded`` parameter (#102)
+
+* Support relative urls like ``'?key=value'`` (#100)
+
+* Unsafe encoding for QS fixed. Encode ``;`` char in value param (#104)
+
+* Process passwords without user names (#95)
+
+0.12.0 (2017-06-26)
+===================
+
+* Properly support paths without leading slash in ``URL.with_path()`` (#90)
+
+* Enable type annotation checks
+
+0.11.0 (2017-06-26)
+===================
+
+* Normalize path (#86)
+
+* Clear query and fragment parts in ``.with_path()`` (#85)
+
+0.10.3 (2017-06-13)
+===================
+
+* Prevent double URL args unquoting (#83)
+
+0.10.2 (2017-05-05)
+===================
+
+* Unexpected hash behaviour (#75)
+
+
+0.10.1 (2017-05-03)
+===================
+
+* Unexpected compare behaviour (#73)
+
+* Do not quote or unquote + if not a query string. (#74)
+
+
+0.10.0 (2017-03-14)
+===================
+
+* Added ``URL.build`` class method (#58)
+
+* Added ``path_qs`` attribute (#42)
+
+
+0.9.8 (2017-02-16)
+==================
+
+* Do not quote ``:`` in path
+
+
+0.9.7 (2017-02-16)
+==================
+
+* Load from pickle without _cache (#56)
+
+* Percent-encoded pluses in path variables become spaces (#59)
+
+
+0.9.6 (2017-02-15)
+==================
+
+* Revert backward incompatible change (BaseURL)
+
+
+0.9.5 (2017-02-14)
+==================
+
+* Fix BaseURL rich comparison support
+
+
+0.9.4 (2017-02-14)
+==================
+
+* Use BaseURL
+
+
+0.9.3 (2017-02-14)
+==================
+
+* Added BaseURL
+
+
+0.9.2 (2017-02-08)
+==================
+
+* Remove debug print
+
+
+0.9.1 (2017-02-07)
+==================
+
+* Do not lose tail chars (#45)
+
+
+0.9.0 (2017-02-07)
+==================
+
+* Allow to quote ``%`` in non strict mode (#21)
+
+* Incorrect parsing of query parameters with %3B (;) inside (#34)
+
+* Fix core dumps (#41)
+
+* tmpbuf - compiling error (#43)
+
+* Added ``URL.update_path()`` method
+
+* Added ``URL.update_query()`` method (#47)
+
+
+0.8.1 (2016-12-03)
+==================
+
+* Fix broken aiohttp: revert back ``quote`` / ``unquote``.
+
+
+0.8.0 (2016-12-03)
+==================
+
+* Support more verbose error messages in ``.with_query()`` (#24)
+
+* Don't percent-encode ``@`` and ``:`` in path (#32)
+
+* Don't expose ``yarl.quote`` and ``yarl.unquote``, these functions are
+ part of private API
+
+0.7.1 (2016-11-18)
+==================
+
+* Accept not only ``str`` but all classes inherited from ``str`` also (#25)
+
+0.7.0 (2016-11-07)
+==================
+
+* Accept ``int`` as value for ``.with_query()``
+
+0.6.0 (2016-11-07)
+==================
+
+* Explicitly use UTF8 encoding in setup.py (#20)
+* Properly unquote non-UTF8 strings (#19)
+
+0.5.3 (2016-11-02)
+==================
+
+* Don't use namedtuple fields but indexes on URL construction
+
+0.5.2 (2016-11-02)
+==================
+
+* Inline ``_encode`` class method
+
+0.5.1 (2016-11-02)
+==================
+
+* Make URL construction faster by removing extra classmethod calls
+
+0.5.0 (2016-11-02)
+==================
+
+* Add cython optimization for quoting/unquoting
+* Provide binary wheels
+
+0.4.3 (2016-09-29)
+==================
+
+* Fix typing stubs
+
+0.4.2 (2016-09-29)
+==================
+
+* Expose ``quote()`` and ``unquote()`` as public API
+
+0.4.1 (2016-09-28)
+==================
+
+* Support empty values in query (``'/path?arg'``)
+
+0.4.0 (2016-09-27)
+==================
+
+* Introduce ``relative()`` (#16)
+
+0.3.2 (2016-09-27)
+==================
+
+* Typo fixes #15
+
+0.3.1 (2016-09-26)
+==================
+
+* Support sequence of pairs as ``with_query()`` parameter
+
+0.3.0 (2016-09-26)
+==================
+
+* Introduce ``is_default_port()``
+
+0.2.1 (2016-09-26)
+==================
+
+* Raise ValueError for URLs like 'http://:8080/'
+
+0.2.0 (2016-09-18)
+==================
+
+* Avoid doubling slashes when joining paths (#13)
+
+* Appending path starting from slash is forbidden (#12)
+
+0.1.4 (2016-09-09)
+==================
+
+* Add kwargs support for ``with_query()`` (#10)
+
+0.1.3 (2016-09-07)
+==================
+
+* Document ``with_query()``, ``with_fragment()`` and ``origin()``
+
+* Allow ``None`` for ``with_query()`` and ``with_fragment()``
+
+0.1.2 (2016-09-07)
+==================
+
+* Fix links, tune docs theme.
+
+0.1.1 (2016-09-06)
+==================
+
+* Update README, old version used obsolete API
+
+0.1.0 (2016-09-06)
+==================
+
+* The library was deeply refactored, bytes are gone away but all
+ accepted strings are encoded if needed.
+
+0.0.1 (2016-08-30)
+==================
+
+* The first release.
diff --git a/third_party/python/yarl/LICENSE b/third_party/python/yarl/LICENSE
new file mode 100644
index 0000000000..cc5cfd6790
--- /dev/null
+++ b/third_party/python/yarl/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2016-2018, Andrew Svetlov and aio-libs team
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/third_party/python/yarl/MANIFEST.in b/third_party/python/yarl/MANIFEST.in
new file mode 100644
index 0000000000..dab6cb9a00
--- /dev/null
+++ b/third_party/python/yarl/MANIFEST.in
@@ -0,0 +1,13 @@
+include LICENSE
+include CHANGES.rst
+include README.rst
+graft yarl
+graft docs
+graft tests
+include yarl/*.c
+global-exclude *.pyc
+global-exclude *.cache
+exclude yarl/*.html
+exclude yarl/*.so
+exclude yarl/*.pyd
+prune docs/_build
diff --git a/third_party/python/yarl/PKG-INFO b/third_party/python/yarl/PKG-INFO
new file mode 100644
index 0000000000..3c242e5135
--- /dev/null
+++ b/third_party/python/yarl/PKG-INFO
@@ -0,0 +1,797 @@
+Metadata-Version: 2.1
+Name: yarl
+Version: 1.6.3
+Summary: Yet another URL library
+Home-page: https://github.com/aio-libs/yarl/
+Author: Andrew Svetlov
+Author-email: andrew.svetlov@gmail.com
+License: Apache 2
+Description: yarl
+ ====
+
+ .. image:: https://github.com/aio-libs/yarl/workflows/CI/badge.svg
+ :target: https://github.com/aio-libs/yarl/actions?query=workflow%3ACI
+ :align: right
+
+ .. image:: https://codecov.io/gh/aio-libs/yarl/branch/master/graph/badge.svg
+ :target: https://codecov.io/gh/aio-libs/yarl
+
+ .. image:: https://badge.fury.io/py/yarl.svg
+ :target: https://badge.fury.io/py/yarl
+
+
+ .. image:: https://readthedocs.org/projects/yarl/badge/?version=latest
+ :target: https://yarl.readthedocs.io
+
+
+ .. image:: https://img.shields.io/pypi/pyversions/yarl.svg
+ :target: https://pypi.python.org/pypi/yarl
+
+ .. image:: https://badges.gitter.im/Join%20Chat.svg
+ :target: https://gitter.im/aio-libs/Lobby
+ :alt: Chat on Gitter
+
+ Introduction
+ ------------
+
+ Url is constructed from ``str``:
+
+ .. code-block:: pycon
+
+ >>> from yarl import URL
+ >>> url = URL('https://www.python.org/~guido?arg=1#frag')
+ >>> url
+ URL('https://www.python.org/~guido?arg=1#frag')
+
+ All url parts: *scheme*, *user*, *password*, *host*, *port*, *path*,
+ *query* and *fragment* are accessible by properties:
+
+ .. code-block:: pycon
+
+ >>> url.scheme
+ 'https'
+ >>> url.host
+ 'www.python.org'
+ >>> url.path
+ '/~guido'
+ >>> url.query_string
+ 'arg=1'
+ >>> url.query
+ <MultiDictProxy('arg': '1')>
+ >>> url.fragment
+ 'frag'
+
+ All url manipulations produce a new url object:
+
+ .. code-block:: pycon
+
+ >>> url = URL('https://www.python.org')
+ >>> url / 'foo' / 'bar'
+ URL('https://www.python.org/foo/bar')
+ >>> url / 'foo' % {'bar': 'baz'}
+ URL('https://www.python.org/foo?bar=baz')
+
+ Strings passed to constructor and modification methods are
+ automatically encoded giving canonical representation as result:
+
+ .. code-block:: pycon
+
+ >>> url = URL('https://www.python.org/путь')
+ >>> url
+ URL('https://www.python.org/%D0%BF%D1%83%D1%82%D1%8C')
+
+ Regular properties are *percent-decoded*, use ``raw_`` versions for
+ getting *encoded* strings:
+
+ .. code-block:: pycon
+
+ >>> url.path
+ '/путь'
+
+ >>> url.raw_path
+ '/%D0%BF%D1%83%D1%82%D1%8C'
+
+ Human readable representation of URL is available as ``.human_repr()``:
+
+ .. code-block:: pycon
+
+ >>> url.human_repr()
+ 'https://www.python.org/путь'
+
+ For full documentation please read https://yarl.readthedocs.org.
+
+
+ Installation
+ ------------
+
+ ::
+
+ $ pip install yarl
+
+ The library is Python 3 only!
+
+ PyPI contains binary wheels for Linux, Windows and MacOS. If you want to install
+ ``yarl`` on another operating system (like *Alpine Linux*, which is not
+ manylinux-compliant because of the missing glibc and therefore, cannot be
+ used with our wheels) the the tarball will be used to compile the library from
+ the source code. It requires a C compiler and and Python headers installed.
+
+ To skip the compilation you must explicitly opt-in by setting the `YARL_NO_EXTENSIONS`
+ environment variable to a non-empty value, e.g.:
+
+ .. code-block:: bash
+
+ $ YARL_NO_EXTENSIONS=1 pip install yarl
+
+ Please note that the pure-Python (uncompiled) version is much slower. However,
+ PyPy always uses a pure-Python implementation, and, as such, it is unaffected
+ by this variable.
+
+ Dependencies
+ ------------
+
+ YARL requires multidict_ library.
+
+
+ API documentation
+ ------------------
+
+ The documentation is located at https://yarl.readthedocs.org
+
+
+ Why isn't boolean supported by the URL query API?
+ -------------------------------------------------
+
+ There is no standard for boolean representation of boolean values.
+
+ Some systems prefer ``true``/``false``, others like ``yes``/``no``, ``on``/``off``,
+ ``Y``/``N``, ``1``/``0``, etc.
+
+ ``yarl`` cannot make an unambiguous decision on how to serialize ``bool`` values because
+ it is specific to how the end-user's application is built and would be different for
+ different apps. The library doesn't accept booleans in the API; a user should convert
+ bools into strings using own preferred translation protocol.
+
+
+ Comparison with other URL libraries
+ ------------------------------------
+
+ * furl (https://pypi.python.org/pypi/furl)
+
+ The library has rich functionality but the ``furl`` object is mutable.
+
+ I'm afraid to pass this object into foreign code: who knows if the
+ code will modify my url in a terrible way while I just want to send URL
+ with handy helpers for accessing URL properties.
+
+ ``furl`` has other non-obvious tricky things but the main objection
+ is mutability.
+
+ * URLObject (https://pypi.python.org/pypi/URLObject)
+
+ URLObject is immutable, that's pretty good.
+
+ Every URL change generates a new URL object.
+
+ But the library doesn't do any decode/encode transformations leaving the
+ end user to cope with these gory details.
+
+
+ Source code
+ -----------
+
+ The project is hosted on GitHub_
+
+ Please file an issue on the `bug tracker
+ <https://github.com/aio-libs/yarl/issues>`_ if you have found a bug
+ or have some suggestion in order to improve the library.
+
+ The library uses `Azure Pipelines <https://dev.azure.com/aio-libs/yarl>`_ for
+ Continuous Integration.
+
+ Discussion list
+ ---------------
+
+ *aio-libs* google group: https://groups.google.com/forum/#!forum/aio-libs
+
+ Feel free to post your questions and ideas here.
+
+
+ Authors and License
+ -------------------
+
+ The ``yarl`` package is written by Andrew Svetlov.
+
+ It's *Apache 2* licensed and freely available.
+
+
+ .. _GitHub: https://github.com/aio-libs/yarl
+
+ .. _multidict: https://github.com/aio-libs/multidict
+
+
+ =========
+ Changelog
+ =========
+
+ ..
+ You should *NOT* be adding new change log entries to this file, this
+ file is managed by towncrier. You *may* edit previous change logs to
+ fix problems like typo corrections or such.
+ To add a new change log entry, please see
+ https://pip.pypa.io/en/latest/development/#adding-a-news-entry
+ we named the news folder "changes".
+
+ WARNING: Don't drop the next directive!
+
+ .. towncrier release notes start
+
+ 1.6.3 (2020-11-14)
+ ==================
+
+ Bugfixes
+ --------
+
+ - No longer loose characters when decoding incorrect percent-sequences (like ``%e2%82%f8``). All non-decodable percent-sequences are now preserved.
+ `#517 <https://github.com/aio-libs/yarl/issues/517>`_
+ - Provide x86 Windows wheels.
+ `#535 <https://github.com/aio-libs/yarl/issues/535>`_
+
+
+ ----
+
+
+ 1.6.2 (2020-10-12)
+ ==================
+
+
+ Bugfixes
+ --------
+
+ - Provide generated ``.c`` files in TarBall distribution.
+ `#530 <https://github.com/aio-libs/multidict/issues/530>`_
+
+ 1.6.1 (2020-10-12)
+ ==================
+
+ Features
+ --------
+
+ - Provide wheels for ``aarch64``, ``i686``, ``ppc64le``, ``s390x`` architectures on
+ Linux as well as ``x86_64``.
+ `#507 <https://github.com/aio-libs/yarl/issues/507>`_
+ - Provide wheels for Python 3.9.
+ `#526 <https://github.com/aio-libs/yarl/issues/526>`_
+
+ Bugfixes
+ --------
+
+ - ``human_repr()`` now always produces valid representation equivalent to the original URL (if the original URL is valid).
+ `#511 <https://github.com/aio-libs/yarl/issues/511>`_
+ - Fixed requoting a single percent followed by a percent-encoded character in the Cython implementation.
+ `#514 <https://github.com/aio-libs/yarl/issues/514>`_
+ - Fix ValueError when decoding ``%`` which is not followed by two hexadecimal digits.
+ `#516 <https://github.com/aio-libs/yarl/issues/516>`_
+ - Fix decoding ``%`` followed by a space and hexadecimal digit.
+ `#520 <https://github.com/aio-libs/yarl/issues/520>`_
+ - Fix annotation of ``with_query()``/``update_query()`` methods for ``key=[val1, val2]`` case.
+ `#528 <https://github.com/aio-libs/yarl/issues/528>`_
+
+ Removal
+ -------
+
+ - Drop Python 3.5 support; Python 3.6 is the minimal supported Python version.
+
+
+ ----
+
+
+ 1.6.0 (2020-09-23)
+ ==================
+
+ Features
+ --------
+
+ - Allow for int and float subclasses in query, while still denying bool.
+ `#492 <https://github.com/aio-libs/yarl/issues/492>`_
+
+
+ Bugfixes
+ --------
+
+ - Do not requote arguments in ``URL.build()``, ``with_xxx()`` and in ``/`` operator.
+ `#502 <https://github.com/aio-libs/yarl/issues/502>`_
+ - Keep IPv6 brackets in ``origin()``.
+ `#504 <https://github.com/aio-libs/yarl/issues/504>`_
+
+
+ ----
+
+
+ 1.5.1 (2020-08-01)
+ ==================
+
+ Bugfixes
+ --------
+
+ - Fix including relocated internal ``yarl._quoting_c`` C-extension into published PyPI dists.
+ `#485 <https://github.com/aio-libs/yarl/issues/485>`_
+
+
+ Misc
+ ----
+
+ - `#484 <https://github.com/aio-libs/yarl/issues/484>`_
+
+
+ ----
+
+
+ 1.5.0 (2020-07-26)
+ ==================
+
+ Features
+ --------
+
+ - Convert host to lowercase on URL building.
+ `#386 <https://github.com/aio-libs/yarl/issues/386>`_
+ - Allow using ``mod`` operator (`%`) for updating query string (an alias for ``update_query()`` method).
+ `#435 <https://github.com/aio-libs/yarl/issues/435>`_
+ - Allow use of sequences such as ``list`` and ``tuple`` in the values
+ of a mapping such as ``dict`` to represent that a key has many values::
+
+ url = URL("http://example.com")
+ assert url.with_query({"a": [1, 2]}) == URL("http://example.com/?a=1&a=2")
+
+ `#443 <https://github.com/aio-libs/yarl/issues/443>`_
+ - Support URL.build() with scheme and path (creates a relative URL).
+ `#464 <https://github.com/aio-libs/yarl/issues/464>`_
+ - Cache slow IDNA encode/decode calls.
+ `#476 <https://github.com/aio-libs/yarl/issues/476>`_
+ - Add ``@final`` / ``Final`` type hints
+ `#477 <https://github.com/aio-libs/yarl/issues/477>`_
+ - Support URL authority/raw_authority properties and authority argument of ``URL.build()`` method.
+ `#478 <https://github.com/aio-libs/yarl/issues/478>`_
+ - Hide the library implementation details, make the exposed public list very clean.
+ `#483 <https://github.com/aio-libs/yarl/issues/483>`_
+
+
+ Bugfixes
+ --------
+
+ - Fix tests with newer Python (3.7.6, 3.8.1 and 3.9.0+).
+ `#409 <https://github.com/aio-libs/yarl/issues/409>`_
+ - Fix a bug where query component, passed in a form of mapping or sequence, is unquoted in unexpected way.
+ `#426 <https://github.com/aio-libs/yarl/issues/426>`_
+ - Hide `Query` and `QueryVariable` type aliases in `__init__.pyi`, now they are prefixed with underscore.
+ `#431 <https://github.com/aio-libs/yarl/issues/431>`_
+ - Keep ipv6 brackets after updating port/user/password.
+ `#451 <https://github.com/aio-libs/yarl/issues/451>`_
+
+
+ ----
+
+
+ 1.4.2 (2019-12-05)
+ ==================
+
+ Features
+ --------
+
+ - Workaround for missing `str.isascii()` in Python 3.6
+ `#389 <https://github.com/aio-libs/yarl/issues/389>`_
+
+
+ ----
+
+
+ 1.4.1 (2019-11-29)
+ ==================
+
+ * Fix regression, make the library work on Python 3.5 and 3.6 again.
+
+ 1.4.0 (2019-11-29)
+ ==================
+
+ * Distinguish an empty password in URL from a password not provided at all (#262)
+
+ * Fixed annotations for optional parameters of ``URL.build`` (#309)
+
+ * Use None as default value of ``user`` parameter of ``URL.build`` (#309)
+
+ * Enforce building C Accelerated modules when installing from source tarball, use
+ ``YARL_NO_EXTENSIONS`` environment variable for falling back to (slower) Pure Python
+ implementation (#329)
+
+ * Drop Python 3.5 support
+
+ * Fix quoting of plus in path by pure python version (#339)
+
+ * Don't create a new URL if fragment is unchanged (#292)
+
+ * Included in error msg the path that produces starting slash forbidden error (#376)
+
+ * Skip slow IDNA encoding for ASCII-only strings (#387)
+
+
+ 1.3.0 (2018-12-11)
+ ==================
+
+ * Fix annotations for ``query`` parameter (#207)
+
+ * An incoming query sequence can have int variables (the same as for
+ Mapping type) (#208)
+
+ * Add ``URL.explicit_port`` property (#218)
+
+ * Give a friendlier error when port cant be converted to int (#168)
+
+ * ``bool(URL())`` now returns ``False`` (#272)
+
+ 1.2.6 (2018-06-14)
+ ==================
+
+ * Drop Python 3.4 trove classifier (#205)
+
+ 1.2.5 (2018-05-23)
+ ==================
+
+ * Fix annotations for ``build`` (#199)
+
+ 1.2.4 (2018-05-08)
+ ==================
+
+ * Fix annotations for ``cached_property`` (#195)
+
+ 1.2.3 (2018-05-03)
+ ==================
+
+ * Accept ``str`` subclasses in ``URL`` constructor (#190)
+
+ 1.2.2 (2018-05-01)
+ ==================
+
+ * Fix build
+
+ 1.2.1 (2018-04-30)
+ ==================
+
+ * Pin minimal required Python to 3.5.3 (#189)
+
+ 1.2.0 (2018-04-30)
+ ==================
+
+ * Forbid inheritance, replace ``__init__`` with ``__new__`` (#171)
+
+ * Support PEP-561 (provide type hinting marker) (#182)
+
+ 1.1.1 (2018-02-17)
+ ==================
+
+ * Fix performance regression: don't encode enmpty netloc (#170)
+
+ 1.1.0 (2018-01-21)
+ ==================
+
+ * Make pure Python quoter consistent with Cython version (#162)
+
+ 1.0.0 (2018-01-15)
+ ==================
+
+ * Use fast path if quoted string does not need requoting (#154)
+
+ * Speed up quoting/unquoting by ``_Quoter`` and ``_Unquoter`` classes (#155)
+
+ * Drop ``yarl.quote`` and ``yarl.unquote`` public functions (#155)
+
+ * Add custom string writer, reuse static buffer if available (#157)
+ Code is 50-80 times faster than Pure Python version (was 4-5 times faster)
+
+ * Don't recode IP zone (#144)
+
+ * Support ``encoded=True`` in ``yarl.URL.build()`` (#158)
+
+ * Fix updating query with multiple keys (#160)
+
+ 0.18.0 (2018-01-10)
+ ===================
+
+ * Fallback to IDNA 2003 if domain name is not IDNA 2008 compatible (#152)
+
+ 0.17.0 (2017-12-30)
+ ===================
+
+ * Use IDNA 2008 for domain name processing (#149)
+
+ 0.16.0 (2017-12-07)
+ ===================
+
+ * Fix raising ``TypeError`` by ``url.query_string()`` after
+ ``url.with_query({})`` (empty mapping) (#141)
+
+ 0.15.0 (2017-11-23)
+ ===================
+
+ * Add ``raw_path_qs`` attribute (#137)
+
+ 0.14.2 (2017-11-14)
+ ===================
+
+ * Restore ``strict`` parameter as no-op in ``quote`` / ``unquote``
+
+ 0.14.1 (2017-11-13)
+ ===================
+
+ * Restore ``strict`` parameter as no-op for sake of compatibility with
+ aiohttp 2.2
+
+ 0.14.0 (2017-11-11)
+ ===================
+
+ * Drop strict mode (#123)
+
+ * Fix ``"ValueError: Unallowed PCT %"`` when there's a ``"%"`` in the url (#124)
+
+ 0.13.0 (2017-10-01)
+ ===================
+
+ * Document ``encoded`` parameter (#102)
+
+ * Support relative urls like ``'?key=value'`` (#100)
+
+ * Unsafe encoding for QS fixed. Encode ``;`` char in value param (#104)
+
+ * Process passwords without user names (#95)
+
+ 0.12.0 (2017-06-26)
+ ===================
+
+ * Properly support paths without leading slash in ``URL.with_path()`` (#90)
+
+ * Enable type annotation checks
+
+ 0.11.0 (2017-06-26)
+ ===================
+
+ * Normalize path (#86)
+
+ * Clear query and fragment parts in ``.with_path()`` (#85)
+
+ 0.10.3 (2017-06-13)
+ ===================
+
+ * Prevent double URL args unquoting (#83)
+
+ 0.10.2 (2017-05-05)
+ ===================
+
+ * Unexpected hash behaviour (#75)
+
+
+ 0.10.1 (2017-05-03)
+ ===================
+
+ * Unexpected compare behaviour (#73)
+
+ * Do not quote or unquote + if not a query string. (#74)
+
+
+ 0.10.0 (2017-03-14)
+ ===================
+
+ * Added ``URL.build`` class method (#58)
+
+ * Added ``path_qs`` attribute (#42)
+
+
+ 0.9.8 (2017-02-16)
+ ==================
+
+ * Do not quote ``:`` in path
+
+
+ 0.9.7 (2017-02-16)
+ ==================
+
+ * Load from pickle without _cache (#56)
+
+ * Percent-encoded pluses in path variables become spaces (#59)
+
+
+ 0.9.6 (2017-02-15)
+ ==================
+
+ * Revert backward incompatible change (BaseURL)
+
+
+ 0.9.5 (2017-02-14)
+ ==================
+
+ * Fix BaseURL rich comparison support
+
+
+ 0.9.4 (2017-02-14)
+ ==================
+
+ * Use BaseURL
+
+
+ 0.9.3 (2017-02-14)
+ ==================
+
+ * Added BaseURL
+
+
+ 0.9.2 (2017-02-08)
+ ==================
+
+ * Remove debug print
+
+
+ 0.9.1 (2017-02-07)
+ ==================
+
+ * Do not lose tail chars (#45)
+
+
+ 0.9.0 (2017-02-07)
+ ==================
+
+ * Allow to quote ``%`` in non strict mode (#21)
+
+ * Incorrect parsing of query parameters with %3B (;) inside (#34)
+
+ * Fix core dumps (#41)
+
+ * tmpbuf - compiling error (#43)
+
+ * Added ``URL.update_path()`` method
+
+ * Added ``URL.update_query()`` method (#47)
+
+
+ 0.8.1 (2016-12-03)
+ ==================
+
+ * Fix broken aiohttp: revert back ``quote`` / ``unquote``.
+
+
+ 0.8.0 (2016-12-03)
+ ==================
+
+ * Support more verbose error messages in ``.with_query()`` (#24)
+
+ * Don't percent-encode ``@`` and ``:`` in path (#32)
+
+ * Don't expose ``yarl.quote`` and ``yarl.unquote``, these functions are
+ part of private API
+
+ 0.7.1 (2016-11-18)
+ ==================
+
+ * Accept not only ``str`` but all classes inherited from ``str`` also (#25)
+
+ 0.7.0 (2016-11-07)
+ ==================
+
+ * Accept ``int`` as value for ``.with_query()``
+
+ 0.6.0 (2016-11-07)
+ ==================
+
+ * Explicitly use UTF8 encoding in setup.py (#20)
+ * Properly unquote non-UTF8 strings (#19)
+
+ 0.5.3 (2016-11-02)
+ ==================
+
+ * Don't use namedtuple fields but indexes on URL construction
+
+ 0.5.2 (2016-11-02)
+ ==================
+
+ * Inline ``_encode`` class method
+
+ 0.5.1 (2016-11-02)
+ ==================
+
+ * Make URL construction faster by removing extra classmethod calls
+
+ 0.5.0 (2016-11-02)
+ ==================
+
+ * Add cython optimization for quoting/unquoting
+ * Provide binary wheels
+
+ 0.4.3 (2016-09-29)
+ ==================
+
+ * Fix typing stubs
+
+ 0.4.2 (2016-09-29)
+ ==================
+
+ * Expose ``quote()`` and ``unquote()`` as public API
+
+ 0.4.1 (2016-09-28)
+ ==================
+
+ * Support empty values in query (``'/path?arg'``)
+
+ 0.4.0 (2016-09-27)
+ ==================
+
+ * Introduce ``relative()`` (#16)
+
+ 0.3.2 (2016-09-27)
+ ==================
+
+ * Typo fixes #15
+
+ 0.3.1 (2016-09-26)
+ ==================
+
+ * Support sequence of pairs as ``with_query()`` parameter
+
+ 0.3.0 (2016-09-26)
+ ==================
+
+ * Introduce ``is_default_port()``
+
+ 0.2.1 (2016-09-26)
+ ==================
+
+ * Raise ValueError for URLs like 'http://:8080/'
+
+ 0.2.0 (2016-09-18)
+ ==================
+
+ * Avoid doubling slashes when joining paths (#13)
+
+ * Appending path starting from slash is forbidden (#12)
+
+ 0.1.4 (2016-09-09)
+ ==================
+
+ * Add kwargs support for ``with_query()`` (#10)
+
+ 0.1.3 (2016-09-07)
+ ==================
+
+ * Document ``with_query()``, ``with_fragment()`` and ``origin()``
+
+ * Allow ``None`` for ``with_query()`` and ``with_fragment()``
+
+ 0.1.2 (2016-09-07)
+ ==================
+
+ * Fix links, tune docs theme.
+
+ 0.1.1 (2016-09-06)
+ ==================
+
+ * Update README, old version used obsolete API
+
+ 0.1.0 (2016-09-06)
+ ==================
+
+ * The library was deeply refactored, bytes are gone away but all
+ accepted strings are encoded if needed.
+
+ 0.0.1 (2016-08-30)
+ ==================
+
+ * The first release.
+
+Platform: UNKNOWN
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Intended Audience :: Developers
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Topic :: Internet :: WWW/HTTP
+Requires-Python: >=3.6
+Description-Content-Type: text/x-rst
diff --git a/third_party/python/yarl/README.rst b/third_party/python/yarl/README.rst
new file mode 100644
index 0000000000..6347ece2b9
--- /dev/null
+++ b/third_party/python/yarl/README.rst
@@ -0,0 +1,202 @@
+yarl
+====
+
+.. image:: https://github.com/aio-libs/yarl/workflows/CI/badge.svg
+ :target: https://github.com/aio-libs/yarl/actions?query=workflow%3ACI
+ :align: right
+
+.. image:: https://codecov.io/gh/aio-libs/yarl/branch/master/graph/badge.svg
+ :target: https://codecov.io/gh/aio-libs/yarl
+
+.. image:: https://badge.fury.io/py/yarl.svg
+ :target: https://badge.fury.io/py/yarl
+
+
+.. image:: https://readthedocs.org/projects/yarl/badge/?version=latest
+ :target: https://yarl.readthedocs.io
+
+
+.. image:: https://img.shields.io/pypi/pyversions/yarl.svg
+ :target: https://pypi.python.org/pypi/yarl
+
+.. image:: https://badges.gitter.im/Join%20Chat.svg
+ :target: https://gitter.im/aio-libs/Lobby
+ :alt: Chat on Gitter
+
+Introduction
+------------
+
+Url is constructed from ``str``:
+
+.. code-block:: pycon
+
+ >>> from yarl import URL
+ >>> url = URL('https://www.python.org/~guido?arg=1#frag')
+ >>> url
+ URL('https://www.python.org/~guido?arg=1#frag')
+
+All url parts: *scheme*, *user*, *password*, *host*, *port*, *path*,
+*query* and *fragment* are accessible by properties:
+
+.. code-block:: pycon
+
+ >>> url.scheme
+ 'https'
+ >>> url.host
+ 'www.python.org'
+ >>> url.path
+ '/~guido'
+ >>> url.query_string
+ 'arg=1'
+ >>> url.query
+ <MultiDictProxy('arg': '1')>
+ >>> url.fragment
+ 'frag'
+
+All url manipulations produce a new url object:
+
+.. code-block:: pycon
+
+ >>> url = URL('https://www.python.org')
+ >>> url / 'foo' / 'bar'
+ URL('https://www.python.org/foo/bar')
+ >>> url / 'foo' % {'bar': 'baz'}
+ URL('https://www.python.org/foo?bar=baz')
+
+Strings passed to constructor and modification methods are
+automatically encoded giving canonical representation as result:
+
+.. code-block:: pycon
+
+ >>> url = URL('https://www.python.org/путь')
+ >>> url
+ URL('https://www.python.org/%D0%BF%D1%83%D1%82%D1%8C')
+
+Regular properties are *percent-decoded*, use ``raw_`` versions for
+getting *encoded* strings:
+
+.. code-block:: pycon
+
+ >>> url.path
+ '/путь'
+
+ >>> url.raw_path
+ '/%D0%BF%D1%83%D1%82%D1%8C'
+
+Human readable representation of URL is available as ``.human_repr()``:
+
+.. code-block:: pycon
+
+ >>> url.human_repr()
+ 'https://www.python.org/путь'
+
+For full documentation please read https://yarl.readthedocs.org.
+
+
+Installation
+------------
+
+::
+
+ $ pip install yarl
+
+The library is Python 3 only!
+
+PyPI contains binary wheels for Linux, Windows and MacOS. If you want to install
+``yarl`` on another operating system (like *Alpine Linux*, which is not
+manylinux-compliant because of the missing glibc and therefore, cannot be
+used with our wheels) the the tarball will be used to compile the library from
+the source code. It requires a C compiler and and Python headers installed.
+
+To skip the compilation you must explicitly opt-in by setting the `YARL_NO_EXTENSIONS`
+environment variable to a non-empty value, e.g.:
+
+.. code-block:: bash
+
+ $ YARL_NO_EXTENSIONS=1 pip install yarl
+
+Please note that the pure-Python (uncompiled) version is much slower. However,
+PyPy always uses a pure-Python implementation, and, as such, it is unaffected
+by this variable.
+
+Dependencies
+------------
+
+YARL requires multidict_ library.
+
+
+API documentation
+------------------
+
+The documentation is located at https://yarl.readthedocs.org
+
+
+Why isn't boolean supported by the URL query API?
+-------------------------------------------------
+
+There is no standard for boolean representation of boolean values.
+
+Some systems prefer ``true``/``false``, others like ``yes``/``no``, ``on``/``off``,
+``Y``/``N``, ``1``/``0``, etc.
+
+``yarl`` cannot make an unambiguous decision on how to serialize ``bool`` values because
+it is specific to how the end-user's application is built and would be different for
+different apps. The library doesn't accept booleans in the API; a user should convert
+bools into strings using own preferred translation protocol.
+
+
+Comparison with other URL libraries
+------------------------------------
+
+* furl (https://pypi.python.org/pypi/furl)
+
+ The library has rich functionality but the ``furl`` object is mutable.
+
+ I'm afraid to pass this object into foreign code: who knows if the
+ code will modify my url in a terrible way while I just want to send URL
+ with handy helpers for accessing URL properties.
+
+ ``furl`` has other non-obvious tricky things but the main objection
+ is mutability.
+
+* URLObject (https://pypi.python.org/pypi/URLObject)
+
+ URLObject is immutable, that's pretty good.
+
+ Every URL change generates a new URL object.
+
+ But the library doesn't do any decode/encode transformations leaving the
+ end user to cope with these gory details.
+
+
+Source code
+-----------
+
+The project is hosted on GitHub_
+
+Please file an issue on the `bug tracker
+<https://github.com/aio-libs/yarl/issues>`_ if you have found a bug
+or have some suggestion in order to improve the library.
+
+The library uses `Azure Pipelines <https://dev.azure.com/aio-libs/yarl>`_ for
+Continuous Integration.
+
+Discussion list
+---------------
+
+*aio-libs* google group: https://groups.google.com/forum/#!forum/aio-libs
+
+Feel free to post your questions and ideas here.
+
+
+Authors and License
+-------------------
+
+The ``yarl`` package is written by Andrew Svetlov.
+
+It's *Apache 2* licensed and freely available.
+
+
+.. _GitHub: https://github.com/aio-libs/yarl
+
+.. _multidict: https://github.com/aio-libs/multidict
diff --git a/third_party/python/yarl/pyproject.toml b/third_party/python/yarl/pyproject.toml
new file mode 100644
index 0000000000..3cd69a29d5
--- /dev/null
+++ b/third_party/python/yarl/pyproject.toml
@@ -0,0 +1,7 @@
+[tool.towncrier]
+package = "yarl"
+filename = "CHANGES.rst"
+directory = "CHANGES/"
+title_format = "{version} ({project_date})"
+template = "CHANGES/.TEMPLATE.rst"
+issue_format = "`#{issue} <https://github.com/aio-libs/yarl/issues/{issue}>`_"
diff --git a/third_party/python/yarl/setup.cfg b/third_party/python/yarl/setup.cfg
new file mode 100644
index 0000000000..7515097649
--- /dev/null
+++ b/third_party/python/yarl/setup.cfg
@@ -0,0 +1,27 @@
+[metadata]
+license_file = LICENSE
+
+[tool:pytest]
+addopts = --cov=yarl -v
+filterwarnings = error
+norecursedirs = dist docs build .tox .eggs venv virtualenv .git
+minversion = 3.8.2
+testpaths = tests/
+junit_suite_name = yarl_test_suite
+
+[flake8]
+ignore = E203,E301,E302,E704,W503,W504,F811
+max-line-length = 88
+
+[mypy]
+
+[mypy-idna]
+ignore_missing_imports = true
+
+[mypy-pytest]
+ignore_missing_imports = true
+
+[egg_info]
+tag_build =
+tag_date = 0
+
diff --git a/third_party/python/yarl/setup.py b/third_party/python/yarl/setup.py
new file mode 100644
index 0000000000..d47cabcb9d
--- /dev/null
+++ b/third_party/python/yarl/setup.py
@@ -0,0 +1,83 @@
+import pathlib
+import os
+import sys
+import re
+
+from setuptools import setup, Extension
+
+
+if sys.version_info < (3, 5):
+ raise RuntimeError("yarl 1.4+ requires Python 3.5+")
+
+
+NO_EXTENSIONS = bool(os.environ.get("YARL_NO_EXTENSIONS")) # type: bool
+
+if sys.implementation.name != "cpython":
+ NO_EXTENSIONS = True
+
+
+extensions = [Extension("yarl._quoting_c", ["yarl/_quoting_c.c"])]
+# extra_compile_args=["-g"],
+# extra_link_args=["-g"],
+
+
+here = pathlib.Path(__file__).parent
+fname = here / "yarl" / "__init__.py"
+
+with fname.open(encoding="utf8") as fp:
+ try:
+ version = re.findall(r'^__version__ = "([^"]+)"$', fp.read(), re.M)[0]
+ except IndexError:
+ raise RuntimeError("Unable to determine version.")
+
+install_requires = [
+ "multidict>=4.0",
+ "idna>=2.0",
+ 'typing_extensions>=3.7.4;python_version<"3.8"',
+]
+
+
+def read(name):
+ fname = here / name
+ with fname.open(encoding="utf8") as f:
+ return f.read()
+
+
+args = dict(
+ name="yarl",
+ version=version,
+ description=("Yet another URL library"),
+ long_description="\n\n".join([read("README.rst"), read("CHANGES.rst")]),
+ long_description_content_type="text/x-rst",
+ classifiers=[
+ "License :: OSI Approved :: Apache Software License",
+ "Intended Audience :: Developers",
+ "Programming Language :: Python",
+ "Programming Language :: Python :: 3",
+ "Programming Language :: Python :: 3.6",
+ "Programming Language :: Python :: 3.7",
+ "Programming Language :: Python :: 3.8",
+ "Programming Language :: Python :: 3.9",
+ "Topic :: Internet :: WWW/HTTP",
+ ],
+ author="Andrew Svetlov",
+ author_email="andrew.svetlov@gmail.com",
+ url="https://github.com/aio-libs/yarl/",
+ license="Apache 2",
+ packages=["yarl"],
+ install_requires=install_requires,
+ python_requires=">=3.6",
+ include_package_data=True,
+)
+
+
+if not NO_EXTENSIONS:
+ print("**********************")
+ print("* Accellerated build *")
+ print("**********************")
+ setup(ext_modules=extensions, **args)
+else:
+ print("*********************")
+ print("* Pure Python build *")
+ print("*********************")
+ setup(**args)
diff --git a/third_party/python/yarl/yarl.egg-info/PKG-INFO b/third_party/python/yarl/yarl.egg-info/PKG-INFO
new file mode 100644
index 0000000000..3c242e5135
--- /dev/null
+++ b/third_party/python/yarl/yarl.egg-info/PKG-INFO
@@ -0,0 +1,797 @@
+Metadata-Version: 2.1
+Name: yarl
+Version: 1.6.3
+Summary: Yet another URL library
+Home-page: https://github.com/aio-libs/yarl/
+Author: Andrew Svetlov
+Author-email: andrew.svetlov@gmail.com
+License: Apache 2
+Description: yarl
+ ====
+
+ .. image:: https://github.com/aio-libs/yarl/workflows/CI/badge.svg
+ :target: https://github.com/aio-libs/yarl/actions?query=workflow%3ACI
+ :align: right
+
+ .. image:: https://codecov.io/gh/aio-libs/yarl/branch/master/graph/badge.svg
+ :target: https://codecov.io/gh/aio-libs/yarl
+
+ .. image:: https://badge.fury.io/py/yarl.svg
+ :target: https://badge.fury.io/py/yarl
+
+
+ .. image:: https://readthedocs.org/projects/yarl/badge/?version=latest
+ :target: https://yarl.readthedocs.io
+
+
+ .. image:: https://img.shields.io/pypi/pyversions/yarl.svg
+ :target: https://pypi.python.org/pypi/yarl
+
+ .. image:: https://badges.gitter.im/Join%20Chat.svg
+ :target: https://gitter.im/aio-libs/Lobby
+ :alt: Chat on Gitter
+
+ Introduction
+ ------------
+
+ Url is constructed from ``str``:
+
+ .. code-block:: pycon
+
+ >>> from yarl import URL
+ >>> url = URL('https://www.python.org/~guido?arg=1#frag')
+ >>> url
+ URL('https://www.python.org/~guido?arg=1#frag')
+
+ All url parts: *scheme*, *user*, *password*, *host*, *port*, *path*,
+ *query* and *fragment* are accessible by properties:
+
+ .. code-block:: pycon
+
+ >>> url.scheme
+ 'https'
+ >>> url.host
+ 'www.python.org'
+ >>> url.path
+ '/~guido'
+ >>> url.query_string
+ 'arg=1'
+ >>> url.query
+ <MultiDictProxy('arg': '1')>
+ >>> url.fragment
+ 'frag'
+
+ All url manipulations produce a new url object:
+
+ .. code-block:: pycon
+
+ >>> url = URL('https://www.python.org')
+ >>> url / 'foo' / 'bar'
+ URL('https://www.python.org/foo/bar')
+ >>> url / 'foo' % {'bar': 'baz'}
+ URL('https://www.python.org/foo?bar=baz')
+
+ Strings passed to constructor and modification methods are
+ automatically encoded giving canonical representation as result:
+
+ .. code-block:: pycon
+
+ >>> url = URL('https://www.python.org/путь')
+ >>> url
+ URL('https://www.python.org/%D0%BF%D1%83%D1%82%D1%8C')
+
+ Regular properties are *percent-decoded*, use ``raw_`` versions for
+ getting *encoded* strings:
+
+ .. code-block:: pycon
+
+ >>> url.path
+ '/путь'
+
+ >>> url.raw_path
+ '/%D0%BF%D1%83%D1%82%D1%8C'
+
+ Human readable representation of URL is available as ``.human_repr()``:
+
+ .. code-block:: pycon
+
+ >>> url.human_repr()
+ 'https://www.python.org/путь'
+
+ For full documentation please read https://yarl.readthedocs.org.
+
+
+ Installation
+ ------------
+
+ ::
+
+ $ pip install yarl
+
+ The library is Python 3 only!
+
+ PyPI contains binary wheels for Linux, Windows and MacOS. If you want to install
+ ``yarl`` on another operating system (like *Alpine Linux*, which is not
+ manylinux-compliant because of the missing glibc and therefore, cannot be
+ used with our wheels) the the tarball will be used to compile the library from
+ the source code. It requires a C compiler and and Python headers installed.
+
+ To skip the compilation you must explicitly opt-in by setting the `YARL_NO_EXTENSIONS`
+ environment variable to a non-empty value, e.g.:
+
+ .. code-block:: bash
+
+ $ YARL_NO_EXTENSIONS=1 pip install yarl
+
+ Please note that the pure-Python (uncompiled) version is much slower. However,
+ PyPy always uses a pure-Python implementation, and, as such, it is unaffected
+ by this variable.
+
+ Dependencies
+ ------------
+
+ YARL requires multidict_ library.
+
+
+ API documentation
+ ------------------
+
+ The documentation is located at https://yarl.readthedocs.org
+
+
+ Why isn't boolean supported by the URL query API?
+ -------------------------------------------------
+
+ There is no standard for boolean representation of boolean values.
+
+ Some systems prefer ``true``/``false``, others like ``yes``/``no``, ``on``/``off``,
+ ``Y``/``N``, ``1``/``0``, etc.
+
+ ``yarl`` cannot make an unambiguous decision on how to serialize ``bool`` values because
+ it is specific to how the end-user's application is built and would be different for
+ different apps. The library doesn't accept booleans in the API; a user should convert
+ bools into strings using own preferred translation protocol.
+
+
+ Comparison with other URL libraries
+ ------------------------------------
+
+ * furl (https://pypi.python.org/pypi/furl)
+
+ The library has rich functionality but the ``furl`` object is mutable.
+
+ I'm afraid to pass this object into foreign code: who knows if the
+ code will modify my url in a terrible way while I just want to send URL
+ with handy helpers for accessing URL properties.
+
+ ``furl`` has other non-obvious tricky things but the main objection
+ is mutability.
+
+ * URLObject (https://pypi.python.org/pypi/URLObject)
+
+ URLObject is immutable, that's pretty good.
+
+ Every URL change generates a new URL object.
+
+ But the library doesn't do any decode/encode transformations leaving the
+ end user to cope with these gory details.
+
+
+ Source code
+ -----------
+
+ The project is hosted on GitHub_
+
+ Please file an issue on the `bug tracker
+ <https://github.com/aio-libs/yarl/issues>`_ if you have found a bug
+ or have some suggestion in order to improve the library.
+
+ The library uses `Azure Pipelines <https://dev.azure.com/aio-libs/yarl>`_ for
+ Continuous Integration.
+
+ Discussion list
+ ---------------
+
+ *aio-libs* google group: https://groups.google.com/forum/#!forum/aio-libs
+
+ Feel free to post your questions and ideas here.
+
+
+ Authors and License
+ -------------------
+
+ The ``yarl`` package is written by Andrew Svetlov.
+
+ It's *Apache 2* licensed and freely available.
+
+
+ .. _GitHub: https://github.com/aio-libs/yarl
+
+ .. _multidict: https://github.com/aio-libs/multidict
+
+
+ =========
+ Changelog
+ =========
+
+ ..
+ You should *NOT* be adding new change log entries to this file, this
+ file is managed by towncrier. You *may* edit previous change logs to
+ fix problems like typo corrections or such.
+ To add a new change log entry, please see
+ https://pip.pypa.io/en/latest/development/#adding-a-news-entry
+ we named the news folder "changes".
+
+ WARNING: Don't drop the next directive!
+
+ .. towncrier release notes start
+
+ 1.6.3 (2020-11-14)
+ ==================
+
+ Bugfixes
+ --------
+
+ - No longer loose characters when decoding incorrect percent-sequences (like ``%e2%82%f8``). All non-decodable percent-sequences are now preserved.
+ `#517 <https://github.com/aio-libs/yarl/issues/517>`_
+ - Provide x86 Windows wheels.
+ `#535 <https://github.com/aio-libs/yarl/issues/535>`_
+
+
+ ----
+
+
+ 1.6.2 (2020-10-12)
+ ==================
+
+
+ Bugfixes
+ --------
+
+ - Provide generated ``.c`` files in TarBall distribution.
+ `#530 <https://github.com/aio-libs/multidict/issues/530>`_
+
+ 1.6.1 (2020-10-12)
+ ==================
+
+ Features
+ --------
+
+ - Provide wheels for ``aarch64``, ``i686``, ``ppc64le``, ``s390x`` architectures on
+ Linux as well as ``x86_64``.
+ `#507 <https://github.com/aio-libs/yarl/issues/507>`_
+ - Provide wheels for Python 3.9.
+ `#526 <https://github.com/aio-libs/yarl/issues/526>`_
+
+ Bugfixes
+ --------
+
+ - ``human_repr()`` now always produces valid representation equivalent to the original URL (if the original URL is valid).
+ `#511 <https://github.com/aio-libs/yarl/issues/511>`_
+ - Fixed requoting a single percent followed by a percent-encoded character in the Cython implementation.
+ `#514 <https://github.com/aio-libs/yarl/issues/514>`_
+ - Fix ValueError when decoding ``%`` which is not followed by two hexadecimal digits.
+ `#516 <https://github.com/aio-libs/yarl/issues/516>`_
+ - Fix decoding ``%`` followed by a space and hexadecimal digit.
+ `#520 <https://github.com/aio-libs/yarl/issues/520>`_
+ - Fix annotation of ``with_query()``/``update_query()`` methods for ``key=[val1, val2]`` case.
+ `#528 <https://github.com/aio-libs/yarl/issues/528>`_
+
+ Removal
+ -------
+
+ - Drop Python 3.5 support; Python 3.6 is the minimal supported Python version.
+
+
+ ----
+
+
+ 1.6.0 (2020-09-23)
+ ==================
+
+ Features
+ --------
+
+ - Allow for int and float subclasses in query, while still denying bool.
+ `#492 <https://github.com/aio-libs/yarl/issues/492>`_
+
+
+ Bugfixes
+ --------
+
+ - Do not requote arguments in ``URL.build()``, ``with_xxx()`` and in ``/`` operator.
+ `#502 <https://github.com/aio-libs/yarl/issues/502>`_
+ - Keep IPv6 brackets in ``origin()``.
+ `#504 <https://github.com/aio-libs/yarl/issues/504>`_
+
+
+ ----
+
+
+ 1.5.1 (2020-08-01)
+ ==================
+
+ Bugfixes
+ --------
+
+ - Fix including relocated internal ``yarl._quoting_c`` C-extension into published PyPI dists.
+ `#485 <https://github.com/aio-libs/yarl/issues/485>`_
+
+
+ Misc
+ ----
+
+ - `#484 <https://github.com/aio-libs/yarl/issues/484>`_
+
+
+ ----
+
+
+ 1.5.0 (2020-07-26)
+ ==================
+
+ Features
+ --------
+
+ - Convert host to lowercase on URL building.
+ `#386 <https://github.com/aio-libs/yarl/issues/386>`_
+ - Allow using ``mod`` operator (`%`) for updating query string (an alias for ``update_query()`` method).
+ `#435 <https://github.com/aio-libs/yarl/issues/435>`_
+ - Allow use of sequences such as ``list`` and ``tuple`` in the values
+ of a mapping such as ``dict`` to represent that a key has many values::
+
+ url = URL("http://example.com")
+ assert url.with_query({"a": [1, 2]}) == URL("http://example.com/?a=1&a=2")
+
+ `#443 <https://github.com/aio-libs/yarl/issues/443>`_
+ - Support URL.build() with scheme and path (creates a relative URL).
+ `#464 <https://github.com/aio-libs/yarl/issues/464>`_
+ - Cache slow IDNA encode/decode calls.
+ `#476 <https://github.com/aio-libs/yarl/issues/476>`_
+ - Add ``@final`` / ``Final`` type hints
+ `#477 <https://github.com/aio-libs/yarl/issues/477>`_
+ - Support URL authority/raw_authority properties and authority argument of ``URL.build()`` method.
+ `#478 <https://github.com/aio-libs/yarl/issues/478>`_
+ - Hide the library implementation details, make the exposed public list very clean.
+ `#483 <https://github.com/aio-libs/yarl/issues/483>`_
+
+
+ Bugfixes
+ --------
+
+ - Fix tests with newer Python (3.7.6, 3.8.1 and 3.9.0+).
+ `#409 <https://github.com/aio-libs/yarl/issues/409>`_
+ - Fix a bug where query component, passed in a form of mapping or sequence, is unquoted in unexpected way.
+ `#426 <https://github.com/aio-libs/yarl/issues/426>`_
+ - Hide `Query` and `QueryVariable` type aliases in `__init__.pyi`, now they are prefixed with underscore.
+ `#431 <https://github.com/aio-libs/yarl/issues/431>`_
+ - Keep ipv6 brackets after updating port/user/password.
+ `#451 <https://github.com/aio-libs/yarl/issues/451>`_
+
+
+ ----
+
+
+ 1.4.2 (2019-12-05)
+ ==================
+
+ Features
+ --------
+
+ - Workaround for missing `str.isascii()` in Python 3.6
+ `#389 <https://github.com/aio-libs/yarl/issues/389>`_
+
+
+ ----
+
+
+ 1.4.1 (2019-11-29)
+ ==================
+
+ * Fix regression, make the library work on Python 3.5 and 3.6 again.
+
+ 1.4.0 (2019-11-29)
+ ==================
+
+ * Distinguish an empty password in URL from a password not provided at all (#262)
+
+ * Fixed annotations for optional parameters of ``URL.build`` (#309)
+
+ * Use None as default value of ``user`` parameter of ``URL.build`` (#309)
+
+ * Enforce building C Accelerated modules when installing from source tarball, use
+ ``YARL_NO_EXTENSIONS`` environment variable for falling back to (slower) Pure Python
+ implementation (#329)
+
+ * Drop Python 3.5 support
+
+ * Fix quoting of plus in path by pure python version (#339)
+
+ * Don't create a new URL if fragment is unchanged (#292)
+
+ * Included in error msg the path that produces starting slash forbidden error (#376)
+
+ * Skip slow IDNA encoding for ASCII-only strings (#387)
+
+
+ 1.3.0 (2018-12-11)
+ ==================
+
+ * Fix annotations for ``query`` parameter (#207)
+
+ * An incoming query sequence can have int variables (the same as for
+ Mapping type) (#208)
+
+ * Add ``URL.explicit_port`` property (#218)
+
+ * Give a friendlier error when port cant be converted to int (#168)
+
+ * ``bool(URL())`` now returns ``False`` (#272)
+
+ 1.2.6 (2018-06-14)
+ ==================
+
+ * Drop Python 3.4 trove classifier (#205)
+
+ 1.2.5 (2018-05-23)
+ ==================
+
+ * Fix annotations for ``build`` (#199)
+
+ 1.2.4 (2018-05-08)
+ ==================
+
+ * Fix annotations for ``cached_property`` (#195)
+
+ 1.2.3 (2018-05-03)
+ ==================
+
+ * Accept ``str`` subclasses in ``URL`` constructor (#190)
+
+ 1.2.2 (2018-05-01)
+ ==================
+
+ * Fix build
+
+ 1.2.1 (2018-04-30)
+ ==================
+
+ * Pin minimal required Python to 3.5.3 (#189)
+
+ 1.2.0 (2018-04-30)
+ ==================
+
+ * Forbid inheritance, replace ``__init__`` with ``__new__`` (#171)
+
+ * Support PEP-561 (provide type hinting marker) (#182)
+
+ 1.1.1 (2018-02-17)
+ ==================
+
+ * Fix performance regression: don't encode enmpty netloc (#170)
+
+ 1.1.0 (2018-01-21)
+ ==================
+
+ * Make pure Python quoter consistent with Cython version (#162)
+
+ 1.0.0 (2018-01-15)
+ ==================
+
+ * Use fast path if quoted string does not need requoting (#154)
+
+ * Speed up quoting/unquoting by ``_Quoter`` and ``_Unquoter`` classes (#155)
+
+ * Drop ``yarl.quote`` and ``yarl.unquote`` public functions (#155)
+
+ * Add custom string writer, reuse static buffer if available (#157)
+ Code is 50-80 times faster than Pure Python version (was 4-5 times faster)
+
+ * Don't recode IP zone (#144)
+
+ * Support ``encoded=True`` in ``yarl.URL.build()`` (#158)
+
+ * Fix updating query with multiple keys (#160)
+
+ 0.18.0 (2018-01-10)
+ ===================
+
+ * Fallback to IDNA 2003 if domain name is not IDNA 2008 compatible (#152)
+
+ 0.17.0 (2017-12-30)
+ ===================
+
+ * Use IDNA 2008 for domain name processing (#149)
+
+ 0.16.0 (2017-12-07)
+ ===================
+
+ * Fix raising ``TypeError`` by ``url.query_string()`` after
+ ``url.with_query({})`` (empty mapping) (#141)
+
+ 0.15.0 (2017-11-23)
+ ===================
+
+ * Add ``raw_path_qs`` attribute (#137)
+
+ 0.14.2 (2017-11-14)
+ ===================
+
+ * Restore ``strict`` parameter as no-op in ``quote`` / ``unquote``
+
+ 0.14.1 (2017-11-13)
+ ===================
+
+ * Restore ``strict`` parameter as no-op for sake of compatibility with
+ aiohttp 2.2
+
+ 0.14.0 (2017-11-11)
+ ===================
+
+ * Drop strict mode (#123)
+
+ * Fix ``"ValueError: Unallowed PCT %"`` when there's a ``"%"`` in the url (#124)
+
+ 0.13.0 (2017-10-01)
+ ===================
+
+ * Document ``encoded`` parameter (#102)
+
+ * Support relative urls like ``'?key=value'`` (#100)
+
+ * Unsafe encoding for QS fixed. Encode ``;`` char in value param (#104)
+
+ * Process passwords without user names (#95)
+
+ 0.12.0 (2017-06-26)
+ ===================
+
+ * Properly support paths without leading slash in ``URL.with_path()`` (#90)
+
+ * Enable type annotation checks
+
+ 0.11.0 (2017-06-26)
+ ===================
+
+ * Normalize path (#86)
+
+ * Clear query and fragment parts in ``.with_path()`` (#85)
+
+ 0.10.3 (2017-06-13)
+ ===================
+
+ * Prevent double URL args unquoting (#83)
+
+ 0.10.2 (2017-05-05)
+ ===================
+
+ * Unexpected hash behaviour (#75)
+
+
+ 0.10.1 (2017-05-03)
+ ===================
+
+ * Unexpected compare behaviour (#73)
+
+ * Do not quote or unquote + if not a query string. (#74)
+
+
+ 0.10.0 (2017-03-14)
+ ===================
+
+ * Added ``URL.build`` class method (#58)
+
+ * Added ``path_qs`` attribute (#42)
+
+
+ 0.9.8 (2017-02-16)
+ ==================
+
+ * Do not quote ``:`` in path
+
+
+ 0.9.7 (2017-02-16)
+ ==================
+
+ * Load from pickle without _cache (#56)
+
+ * Percent-encoded pluses in path variables become spaces (#59)
+
+
+ 0.9.6 (2017-02-15)
+ ==================
+
+ * Revert backward incompatible change (BaseURL)
+
+
+ 0.9.5 (2017-02-14)
+ ==================
+
+ * Fix BaseURL rich comparison support
+
+
+ 0.9.4 (2017-02-14)
+ ==================
+
+ * Use BaseURL
+
+
+ 0.9.3 (2017-02-14)
+ ==================
+
+ * Added BaseURL
+
+
+ 0.9.2 (2017-02-08)
+ ==================
+
+ * Remove debug print
+
+
+ 0.9.1 (2017-02-07)
+ ==================
+
+ * Do not lose tail chars (#45)
+
+
+ 0.9.0 (2017-02-07)
+ ==================
+
+ * Allow to quote ``%`` in non strict mode (#21)
+
+ * Incorrect parsing of query parameters with %3B (;) inside (#34)
+
+ * Fix core dumps (#41)
+
+ * tmpbuf - compiling error (#43)
+
+ * Added ``URL.update_path()`` method
+
+ * Added ``URL.update_query()`` method (#47)
+
+
+ 0.8.1 (2016-12-03)
+ ==================
+
+ * Fix broken aiohttp: revert back ``quote`` / ``unquote``.
+
+
+ 0.8.0 (2016-12-03)
+ ==================
+
+ * Support more verbose error messages in ``.with_query()`` (#24)
+
+ * Don't percent-encode ``@`` and ``:`` in path (#32)
+
+ * Don't expose ``yarl.quote`` and ``yarl.unquote``, these functions are
+ part of private API
+
+ 0.7.1 (2016-11-18)
+ ==================
+
+ * Accept not only ``str`` but all classes inherited from ``str`` also (#25)
+
+ 0.7.0 (2016-11-07)
+ ==================
+
+ * Accept ``int`` as value for ``.with_query()``
+
+ 0.6.0 (2016-11-07)
+ ==================
+
+ * Explicitly use UTF8 encoding in setup.py (#20)
+ * Properly unquote non-UTF8 strings (#19)
+
+ 0.5.3 (2016-11-02)
+ ==================
+
+ * Don't use namedtuple fields but indexes on URL construction
+
+ 0.5.2 (2016-11-02)
+ ==================
+
+ * Inline ``_encode`` class method
+
+ 0.5.1 (2016-11-02)
+ ==================
+
+ * Make URL construction faster by removing extra classmethod calls
+
+ 0.5.0 (2016-11-02)
+ ==================
+
+ * Add cython optimization for quoting/unquoting
+ * Provide binary wheels
+
+ 0.4.3 (2016-09-29)
+ ==================
+
+ * Fix typing stubs
+
+ 0.4.2 (2016-09-29)
+ ==================
+
+ * Expose ``quote()`` and ``unquote()`` as public API
+
+ 0.4.1 (2016-09-28)
+ ==================
+
+ * Support empty values in query (``'/path?arg'``)
+
+ 0.4.0 (2016-09-27)
+ ==================
+
+ * Introduce ``relative()`` (#16)
+
+ 0.3.2 (2016-09-27)
+ ==================
+
+ * Typo fixes #15
+
+ 0.3.1 (2016-09-26)
+ ==================
+
+ * Support sequence of pairs as ``with_query()`` parameter
+
+ 0.3.0 (2016-09-26)
+ ==================
+
+ * Introduce ``is_default_port()``
+
+ 0.2.1 (2016-09-26)
+ ==================
+
+ * Raise ValueError for URLs like 'http://:8080/'
+
+ 0.2.0 (2016-09-18)
+ ==================
+
+ * Avoid doubling slashes when joining paths (#13)
+
+ * Appending path starting from slash is forbidden (#12)
+
+ 0.1.4 (2016-09-09)
+ ==================
+
+ * Add kwargs support for ``with_query()`` (#10)
+
+ 0.1.3 (2016-09-07)
+ ==================
+
+ * Document ``with_query()``, ``with_fragment()`` and ``origin()``
+
+ * Allow ``None`` for ``with_query()`` and ``with_fragment()``
+
+ 0.1.2 (2016-09-07)
+ ==================
+
+ * Fix links, tune docs theme.
+
+ 0.1.1 (2016-09-06)
+ ==================
+
+ * Update README, old version used obsolete API
+
+ 0.1.0 (2016-09-06)
+ ==================
+
+ * The library was deeply refactored, bytes are gone away but all
+ accepted strings are encoded if needed.
+
+ 0.0.1 (2016-08-30)
+ ==================
+
+ * The first release.
+
+Platform: UNKNOWN
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Intended Audience :: Developers
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Topic :: Internet :: WWW/HTTP
+Requires-Python: >=3.6
+Description-Content-Type: text/x-rst
diff --git a/third_party/python/yarl/yarl.egg-info/SOURCES.txt b/third_party/python/yarl/yarl.egg-info/SOURCES.txt
new file mode 100644
index 0000000000..383d95918b
--- /dev/null
+++ b/third_party/python/yarl/yarl.egg-info/SOURCES.txt
@@ -0,0 +1,42 @@
+CHANGES.rst
+LICENSE
+MANIFEST.in
+README.rst
+pyproject.toml
+setup.cfg
+setup.py
+docs/Makefile
+docs/api.rst
+docs/conf.py
+docs/index.rst
+docs/make.bat
+docs/spelling_wordlist.txt
+docs/yarl-icon-128x128.xcf
+docs/_static/yarl-icon-128x128.png
+docs/_templates/about.html
+tests/test_cache.py
+tests/test_cached_property.py
+tests/test_normalize_path.py
+tests/test_pickle.py
+tests/test_quoting.py
+tests/test_update_query.py
+tests/test_url.py
+tests/test_url_build.py
+tests/test_url_cmp_and_hash.py
+tests/test_url_parsing.py
+tests/test_url_query.py
+tests/test_url_update_netloc.py
+yarl/__init__.py
+yarl/__init__.pyi
+yarl/_quoting.py
+yarl/_quoting_c.c
+yarl/_quoting_c.pyi
+yarl/_quoting_c.pyx
+yarl/_quoting_py.py
+yarl/_url.py
+yarl/py.typed
+yarl.egg-info/PKG-INFO
+yarl.egg-info/SOURCES.txt
+yarl.egg-info/dependency_links.txt
+yarl.egg-info/requires.txt
+yarl.egg-info/top_level.txt \ No newline at end of file
diff --git a/third_party/python/yarl/yarl.egg-info/dependency_links.txt b/third_party/python/yarl/yarl.egg-info/dependency_links.txt
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/third_party/python/yarl/yarl.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/third_party/python/yarl/yarl.egg-info/requires.txt b/third_party/python/yarl/yarl.egg-info/requires.txt
new file mode 100644
index 0000000000..bb40947df6
--- /dev/null
+++ b/third_party/python/yarl/yarl.egg-info/requires.txt
@@ -0,0 +1,5 @@
+multidict>=4.0
+idna>=2.0
+
+[:python_version < "3.8"]
+typing_extensions>=3.7.4
diff --git a/third_party/python/yarl/yarl.egg-info/top_level.txt b/third_party/python/yarl/yarl.egg-info/top_level.txt
new file mode 100644
index 0000000000..e93e8bddef
--- /dev/null
+++ b/third_party/python/yarl/yarl.egg-info/top_level.txt
@@ -0,0 +1 @@
+yarl
diff --git a/third_party/python/yarl/yarl/__init__.py b/third_party/python/yarl/yarl/__init__.py
new file mode 100644
index 0000000000..db4e94817a
--- /dev/null
+++ b/third_party/python/yarl/yarl/__init__.py
@@ -0,0 +1,5 @@
+from ._url import URL, cache_clear, cache_configure, cache_info
+
+__version__ = "1.6.3"
+
+__all__ = ("URL", "cache_clear", "cache_configure", "cache_info")
diff --git a/third_party/python/yarl/yarl/__init__.pyi b/third_party/python/yarl/yarl/__init__.pyi
new file mode 100644
index 0000000000..a8d8fbda48
--- /dev/null
+++ b/third_party/python/yarl/yarl/__init__.pyi
@@ -0,0 +1,111 @@
+from typing import overload, Any, Tuple, Optional, Mapping, Union, Sequence, Type
+import multidict
+from functools import _CacheInfo
+import sys
+
+if sys.version_info >= (3, 8):
+ from typing import TypedDict, Final, final
+else:
+ from typing_extensions import TypedDict, Final, final
+
+_SimpleQuery = Union[str, int, float]
+_QueryVariable = Union[_SimpleQuery, Sequence[_SimpleQuery]]
+_Query = Union[
+ None, str, Mapping[str, _QueryVariable], Sequence[Tuple[str, _QueryVariable]]
+]
+@final
+class URL:
+ scheme: Final[str]
+ raw_user: Final[str]
+ user: Final[Optional[str]]
+ raw_password: Final[Optional[str]]
+ password: Final[Optional[str]]
+ raw_host: Final[Optional[str]]
+ host: Final[Optional[str]]
+ port: Final[Optional[int]]
+ raw_authority: Final[str]
+ authority: Final[str]
+ raw_path: Final[str]
+ path: Final[str]
+ raw_query_string: Final[str]
+ query_string: Final[str]
+ path_qs: Final[str]
+ raw_path_qs: Final[str]
+ raw_fragment: Final[str]
+ fragment: Final[str]
+ query: Final[multidict.MultiDict[str]]
+ raw_name: Final[str]
+ name: Final[str]
+ raw_parts: Final[Tuple[str, ...]]
+ parts: Final[Tuple[str, ...]]
+ parent: Final[URL]
+ def __init__(
+ self, val: Union[str, "URL"] = ..., *, encoded: bool = ...
+ ) -> None: ...
+ @classmethod
+ def build(
+ cls,
+ *,
+ scheme: str = ...,
+ authority: str = ...,
+ user: Optional[str] = ...,
+ password: Optional[str] = ...,
+ host: str = ...,
+ port: Optional[int] = ...,
+ path: str = ...,
+ query: Optional[_Query] = ...,
+ query_string: str = ...,
+ fragment: str = ...,
+ encoded: bool = ...
+ ) -> URL: ...
+ def __str__(self) -> str: ...
+ def __repr__(self) -> str: ...
+ def __eq__(self, other: Any) -> bool: ...
+ def __le__(self, other: Any) -> bool: ...
+ def __lt__(self, other: Any) -> bool: ...
+ def __ge__(self, other: Any) -> bool: ...
+ def __gt__(self, other: Any) -> bool: ...
+ def __hash__(self) -> int: ...
+ def __truediv__(self, name: str) -> URL: ...
+ def __mod__(self, query: _Query) -> URL: ...
+ def is_absolute(self) -> bool: ...
+ def is_default_port(self) -> bool: ...
+ def origin(self) -> URL: ...
+ def relative(self) -> URL: ...
+ def with_scheme(self, scheme: str) -> URL: ...
+ def with_user(self, user: Optional[str]) -> URL: ...
+ def with_password(self, password: Optional[str]) -> URL: ...
+ def with_host(self, host: str) -> URL: ...
+ def with_port(self, port: Optional[int]) -> URL: ...
+ def with_path(self, path: str, *, encoded: bool = ...) -> URL: ...
+ @overload
+ def with_query(self, query: _Query) -> URL: ...
+ @overload
+ def with_query(self, **kwargs: _QueryVariable) -> URL: ...
+ @overload
+ def update_query(self, query: _Query) -> URL: ...
+ @overload
+ def update_query(self, **kwargs: _QueryVariable) -> URL: ...
+ def with_fragment(self, fragment: Optional[str]) -> URL: ...
+ def with_name(self, name: str) -> URL: ...
+ def join(self, url: URL) -> URL: ...
+ def human_repr(self) -> str: ...
+ # private API
+ @classmethod
+ def _normalize_path(cls, path: str) -> str: ...
+
+@final
+class cached_property:
+ def __init__(self, wrapped: Any) -> None: ...
+ def __get__(self, inst: URL, owner: Type[URL]) -> Any: ...
+ def __set__(self, inst: URL, value: Any) -> None: ...
+
+class CacheInfo(TypedDict):
+ idna_encode: _CacheInfo
+ idna_decode: _CacheInfo
+
+def cache_clear() -> None: ...
+def cache_info() -> CacheInfo: ...
+def cache_configure(
+ *, idna_encode_size: Optional[int] = ..., idna_decode_size: Optional[int] = ...
+) -> None: ...
diff --git a/third_party/python/yarl/yarl/_quoting.py b/third_party/python/yarl/yarl/_quoting.py
new file mode 100644
index 0000000000..46e100a9ee
--- /dev/null
+++ b/third_party/python/yarl/yarl/_quoting.py
@@ -0,0 +1,18 @@
+import os
+import sys
+
+__all__ = ("_Quoter", "_Unquoter")
+
+
+NO_EXTENSIONS = bool(os.environ.get("YARL_NO_EXTENSIONS")) # type: bool
+if sys.implementation.name != "cpython":
+ NO_EXTENSIONS = True
+
+
+if not NO_EXTENSIONS: # pragma: no branch
+ try:
+ from ._quoting_c import _Quoter, _Unquoter # type: ignore[misc]
+ except ImportError: # pragma: no cover
+ from ._quoting_py import _Quoter, _Unquoter # type: ignore[misc]
+else:
+ from ._quoting_py import _Quoter, _Unquoter # type: ignore[misc]
diff --git a/third_party/python/yarl/yarl/_quoting_c.c b/third_party/python/yarl/yarl/_quoting_c.c
new file mode 100644
index 0000000000..cdb46f71de
--- /dev/null
+++ b/third_party/python/yarl/yarl/_quoting_c.c
@@ -0,0 +1,11612 @@
+/* Generated by Cython 0.29.21 */
+
+#define PY_SSIZE_T_CLEAN
+#include "Python.h"
+#ifndef Py_PYTHON_H
+ #error Python headers needed to compile C extensions, please install development version of Python.
+#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000)
+ #error Cython requires Python 2.6+ or Python 3.3+.
+#else
+#define CYTHON_ABI "0_29_21"
+#define CYTHON_HEX_VERSION 0x001D15F0
+#define CYTHON_FUTURE_DIVISION 1
+#include <stddef.h>
+#ifndef offsetof
+ #define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
+#endif
+#if !defined(WIN32) && !defined(MS_WINDOWS)
+ #ifndef __stdcall
+ #define __stdcall
+ #endif
+ #ifndef __cdecl
+ #define __cdecl
+ #endif
+ #ifndef __fastcall
+ #define __fastcall
+ #endif
+#endif
+#ifndef DL_IMPORT
+ #define DL_IMPORT(t) t
+#endif
+#ifndef DL_EXPORT
+ #define DL_EXPORT(t) t
+#endif
+#define __PYX_COMMA ,
+#ifndef HAVE_LONG_LONG
+ #if PY_VERSION_HEX >= 0x02070000
+ #define HAVE_LONG_LONG
+ #endif
+#endif
+#ifndef PY_LONG_LONG
+ #define PY_LONG_LONG LONG_LONG
+#endif
+#ifndef Py_HUGE_VAL
+ #define Py_HUGE_VAL HUGE_VAL
+#endif
+#ifdef PYPY_VERSION
+ #define CYTHON_COMPILING_IN_PYPY 1
+ #define CYTHON_COMPILING_IN_PYSTON 0
+ #define CYTHON_COMPILING_IN_CPYTHON 0
+ #undef CYTHON_USE_TYPE_SLOTS
+ #define CYTHON_USE_TYPE_SLOTS 0
+ #undef CYTHON_USE_PYTYPE_LOOKUP
+ #define CYTHON_USE_PYTYPE_LOOKUP 0
+ #if PY_VERSION_HEX < 0x03050000
+ #undef CYTHON_USE_ASYNC_SLOTS
+ #define CYTHON_USE_ASYNC_SLOTS 0
+ #elif !defined(CYTHON_USE_ASYNC_SLOTS)
+ #define CYTHON_USE_ASYNC_SLOTS 1
+ #endif
+ #undef CYTHON_USE_PYLIST_INTERNALS
+ #define CYTHON_USE_PYLIST_INTERNALS 0
+ #undef CYTHON_USE_UNICODE_INTERNALS
+ #define CYTHON_USE_UNICODE_INTERNALS 0
+ #undef CYTHON_USE_UNICODE_WRITER
+ #define CYTHON_USE_UNICODE_WRITER 0
+ #undef CYTHON_USE_PYLONG_INTERNALS
+ #define CYTHON_USE_PYLONG_INTERNALS 0
+ #undef CYTHON_AVOID_BORROWED_REFS
+ #define CYTHON_AVOID_BORROWED_REFS 1
+ #undef CYTHON_ASSUME_SAFE_MACROS
+ #define CYTHON_ASSUME_SAFE_MACROS 0
+ #undef CYTHON_UNPACK_METHODS
+ #define CYTHON_UNPACK_METHODS 0
+ #undef CYTHON_FAST_THREAD_STATE
+ #define CYTHON_FAST_THREAD_STATE 0
+ #undef CYTHON_FAST_PYCALL
+ #define CYTHON_FAST_PYCALL 0
+ #undef CYTHON_PEP489_MULTI_PHASE_INIT
+ #define CYTHON_PEP489_MULTI_PHASE_INIT 0
+ #undef CYTHON_USE_TP_FINALIZE
+ #define CYTHON_USE_TP_FINALIZE 0
+ #undef CYTHON_USE_DICT_VERSIONS
+ #define CYTHON_USE_DICT_VERSIONS 0
+ #undef CYTHON_USE_EXC_INFO_STACK
+ #define CYTHON_USE_EXC_INFO_STACK 0
+#elif defined(PYSTON_VERSION)
+ #define CYTHON_COMPILING_IN_PYPY 0
+ #define CYTHON_COMPILING_IN_PYSTON 1
+ #define CYTHON_COMPILING_IN_CPYTHON 0
+ #ifndef CYTHON_USE_TYPE_SLOTS
+ #define CYTHON_USE_TYPE_SLOTS 1
+ #endif
+ #undef CYTHON_USE_PYTYPE_LOOKUP
+ #define CYTHON_USE_PYTYPE_LOOKUP 0
+ #undef CYTHON_USE_ASYNC_SLOTS
+ #define CYTHON_USE_ASYNC_SLOTS 0
+ #undef CYTHON_USE_PYLIST_INTERNALS
+ #define CYTHON_USE_PYLIST_INTERNALS 0
+ #ifndef CYTHON_USE_UNICODE_INTERNALS
+ #define CYTHON_USE_UNICODE_INTERNALS 1
+ #endif
+ #undef CYTHON_USE_UNICODE_WRITER
+ #define CYTHON_USE_UNICODE_WRITER 0
+ #undef CYTHON_USE_PYLONG_INTERNALS
+ #define CYTHON_USE_PYLONG_INTERNALS 0
+ #ifndef CYTHON_AVOID_BORROWED_REFS
+ #define CYTHON_AVOID_BORROWED_REFS 0
+ #endif
+ #ifndef CYTHON_ASSUME_SAFE_MACROS
+ #define CYTHON_ASSUME_SAFE_MACROS 1
+ #endif
+ #ifndef CYTHON_UNPACK_METHODS
+ #define CYTHON_UNPACK_METHODS 1
+ #endif
+ #undef CYTHON_FAST_THREAD_STATE
+ #define CYTHON_FAST_THREAD_STATE 0
+ #undef CYTHON_FAST_PYCALL
+ #define CYTHON_FAST_PYCALL 0
+ #undef CYTHON_PEP489_MULTI_PHASE_INIT
+ #define CYTHON_PEP489_MULTI_PHASE_INIT 0
+ #undef CYTHON_USE_TP_FINALIZE
+ #define CYTHON_USE_TP_FINALIZE 0
+ #undef CYTHON_USE_DICT_VERSIONS
+ #define CYTHON_USE_DICT_VERSIONS 0
+ #undef CYTHON_USE_EXC_INFO_STACK
+ #define CYTHON_USE_EXC_INFO_STACK 0
+#else
+ #define CYTHON_COMPILING_IN_PYPY 0
+ #define CYTHON_COMPILING_IN_PYSTON 0
+ #define CYTHON_COMPILING_IN_CPYTHON 1
+ #ifndef CYTHON_USE_TYPE_SLOTS
+ #define CYTHON_USE_TYPE_SLOTS 1
+ #endif
+ #if PY_VERSION_HEX < 0x02070000
+ #undef CYTHON_USE_PYTYPE_LOOKUP
+ #define CYTHON_USE_PYTYPE_LOOKUP 0
+ #elif !defined(CYTHON_USE_PYTYPE_LOOKUP)
+ #define CYTHON_USE_PYTYPE_LOOKUP 1
+ #endif
+ #if PY_MAJOR_VERSION < 3
+ #undef CYTHON_USE_ASYNC_SLOTS
+ #define CYTHON_USE_ASYNC_SLOTS 0
+ #elif !defined(CYTHON_USE_ASYNC_SLOTS)
+ #define CYTHON_USE_ASYNC_SLOTS 1
+ #endif
+ #if PY_VERSION_HEX < 0x02070000
+ #undef CYTHON_USE_PYLONG_INTERNALS
+ #define CYTHON_USE_PYLONG_INTERNALS 0
+ #elif !defined(CYTHON_USE_PYLONG_INTERNALS)
+ #define CYTHON_USE_PYLONG_INTERNALS 1
+ #endif
+ #ifndef CYTHON_USE_PYLIST_INTERNALS
+ #define CYTHON_USE_PYLIST_INTERNALS 1
+ #endif
+ #ifndef CYTHON_USE_UNICODE_INTERNALS
+ #define CYTHON_USE_UNICODE_INTERNALS 1
+ #endif
+ #if PY_VERSION_HEX < 0x030300F0
+ #undef CYTHON_USE_UNICODE_WRITER
+ #define CYTHON_USE_UNICODE_WRITER 0
+ #elif !defined(CYTHON_USE_UNICODE_WRITER)
+ #define CYTHON_USE_UNICODE_WRITER 1
+ #endif
+ #ifndef CYTHON_AVOID_BORROWED_REFS
+ #define CYTHON_AVOID_BORROWED_REFS 0
+ #endif
+ #ifndef CYTHON_ASSUME_SAFE_MACROS
+ #define CYTHON_ASSUME_SAFE_MACROS 1
+ #endif
+ #ifndef CYTHON_UNPACK_METHODS
+ #define CYTHON_UNPACK_METHODS 1
+ #endif
+ #ifndef CYTHON_FAST_THREAD_STATE
+ #define CYTHON_FAST_THREAD_STATE 1
+ #endif
+ #ifndef CYTHON_FAST_PYCALL
+ #define CYTHON_FAST_PYCALL 1
+ #endif
+ #ifndef CYTHON_PEP489_MULTI_PHASE_INIT
+ #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000)
+ #endif
+ #ifndef CYTHON_USE_TP_FINALIZE
+ #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1)
+ #endif
+ #ifndef CYTHON_USE_DICT_VERSIONS
+ #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1)
+ #endif
+ #ifndef CYTHON_USE_EXC_INFO_STACK
+ #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3)
+ #endif
+#endif
+#if !defined(CYTHON_FAST_PYCCALL)
+#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1)
+#endif
+#if CYTHON_USE_PYLONG_INTERNALS
+ #include "longintrepr.h"
+ #undef SHIFT
+ #undef BASE
+ #undef MASK
+ #ifdef SIZEOF_VOID_P
+ enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) };
+ #endif
+#endif
+#ifndef __has_attribute
+ #define __has_attribute(x) 0
+#endif
+#ifndef __has_cpp_attribute
+ #define __has_cpp_attribute(x) 0
+#endif
+#ifndef CYTHON_RESTRICT
+ #if defined(__GNUC__)
+ #define CYTHON_RESTRICT __restrict__
+ #elif defined(_MSC_VER) && _MSC_VER >= 1400
+ #define CYTHON_RESTRICT __restrict
+ #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+ #define CYTHON_RESTRICT restrict
+ #else
+ #define CYTHON_RESTRICT
+ #endif
+#endif
+#ifndef CYTHON_UNUSED
+# if defined(__GNUC__)
+# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
+# define CYTHON_UNUSED __attribute__ ((__unused__))
+# else
+# define CYTHON_UNUSED
+# endif
+# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER))
+# define CYTHON_UNUSED __attribute__ ((__unused__))
+# else
+# define CYTHON_UNUSED
+# endif
+#endif
+#ifndef CYTHON_MAYBE_UNUSED_VAR
+# if defined(__cplusplus)
+ template<class T> void CYTHON_MAYBE_UNUSED_VAR( const T& ) { }
+# else
+# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x)
+# endif
+#endif
+#ifndef CYTHON_NCP_UNUSED
+# if CYTHON_COMPILING_IN_CPYTHON
+# define CYTHON_NCP_UNUSED
+# else
+# define CYTHON_NCP_UNUSED CYTHON_UNUSED
+# endif
+#endif
+#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None)
+#ifdef _MSC_VER
+ #ifndef _MSC_STDINT_H_
+ #if _MSC_VER < 1300
+ typedef unsigned char uint8_t;
+ typedef unsigned int uint32_t;
+ #else
+ typedef unsigned __int8 uint8_t;
+ typedef unsigned __int32 uint32_t;
+ #endif
+ #endif
+#else
+ #include <stdint.h>
+#endif
+#ifndef CYTHON_FALLTHROUGH
+ #if defined(__cplusplus) && __cplusplus >= 201103L
+ #if __has_cpp_attribute(fallthrough)
+ #define CYTHON_FALLTHROUGH [[fallthrough]]
+ #elif __has_cpp_attribute(clang::fallthrough)
+ #define CYTHON_FALLTHROUGH [[clang::fallthrough]]
+ #elif __has_cpp_attribute(gnu::fallthrough)
+ #define CYTHON_FALLTHROUGH [[gnu::fallthrough]]
+ #endif
+ #endif
+ #ifndef CYTHON_FALLTHROUGH
+ #if __has_attribute(fallthrough)
+ #define CYTHON_FALLTHROUGH __attribute__((fallthrough))
+ #else
+ #define CYTHON_FALLTHROUGH
+ #endif
+ #endif
+ #if defined(__clang__ ) && defined(__apple_build_version__)
+ #if __apple_build_version__ < 7000000
+ #undef CYTHON_FALLTHROUGH
+ #define CYTHON_FALLTHROUGH
+ #endif
+ #endif
+#endif
+
+#ifndef CYTHON_INLINE
+ #if defined(__clang__)
+ #define CYTHON_INLINE __inline__ __attribute__ ((__unused__))
+ #elif defined(__GNUC__)
+ #define CYTHON_INLINE __inline__
+ #elif defined(_MSC_VER)
+ #define CYTHON_INLINE __inline
+ #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+ #define CYTHON_INLINE inline
+ #else
+ #define CYTHON_INLINE
+ #endif
+#endif
+
+#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag)
+ #define Py_OptimizeFlag 0
+#endif
+#define __PYX_BUILD_PY_SSIZE_T "n"
+#define CYTHON_FORMAT_SSIZE_T "z"
+#if PY_MAJOR_VERSION < 3
+ #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
+ #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
+ PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
+ #define __Pyx_DefaultClassType PyClass_Type
+#else
+ #define __Pyx_BUILTIN_MODULE_NAME "builtins"
+#if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2
+ #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
+ PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
+#else
+ #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
+ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
+#endif
+ #define __Pyx_DefaultClassType PyType_Type
+#endif
+#ifndef Py_TPFLAGS_CHECKTYPES
+ #define Py_TPFLAGS_CHECKTYPES 0
+#endif
+#ifndef Py_TPFLAGS_HAVE_INDEX
+ #define Py_TPFLAGS_HAVE_INDEX 0
+#endif
+#ifndef Py_TPFLAGS_HAVE_NEWBUFFER
+ #define Py_TPFLAGS_HAVE_NEWBUFFER 0
+#endif
+#ifndef Py_TPFLAGS_HAVE_FINALIZE
+ #define Py_TPFLAGS_HAVE_FINALIZE 0
+#endif
+#ifndef METH_STACKLESS
+ #define METH_STACKLESS 0
+#endif
+#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL)
+ #ifndef METH_FASTCALL
+ #define METH_FASTCALL 0x80
+ #endif
+ typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs);
+ typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args,
+ Py_ssize_t nargs, PyObject *kwnames);
+#else
+ #define __Pyx_PyCFunctionFast _PyCFunctionFast
+ #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords
+#endif
+#if CYTHON_FAST_PYCCALL
+#define __Pyx_PyFastCFunction_Check(func)\
+ ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS)))))
+#else
+#define __Pyx_PyFastCFunction_Check(func) 0
+#endif
+#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc)
+ #define PyObject_Malloc(s) PyMem_Malloc(s)
+ #define PyObject_Free(p) PyMem_Free(p)
+ #define PyObject_Realloc(p) PyMem_Realloc(p)
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1
+ #define PyMem_RawMalloc(n) PyMem_Malloc(n)
+ #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n)
+ #define PyMem_RawFree(p) PyMem_Free(p)
+#endif
+#if CYTHON_COMPILING_IN_PYSTON
+ #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co)
+ #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno)
+#else
+ #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0)
+ #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno)
+#endif
+#if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000
+ #define __Pyx_PyThreadState_Current PyThreadState_GET()
+#elif PY_VERSION_HEX >= 0x03060000
+ #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet()
+#elif PY_VERSION_HEX >= 0x03000000
+ #define __Pyx_PyThreadState_Current PyThreadState_GET()
+#else
+ #define __Pyx_PyThreadState_Current _PyThreadState_Current
+#endif
+#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT)
+#include "pythread.h"
+#define Py_tss_NEEDS_INIT 0
+typedef int Py_tss_t;
+static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) {
+ *key = PyThread_create_key();
+ return 0;
+}
+static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) {
+ Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t));
+ *key = Py_tss_NEEDS_INIT;
+ return key;
+}
+static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) {
+ PyObject_Free(key);
+}
+static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) {
+ return *key != Py_tss_NEEDS_INIT;
+}
+static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) {
+ PyThread_delete_key(*key);
+ *key = Py_tss_NEEDS_INIT;
+}
+static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) {
+ return PyThread_set_key_value(*key, value);
+}
+static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
+ return PyThread_get_key_value(*key);
+}
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized)
+#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n))
+#else
+#define __Pyx_PyDict_NewPresized(n) PyDict_New()
+#endif
+#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION
+ #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y)
+ #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y)
+#else
+ #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y)
+ #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y)
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS
+#define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash)
+#else
+#define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name)
+#endif
+#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)
+ #define CYTHON_PEP393_ENABLED 1
+ #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\
+ 0 : _PyUnicode_Ready((PyObject *)(op)))
+ #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u)
+ #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)
+ #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u)
+ #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u)
+ #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u)
+ #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i)
+ #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch)
+ #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE)
+ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u)))
+ #else
+ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u))
+ #endif
+#else
+ #define CYTHON_PEP393_ENABLED 0
+ #define PyUnicode_1BYTE_KIND 1
+ #define PyUnicode_2BYTE_KIND 2
+ #define PyUnicode_4BYTE_KIND 4
+ #define __Pyx_PyUnicode_READY(op) (0)
+ #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u)
+ #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))
+ #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111)
+ #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE))
+ #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u))
+ #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i]))
+ #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch)
+ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u))
+#endif
+#if CYTHON_COMPILING_IN_PYPY
+ #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b)
+ #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b)
+#else
+ #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b)
+ #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\
+ PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b))
+#endif
+#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains)
+ #define PyUnicode_Contains(u, s) PySequence_Contains(u, s)
+#endif
+#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check)
+ #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type)
+#endif
+#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format)
+ #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt)
+#endif
+#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b))
+#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b))
+#if PY_MAJOR_VERSION >= 3
+ #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b)
+#else
+ #define __Pyx_PyString_Format(a, b) PyString_Format(a, b)
+#endif
+#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII)
+ #define PyObject_ASCII(o) PyObject_Repr(o)
+#endif
+#if PY_MAJOR_VERSION >= 3
+ #define PyBaseString_Type PyUnicode_Type
+ #define PyStringObject PyUnicodeObject
+ #define PyString_Type PyUnicode_Type
+ #define PyString_Check PyUnicode_Check
+ #define PyString_CheckExact PyUnicode_CheckExact
+#ifndef PyObject_Unicode
+ #define PyObject_Unicode PyObject_Str
+#endif
+#endif
+#if PY_MAJOR_VERSION >= 3
+ #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj)
+ #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj)
+#else
+ #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj))
+ #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj))
+#endif
+#ifndef PySet_CheckExact
+ #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type)
+#endif
+#if PY_VERSION_HEX >= 0x030900A4
+ #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt)
+ #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size)
+#else
+ #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt)
+ #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size)
+#endif
+#if CYTHON_ASSUME_SAFE_MACROS
+ #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq)
+#else
+ #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq)
+#endif
+#if PY_MAJOR_VERSION >= 3
+ #define PyIntObject PyLongObject
+ #define PyInt_Type PyLong_Type
+ #define PyInt_Check(op) PyLong_Check(op)
+ #define PyInt_CheckExact(op) PyLong_CheckExact(op)
+ #define PyInt_FromString PyLong_FromString
+ #define PyInt_FromUnicode PyLong_FromUnicode
+ #define PyInt_FromLong PyLong_FromLong
+ #define PyInt_FromSize_t PyLong_FromSize_t
+ #define PyInt_FromSsize_t PyLong_FromSsize_t
+ #define PyInt_AsLong PyLong_AsLong
+ #define PyInt_AS_LONG PyLong_AS_LONG
+ #define PyInt_AsSsize_t PyLong_AsSsize_t
+ #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask
+ #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
+ #define PyNumber_Int PyNumber_Long
+#endif
+#if PY_MAJOR_VERSION >= 3
+ #define PyBoolObject PyLongObject
+#endif
+#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY
+ #ifndef PyUnicode_InternFromString
+ #define PyUnicode_InternFromString(s) PyUnicode_FromString(s)
+ #endif
+#endif
+#if PY_VERSION_HEX < 0x030200A4
+ typedef long Py_hash_t;
+ #define __Pyx_PyInt_FromHash_t PyInt_FromLong
+ #define __Pyx_PyInt_AsHash_t PyInt_AsLong
+#else
+ #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
+ #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t
+#endif
+#if PY_MAJOR_VERSION >= 3
+ #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func))
+#else
+ #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass)
+#endif
+#if CYTHON_USE_ASYNC_SLOTS
+ #if PY_VERSION_HEX >= 0x030500B1
+ #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods
+ #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async)
+ #else
+ #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved))
+ #endif
+#else
+ #define __Pyx_PyType_AsAsync(obj) NULL
+#endif
+#ifndef __Pyx_PyAsyncMethodsStruct
+ typedef struct {
+ unaryfunc am_await;
+ unaryfunc am_aiter;
+ unaryfunc am_anext;
+ } __Pyx_PyAsyncMethodsStruct;
+#endif
+
+#if defined(WIN32) || defined(MS_WINDOWS)
+ #define _USE_MATH_DEFINES
+#endif
+#include <math.h>
+#ifdef NAN
+#define __PYX_NAN() ((float) NAN)
+#else
+static CYTHON_INLINE float __PYX_NAN() {
+ float value;
+ memset(&value, 0xFF, sizeof(value));
+ return value;
+}
+#endif
+#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL)
+#define __Pyx_truncl trunc
+#else
+#define __Pyx_truncl truncl
+#endif
+
+#define __PYX_MARK_ERR_POS(f_index, lineno) \
+ { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; }
+#define __PYX_ERR(f_index, lineno, Ln_error) \
+ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; }
+
+#ifndef __PYX_EXTERN_C
+ #ifdef __cplusplus
+ #define __PYX_EXTERN_C extern "C"
+ #else
+ #define __PYX_EXTERN_C extern
+ #endif
+#endif
+
+#define __PYX_HAVE__yarl___quoting_c
+#define __PYX_HAVE_API__yarl___quoting_c
+/* Early includes */
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#ifdef _OPENMP
+#include <omp.h>
+#endif /* _OPENMP */
+
+#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS)
+#define CYTHON_WITHOUT_ASSERTIONS
+#endif
+
+typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding;
+ const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry;
+
+#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0
+#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0
+#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8)
+#define __PYX_DEFAULT_STRING_ENCODING ""
+#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString
+#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
+#define __Pyx_uchar_cast(c) ((unsigned char)c)
+#define __Pyx_long_cast(x) ((long)x)
+#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\
+ (sizeof(type) < sizeof(Py_ssize_t)) ||\
+ (sizeof(type) > sizeof(Py_ssize_t) &&\
+ likely(v < (type)PY_SSIZE_T_MAX ||\
+ v == (type)PY_SSIZE_T_MAX) &&\
+ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\
+ v == (type)PY_SSIZE_T_MIN))) ||\
+ (sizeof(type) == sizeof(Py_ssize_t) &&\
+ (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\
+ v == (type)PY_SSIZE_T_MAX))) )
+static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) {
+ return (size_t) i < (size_t) limit;
+}
+#if defined (__cplusplus) && __cplusplus >= 201103L
+ #include <cstdlib>
+ #define __Pyx_sst_abs(value) std::abs(value)
+#elif SIZEOF_INT >= SIZEOF_SIZE_T
+ #define __Pyx_sst_abs(value) abs(value)
+#elif SIZEOF_LONG >= SIZEOF_SIZE_T
+ #define __Pyx_sst_abs(value) labs(value)
+#elif defined (_MSC_VER)
+ #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value))
+#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+ #define __Pyx_sst_abs(value) llabs(value)
+#elif defined (__GNUC__)
+ #define __Pyx_sst_abs(value) __builtin_llabs(value)
+#else
+ #define __Pyx_sst_abs(value) ((value<0) ? -value : value)
+#endif
+static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*);
+static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length);
+#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s))
+#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l)
+#define __Pyx_PyBytes_FromString PyBytes_FromString
+#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize
+static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*);
+#if PY_MAJOR_VERSION < 3
+ #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString
+ #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
+#else
+ #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString
+ #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize
+#endif
+#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s))
+#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s))
+#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s))
+#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s))
+#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s))
+#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s))
+#define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s))
+#define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s))
+#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s))
+#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s))
+#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s))
+#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s)
+#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s)
+#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s)
+#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s)
+#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s)
+static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) {
+ const Py_UNICODE *u_end = u;
+ while (*u_end++) ;
+ return (size_t)(u_end - u - 1);
+}
+#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u))
+#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode
+#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode
+#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj)
+#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None)
+static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b);
+static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);
+static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*);
+static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x);
+#define __Pyx_PySequence_Tuple(obj)\
+ (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj))
+static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
+static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
+#if CYTHON_ASSUME_SAFE_MACROS
+#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
+#else
+#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x)
+#endif
+#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x))
+#if PY_MAJOR_VERSION >= 3
+#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x))
+#else
+#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x))
+#endif
+#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x))
+#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
+static int __Pyx_sys_getdefaultencoding_not_ascii;
+static int __Pyx_init_sys_getdefaultencoding_params(void) {
+ PyObject* sys;
+ PyObject* default_encoding = NULL;
+ PyObject* ascii_chars_u = NULL;
+ PyObject* ascii_chars_b = NULL;
+ const char* default_encoding_c;
+ sys = PyImport_ImportModule("sys");
+ if (!sys) goto bad;
+ default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL);
+ Py_DECREF(sys);
+ if (!default_encoding) goto bad;
+ default_encoding_c = PyBytes_AsString(default_encoding);
+ if (!default_encoding_c) goto bad;
+ if (strcmp(default_encoding_c, "ascii") == 0) {
+ __Pyx_sys_getdefaultencoding_not_ascii = 0;
+ } else {
+ char ascii_chars[128];
+ int c;
+ for (c = 0; c < 128; c++) {
+ ascii_chars[c] = c;
+ }
+ __Pyx_sys_getdefaultencoding_not_ascii = 1;
+ ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL);
+ if (!ascii_chars_u) goto bad;
+ ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL);
+ if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) {
+ PyErr_Format(
+ PyExc_ValueError,
+ "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.",
+ default_encoding_c);
+ goto bad;
+ }
+ Py_DECREF(ascii_chars_u);
+ Py_DECREF(ascii_chars_b);
+ }
+ Py_DECREF(default_encoding);
+ return 0;
+bad:
+ Py_XDECREF(default_encoding);
+ Py_XDECREF(ascii_chars_u);
+ Py_XDECREF(ascii_chars_b);
+ return -1;
+}
+#endif
+#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3
+#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL)
+#else
+#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL)
+#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT
+static char* __PYX_DEFAULT_STRING_ENCODING;
+static int __Pyx_init_sys_getdefaultencoding_params(void) {
+ PyObject* sys;
+ PyObject* default_encoding = NULL;
+ char* default_encoding_c;
+ sys = PyImport_ImportModule("sys");
+ if (!sys) goto bad;
+ default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL);
+ Py_DECREF(sys);
+ if (!default_encoding) goto bad;
+ default_encoding_c = PyBytes_AsString(default_encoding);
+ if (!default_encoding_c) goto bad;
+ __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1);
+ if (!__PYX_DEFAULT_STRING_ENCODING) goto bad;
+ strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c);
+ Py_DECREF(default_encoding);
+ return 0;
+bad:
+ Py_XDECREF(default_encoding);
+ return -1;
+}
+#endif
+#endif
+
+
+/* Test for GCC > 2.95 */
+#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))
+ #define likely(x) __builtin_expect(!!(x), 1)
+ #define unlikely(x) __builtin_expect(!!(x), 0)
+#else /* !__GNUC__ or GCC < 2.95 */
+ #define likely(x) (x)
+ #define unlikely(x) (x)
+#endif /* __GNUC__ */
+static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; }
+
+static PyObject *__pyx_m = NULL;
+static PyObject *__pyx_d;
+static PyObject *__pyx_b;
+static PyObject *__pyx_cython_runtime = NULL;
+static PyObject *__pyx_empty_tuple;
+static PyObject *__pyx_empty_bytes;
+static PyObject *__pyx_empty_unicode;
+static int __pyx_lineno;
+static int __pyx_clineno = 0;
+static const char * __pyx_cfilenm= __FILE__;
+static const char *__pyx_filename;
+
+
+static const char *__pyx_f[] = {
+ "yarl/_quoting_c.pyx",
+ "stringsource",
+ "type.pxd",
+};
+
+/*--- Type declarations ---*/
+struct __pyx_obj_4yarl_10_quoting_c__Quoter;
+struct __pyx_obj_4yarl_10_quoting_c__Unquoter;
+struct __pyx_t_4yarl_10_quoting_c_Writer;
+
+/* "yarl/_quoting_c.pyx":79
+ * # ----------------- writer ---------------------------
+ *
+ * cdef struct Writer: # <<<<<<<<<<<<<<
+ * char *buf
+ * Py_ssize_t size
+ */
+struct __pyx_t_4yarl_10_quoting_c_Writer {
+ char *buf;
+ Py_ssize_t size;
+ Py_ssize_t pos;
+ int changed;
+};
+
+/* "yarl/_quoting_c.pyx":169
+ *
+ *
+ * cdef class _Quoter: # <<<<<<<<<<<<<<
+ * cdef bint _qs
+ * cdef bint _requote
+ */
+struct __pyx_obj_4yarl_10_quoting_c__Quoter {
+ PyObject_HEAD
+ struct __pyx_vtabstruct_4yarl_10_quoting_c__Quoter *__pyx_vtab;
+ int _qs;
+ int _requote;
+ uint8_t _safe_table[16];
+ uint8_t _protected_table[16];
+};
+
+
+/* "yarl/_quoting_c.pyx":271
+ *
+ *
+ * cdef class _Unquoter: # <<<<<<<<<<<<<<
+ * cdef str _unsafe
+ * cdef bint _qs
+ */
+struct __pyx_obj_4yarl_10_quoting_c__Unquoter {
+ PyObject_HEAD
+ struct __pyx_vtabstruct_4yarl_10_quoting_c__Unquoter *__pyx_vtab;
+ PyObject *_unsafe;
+ int _qs;
+ struct __pyx_obj_4yarl_10_quoting_c__Quoter *_quoter;
+ struct __pyx_obj_4yarl_10_quoting_c__Quoter *_qs_quoter;
+};
+
+
+
+/* "yarl/_quoting_c.pyx":169
+ *
+ *
+ * cdef class _Quoter: # <<<<<<<<<<<<<<
+ * cdef bint _qs
+ * cdef bint _requote
+ */
+
+struct __pyx_vtabstruct_4yarl_10_quoting_c__Quoter {
+ PyObject *(*_do_quote)(struct __pyx_obj_4yarl_10_quoting_c__Quoter *, PyObject *, struct __pyx_t_4yarl_10_quoting_c_Writer *);
+ int (*_write)(struct __pyx_obj_4yarl_10_quoting_c__Quoter *, struct __pyx_t_4yarl_10_quoting_c_Writer *, Py_UCS4);
+};
+static struct __pyx_vtabstruct_4yarl_10_quoting_c__Quoter *__pyx_vtabptr_4yarl_10_quoting_c__Quoter;
+static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c_7_Quoter__write(struct __pyx_obj_4yarl_10_quoting_c__Quoter *, struct __pyx_t_4yarl_10_quoting_c_Writer *, Py_UCS4);
+
+
+/* "yarl/_quoting_c.pyx":271
+ *
+ *
+ * cdef class _Unquoter: # <<<<<<<<<<<<<<
+ * cdef str _unsafe
+ * cdef bint _qs
+ */
+
+struct __pyx_vtabstruct_4yarl_10_quoting_c__Unquoter {
+ PyObject *(*_do_unquote)(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *, PyObject *);
+};
+static struct __pyx_vtabstruct_4yarl_10_quoting_c__Unquoter *__pyx_vtabptr_4yarl_10_quoting_c__Unquoter;
+
+/* --- Runtime support code (head) --- */
+/* Refnanny.proto */
+#ifndef CYTHON_REFNANNY
+ #define CYTHON_REFNANNY 0
+#endif
+#if CYTHON_REFNANNY
+ typedef struct {
+ void (*INCREF)(void*, PyObject*, int);
+ void (*DECREF)(void*, PyObject*, int);
+ void (*GOTREF)(void*, PyObject*, int);
+ void (*GIVEREF)(void*, PyObject*, int);
+ void* (*SetupContext)(const char*, int, const char*);
+ void (*FinishContext)(void**);
+ } __Pyx_RefNannyAPIStruct;
+ static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
+ static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname);
+ #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL;
+#ifdef WITH_THREAD
+ #define __Pyx_RefNannySetupContext(name, acquire_gil)\
+ if (acquire_gil) {\
+ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\
+ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\
+ PyGILState_Release(__pyx_gilstate_save);\
+ } else {\
+ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\
+ }
+#else
+ #define __Pyx_RefNannySetupContext(name, acquire_gil)\
+ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
+#endif
+ #define __Pyx_RefNannyFinishContext()\
+ __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
+ #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
+ #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
+ #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
+ #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
+ #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0)
+ #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0)
+ #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0)
+ #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0)
+#else
+ #define __Pyx_RefNannyDeclarations
+ #define __Pyx_RefNannySetupContext(name, acquire_gil)
+ #define __Pyx_RefNannyFinishContext()
+ #define __Pyx_INCREF(r) Py_INCREF(r)
+ #define __Pyx_DECREF(r) Py_DECREF(r)
+ #define __Pyx_GOTREF(r)
+ #define __Pyx_GIVEREF(r)
+ #define __Pyx_XINCREF(r) Py_XINCREF(r)
+ #define __Pyx_XDECREF(r) Py_XDECREF(r)
+ #define __Pyx_XGOTREF(r)
+ #define __Pyx_XGIVEREF(r)
+#endif
+#define __Pyx_XDECREF_SET(r, v) do {\
+ PyObject *tmp = (PyObject *) r;\
+ r = v; __Pyx_XDECREF(tmp);\
+ } while (0)
+#define __Pyx_DECREF_SET(r, v) do {\
+ PyObject *tmp = (PyObject *) r;\
+ r = v; __Pyx_DECREF(tmp);\
+ } while (0)
+#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)
+#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)
+
+/* PyObjectGetAttrStr.proto */
+#if CYTHON_USE_TYPE_SLOTS
+static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name);
+#else
+#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n)
+#endif
+
+/* GetBuiltinName.proto */
+static PyObject *__Pyx_GetBuiltinName(PyObject *name);
+
+/* PyThreadStateGet.proto */
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate;
+#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current;
+#define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type
+#else
+#define __Pyx_PyThreadState_declare
+#define __Pyx_PyThreadState_assign
+#define __Pyx_PyErr_Occurred() PyErr_Occurred()
+#endif
+
+/* PyErrFetchRestore.proto */
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL)
+#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb)
+#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb)
+#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb)
+#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb)
+static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb);
+static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
+#if CYTHON_COMPILING_IN_CPYTHON
+#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL))
+#else
+#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc)
+#endif
+#else
+#define __Pyx_PyErr_Clear() PyErr_Clear()
+#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc)
+#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb)
+#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb)
+#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb)
+#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb)
+#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb)
+#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb)
+#endif
+
+/* WriteUnraisableException.proto */
+static void __Pyx_WriteUnraisable(const char *name, int clineno,
+ int lineno, const char *filename,
+ int full_traceback, int nogil);
+
+/* RaiseDoubleKeywords.proto */
+static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name);
+
+/* ParseKeywords.proto */
+static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\
+ PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\
+ const char* function_name);
+
+/* RaiseArgTupleInvalid.proto */
+static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
+ Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found);
+
+/* ArgTypeTest.proto */
+#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\
+ ((likely((Py_TYPE(obj) == type) | (none_allowed && (obj == Py_None)))) ? 1 :\
+ __Pyx__ArgTypeTest(obj, type, name, exact))
+static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact);
+
+/* unicode_iter.proto */
+static CYTHON_INLINE int __Pyx_init_unicode_iteration(
+ PyObject* ustring, Py_ssize_t *length, void** data, int *kind);
+
+/* PyObjectCall.proto */
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw);
+#else
+#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw)
+#endif
+
+/* RaiseException.proto */
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause);
+
+/* PyCFunctionFastCall.proto */
+#if CYTHON_FAST_PYCCALL
+static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs);
+#else
+#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL)
+#endif
+
+/* PyFunctionFastCall.proto */
+#if CYTHON_FAST_PYCALL
+#define __Pyx_PyFunction_FastCall(func, args, nargs)\
+ __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL)
+#if 1 || PY_VERSION_HEX < 0x030600B1
+static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs);
+#else
+#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs)
+#endif
+#define __Pyx_BUILD_ASSERT_EXPR(cond)\
+ (sizeof(char [1 - 2*!(cond)]) - 1)
+#ifndef Py_MEMBER_SIZE
+#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member)
+#endif
+ static size_t __pyx_pyframe_localsplus_offset = 0;
+ #include "frameobject.h"
+ #define __Pxy_PyFrame_Initialize_Offsets()\
+ ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\
+ (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus)))
+ #define __Pyx_PyFrame_GetLocalsplus(frame)\
+ (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset))
+#endif
+
+/* PyObjectCallMethO.proto */
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg);
+#endif
+
+/* PyObjectCallOneArg.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg);
+
+/* GetException.proto */
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb)
+static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
+#else
+static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb);
+#endif
+
+/* SwapException.proto */
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb)
+static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
+#else
+static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb);
+#endif
+
+/* GetTopmostException.proto */
+#if CYTHON_USE_EXC_INFO_STACK
+static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate);
+#endif
+
+/* SaveResetException.proto */
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb)
+static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
+#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb)
+static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb);
+#else
+#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb)
+#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb)
+#endif
+
+/* GetItemIntUnicode.proto */
+#define __Pyx_GetItemInt_Unicode(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
+ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
+ __Pyx_GetItemInt_Unicode_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\
+ (PyErr_SetString(PyExc_IndexError, "string index out of range"), (Py_UCS4)-1))
+static CYTHON_INLINE Py_UCS4 __Pyx_GetItemInt_Unicode_Fast(PyObject* ustring, Py_ssize_t i,
+ int wraparound, int boundscheck);
+
+/* ReRaiseException.proto */
+static CYTHON_INLINE void __Pyx_ReraiseException(void);
+
+/* PyErrExceptionMatches.proto */
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err)
+static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err);
+#else
+#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err)
+#endif
+
+/* GetAttr.proto */
+static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *);
+
+/* GetAttr3.proto */
+static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *);
+
+/* PyDictVersioning.proto */
+#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS
+#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1)
+#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag)
+#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\
+ (version_var) = __PYX_GET_DICT_VERSION(dict);\
+ (cache_var) = (value);
+#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\
+ static PY_UINT64_T __pyx_dict_version = 0;\
+ static PyObject *__pyx_dict_cached_value = NULL;\
+ if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\
+ (VAR) = __pyx_dict_cached_value;\
+ } else {\
+ (VAR) = __pyx_dict_cached_value = (LOOKUP);\
+ __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\
+ }\
+}
+static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj);
+static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj);
+static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version);
+#else
+#define __PYX_GET_DICT_VERSION(dict) (0)
+#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)
+#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP);
+#endif
+
+/* GetModuleGlobalName.proto */
+#if CYTHON_USE_DICT_VERSIONS
+#define __Pyx_GetModuleGlobalName(var, name) {\
+ static PY_UINT64_T __pyx_dict_version = 0;\
+ static PyObject *__pyx_dict_cached_value = NULL;\
+ (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\
+ (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\
+ __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\
+}
+#define __Pyx_GetModuleGlobalNameUncached(var, name) {\
+ PY_UINT64_T __pyx_dict_version;\
+ PyObject *__pyx_dict_cached_value;\
+ (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\
+}
+static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value);
+#else
+#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name)
+#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name)
+static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name);
+#endif
+
+/* PyObjectCallNoArg.proto */
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func);
+#else
+#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL)
+#endif
+
+/* ListAppend.proto */
+#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS
+static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
+ PyListObject* L = (PyListObject*) list;
+ Py_ssize_t len = Py_SIZE(list);
+ if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) {
+ Py_INCREF(x);
+ PyList_SET_ITEM(list, len, x);
+ __Pyx_SET_SIZE(list, len + 1);
+ return 0;
+ }
+ return PyList_Append(list, x);
+}
+#else
+#define __Pyx_PyList_Append(L,x) PyList_Append(L,x)
+#endif
+
+/* PyUnicode_Substring.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring(
+ PyObject* text, Py_ssize_t start, Py_ssize_t stop);
+
+/* PyUnicodeContains.proto */
+static CYTHON_INLINE int __Pyx_PyUnicode_ContainsTF(PyObject* substring, PyObject* text, int eq) {
+ int result = PyUnicode_Contains(text, substring);
+ return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
+}
+
+/* PyObjectCall2Args.proto */
+static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2);
+
+/* SliceObject.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(
+ PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop,
+ PyObject** py_start, PyObject** py_stop, PyObject** py_slice,
+ int has_cstart, int has_cstop, int wraparound);
+
+/* Import.proto */
+static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level);
+
+/* ImportFrom.proto */
+static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name);
+
+/* GetItemInt.proto */
+#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
+ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
+ __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\
+ (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\
+ __Pyx_GetItemInt_Generic(o, to_py_func(i))))
+#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
+ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
+ __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\
+ (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL))
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
+ int wraparound, int boundscheck);
+#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
+ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
+ __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\
+ (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL))
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
+ int wraparound, int boundscheck);
+static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j);
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
+ int is_list, int wraparound, int boundscheck);
+
+/* IncludeStringH.proto */
+#include <string.h>
+
+/* HasAttr.proto */
+static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *);
+
+/* ExtTypeTest.proto */
+static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type);
+
+/* PyObject_GenericGetAttrNoDict.proto */
+#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000
+static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name);
+#else
+#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr
+#endif
+
+/* PyObject_GenericGetAttr.proto */
+#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000
+static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name);
+#else
+#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr
+#endif
+
+/* SetVTable.proto */
+static int __Pyx_SetVtable(PyObject *dict, void *vtable);
+
+/* PyObjectGetAttrStrNoError.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name);
+
+/* SetupReduce.proto */
+static int __Pyx_setup_reduce(PyObject* type_obj);
+
+/* TypeImport.proto */
+#ifndef __PYX_HAVE_RT_ImportType_proto
+#define __PYX_HAVE_RT_ImportType_proto
+enum __Pyx_ImportType_CheckSize {
+ __Pyx_ImportType_CheckSize_Error = 0,
+ __Pyx_ImportType_CheckSize_Warn = 1,
+ __Pyx_ImportType_CheckSize_Ignore = 2
+};
+static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size);
+#endif
+
+/* CLineInTraceback.proto */
+#ifdef CYTHON_CLINE_IN_TRACEBACK
+#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0)
+#else
+static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line);
+#endif
+
+/* CodeObjectCache.proto */
+typedef struct {
+ PyCodeObject* code_object;
+ int code_line;
+} __Pyx_CodeObjectCacheEntry;
+struct __Pyx_CodeObjectCache {
+ int count;
+ int max_count;
+ __Pyx_CodeObjectCacheEntry* entries;
+};
+static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL};
+static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line);
+static PyCodeObject *__pyx_find_code_object(int code_line);
+static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);
+
+/* AddTraceback.proto */
+static void __Pyx_AddTraceback(const char *funcname, int c_line,
+ int py_line, const char *filename);
+
+/* CIntToPy.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value);
+
+/* CIntToPy.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value);
+
+/* PyUCS4InUnicode.proto */
+static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 character);
+
+/* UnicodeAsUCS4.proto */
+static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject*);
+
+/* CIntFromPy.proto */
+static CYTHON_INLINE uint8_t __Pyx_PyInt_As_uint8_t(PyObject *);
+
+/* CIntFromPy.proto */
+static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *);
+
+/* CIntFromPy.proto */
+static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *);
+
+/* ObjectAsUCS4.proto */
+#define __Pyx_PyObject_AsPy_UCS4(x)\
+ (likely(PyUnicode_Check(x)) ? __Pyx_PyUnicode_AsPy_UCS4(x) : __Pyx__PyObject_AsPy_UCS4(x))
+static Py_UCS4 __Pyx__PyObject_AsPy_UCS4(PyObject*);
+
+/* CIntFromPy.proto */
+static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *);
+
+/* FastTypeChecks.proto */
+#if CYTHON_COMPILING_IN_CPYTHON
+#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type)
+static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b);
+static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type);
+static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2);
+#else
+#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type)
+#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type)
+#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2))
+#endif
+#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception)
+
+/* CheckBinaryVersion.proto */
+static int __Pyx_check_binary_version(void);
+
+/* InitStrings.proto */
+static int __Pyx_InitStrings(__Pyx_StringTabEntry *t);
+
+static PyObject *__pyx_f_4yarl_10_quoting_c_7_Quoter__do_quote(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, PyObject *__pyx_v_val, struct __pyx_t_4yarl_10_quoting_c_Writer *__pyx_v_writer); /* proto*/
+static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c_7_Quoter__write(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, struct __pyx_t_4yarl_10_quoting_c_Writer *__pyx_v_writer, Py_UCS4 __pyx_v_ch); /* proto*/
+static PyObject *__pyx_f_4yarl_10_quoting_c_9_Unquoter__do_unquote(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *__pyx_v_self, PyObject *__pyx_v_val); /* proto*/
+
+/* Module declarations from 'libc.stdint' */
+
+/* Module declarations from 'libc.string' */
+
+/* Module declarations from 'libc.stdio' */
+
+/* Module declarations from '__builtin__' */
+
+/* Module declarations from 'cpython.type' */
+static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0;
+
+/* Module declarations from 'cpython' */
+
+/* Module declarations from 'cpython.object' */
+
+/* Module declarations from 'cpython.exc' */
+
+/* Module declarations from 'cpython.mem' */
+
+/* Module declarations from 'cpython.unicode' */
+
+/* Module declarations from 'yarl._quoting_c' */
+static PyTypeObject *__pyx_ptype_4yarl_10_quoting_c__Quoter = 0;
+static PyTypeObject *__pyx_ptype_4yarl_10_quoting_c__Unquoter = 0;
+static PyObject *__pyx_v_4yarl_10_quoting_c_GEN_DELIMS = 0;
+static PyObject *__pyx_v_4yarl_10_quoting_c_SUB_DELIMS_WITHOUT_QS = 0;
+static PyObject *__pyx_v_4yarl_10_quoting_c_SUB_DELIMS = 0;
+static PyObject *__pyx_v_4yarl_10_quoting_c_RESERVED = 0;
+static PyObject *__pyx_v_4yarl_10_quoting_c_UNRESERVED = 0;
+static PyObject *__pyx_v_4yarl_10_quoting_c_ALLOWED = 0;
+static PyObject *__pyx_v_4yarl_10_quoting_c_QS = 0;
+static char __pyx_v_4yarl_10_quoting_c_BUFFER[0x2000];
+static uint8_t __pyx_v_4yarl_10_quoting_c_ALLOWED_TABLE[16];
+static uint8_t __pyx_v_4yarl_10_quoting_c_ALLOWED_NOTQS_TABLE[16];
+static CYTHON_INLINE Py_UCS4 __pyx_f_4yarl_10_quoting_c__to_hex(uint8_t); /*proto*/
+static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c__from_hex(Py_UCS4); /*proto*/
+static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c__is_lower_hex(Py_UCS4); /*proto*/
+static CYTHON_INLINE Py_UCS4 __pyx_f_4yarl_10_quoting_c__restore_ch(Py_UCS4, Py_UCS4); /*proto*/
+static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c_bit_at(uint8_t *, uint64_t); /*proto*/
+static CYTHON_INLINE void __pyx_f_4yarl_10_quoting_c_set_bit(uint8_t *, uint64_t); /*proto*/
+static CYTHON_INLINE void __pyx_f_4yarl_10_quoting_c__init_writer(struct __pyx_t_4yarl_10_quoting_c_Writer *); /*proto*/
+static CYTHON_INLINE void __pyx_f_4yarl_10_quoting_c__release_writer(struct __pyx_t_4yarl_10_quoting_c_Writer *); /*proto*/
+static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c__write_char(struct __pyx_t_4yarl_10_quoting_c_Writer *, Py_UCS4, int); /*proto*/
+static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c__write_pct(struct __pyx_t_4yarl_10_quoting_c_Writer *, uint8_t, int); /*proto*/
+static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c__write_utf8(struct __pyx_t_4yarl_10_quoting_c_Writer *, Py_UCS4); /*proto*/
+static PyObject *__pyx_f_4yarl_10_quoting_c___pyx_unpickle__Quoter__set_state(struct __pyx_obj_4yarl_10_quoting_c__Quoter *, PyObject *); /*proto*/
+static PyObject *__pyx_f_4yarl_10_quoting_c___pyx_unpickle__Unquoter__set_state(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *, PyObject *); /*proto*/
+static int __Pyx_carray_from_py_uint8_t(PyObject *, uint8_t *, Py_ssize_t); /*proto*/
+#define __Pyx_MODULE_NAME "yarl._quoting_c"
+extern int __pyx_module_is_main_yarl___quoting_c;
+int __pyx_module_is_main_yarl___quoting_c = 0;
+
+/* Implementation of 'yarl._quoting_c' */
+static PyObject *__pyx_builtin_range;
+static PyObject *__pyx_builtin_chr;
+static PyObject *__pyx_builtin_ValueError;
+static PyObject *__pyx_builtin_TypeError;
+static PyObject *__pyx_builtin_UnicodeDecodeError;
+static PyObject *__pyx_builtin_hex;
+static PyObject *__pyx_builtin_OverflowError;
+static PyObject *__pyx_builtin_enumerate;
+static PyObject *__pyx_builtin_IndexError;
+static const char __pyx_k_[] = "";
+static const char __pyx_k_i[] = "i";
+static const char __pyx_k__4[] = "+=&;";
+static const char __pyx_k__5[] = "+";
+static const char __pyx_k__6[] = " ";
+static const char __pyx_k__7[] = "%";
+static const char __pyx_k__9[] = ":/?#[]@";
+static const char __pyx_k_qs[] = "qs";
+static const char __pyx_k__10[] = "!$'()*,";
+static const char __pyx_k__11[] = "+?=;";
+static const char __pyx_k__12[] = "-._~";
+static const char __pyx_k__13[] = "+&=;";
+static const char __pyx_k_chr[] = "chr";
+static const char __pyx_k_hex[] = "hex";
+static const char __pyx_k_new[] = "__new__";
+static const char __pyx_k_val[] = "val";
+static const char __pyx_k_dict[] = "__dict__";
+static const char __pyx_k_main[] = "__main__";
+static const char __pyx_k_name[] = "__name__";
+static const char __pyx_k_safe[] = "safe";
+static const char __pyx_k_test[] = "__test__";
+static const char __pyx_k_range[] = "range";
+static const char __pyx_k_upper[] = "upper";
+static const char __pyx_k_Quoter[] = "_Quoter";
+static const char __pyx_k_digits[] = "digits";
+static const char __pyx_k_import[] = "__import__";
+static const char __pyx_k_pickle[] = "pickle";
+static const char __pyx_k_reduce[] = "__reduce__";
+static const char __pyx_k_string[] = "string";
+static const char __pyx_k_unsafe[] = "unsafe";
+static const char __pyx_k_update[] = "update";
+static const char __pyx_k_requote[] = "requote";
+static const char __pyx_k_Unquoter[] = "_Unquoter";
+static const char __pyx_k_getstate[] = "__getstate__";
+static const char __pyx_k_pyx_type[] = "__pyx_type";
+static const char __pyx_k_setstate[] = "__setstate__";
+static const char __pyx_k_TypeError[] = "TypeError";
+static const char __pyx_k_enumerate[] = "enumerate";
+static const char __pyx_k_protected[] = "protected";
+static const char __pyx_k_pyx_state[] = "__pyx_state";
+static const char __pyx_k_reduce_ex[] = "__reduce_ex__";
+static const char __pyx_k_IndexError[] = "IndexError";
+static const char __pyx_k_ValueError[] = "ValueError";
+static const char __pyx_k_pyx_result[] = "__pyx_result";
+static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__";
+static const char __pyx_k_PickleError[] = "PickleError";
+static const char __pyx_k_pyx_checksum[] = "__pyx_checksum";
+static const char __pyx_k_stringsource[] = "stringsource";
+static const char __pyx_k_OverflowError[] = "OverflowError";
+static const char __pyx_k_ascii_letters[] = "ascii_letters";
+static const char __pyx_k_reduce_cython[] = "__reduce_cython__";
+static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError";
+static const char __pyx_k_setstate_cython[] = "__setstate_cython__";
+static const char __pyx_k_yarl__quoting_c[] = "yarl._quoting_c";
+static const char __pyx_k_UnicodeDecodeError[] = "UnicodeDecodeError";
+static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback";
+static const char __pyx_k_pyx_unpickle__Quoter[] = "__pyx_unpickle__Quoter";
+static const char __pyx_k_Argument_should_be_str[] = "Argument should be str";
+static const char __pyx_k_pyx_unpickle__Unquoter[] = "__pyx_unpickle__Unquoter";
+static const char __pyx_k_Incompatible_checksums_s_vs_0x27[] = "Incompatible checksums (%s vs 0x276577d = (_qs, _qs_quoter, _quoter, _unsafe))";
+static const char __pyx_k_Incompatible_checksums_s_vs_0xe9[] = "Incompatible checksums (%s vs 0xe91bd35 = (_protected_table, _qs, _requote, _safe_table))";
+static const char __pyx_k_Only_safe_symbols_with_ORD_128_a[] = "Only safe symbols with ORD < 128 are allowed";
+static PyObject *__pyx_kp_u_;
+static PyObject *__pyx_kp_u_Argument_should_be_str;
+static PyObject *__pyx_kp_s_Incompatible_checksums_s_vs_0x27;
+static PyObject *__pyx_kp_s_Incompatible_checksums_s_vs_0xe9;
+static PyObject *__pyx_n_s_IndexError;
+static PyObject *__pyx_kp_u_Only_safe_symbols_with_ORD_128_a;
+static PyObject *__pyx_n_s_OverflowError;
+static PyObject *__pyx_n_s_PickleError;
+static PyObject *__pyx_n_s_Quoter;
+static PyObject *__pyx_n_s_TypeError;
+static PyObject *__pyx_n_s_UnicodeDecodeError;
+static PyObject *__pyx_n_s_Unquoter;
+static PyObject *__pyx_n_s_ValueError;
+static PyObject *__pyx_kp_u__10;
+static PyObject *__pyx_kp_u__11;
+static PyObject *__pyx_kp_u__12;
+static PyObject *__pyx_kp_u__13;
+static PyObject *__pyx_kp_u__4;
+static PyObject *__pyx_kp_u__5;
+static PyObject *__pyx_kp_u__6;
+static PyObject *__pyx_kp_u__7;
+static PyObject *__pyx_kp_u__9;
+static PyObject *__pyx_n_s_ascii_letters;
+static PyObject *__pyx_n_s_chr;
+static PyObject *__pyx_n_s_cline_in_traceback;
+static PyObject *__pyx_n_s_dict;
+static PyObject *__pyx_n_s_digits;
+static PyObject *__pyx_n_s_enumerate;
+static PyObject *__pyx_n_s_getstate;
+static PyObject *__pyx_n_s_hex;
+static PyObject *__pyx_n_s_i;
+static PyObject *__pyx_n_s_import;
+static PyObject *__pyx_n_s_main;
+static PyObject *__pyx_n_s_name;
+static PyObject *__pyx_n_s_new;
+static PyObject *__pyx_n_s_pickle;
+static PyObject *__pyx_n_s_protected;
+static PyObject *__pyx_n_s_pyx_PickleError;
+static PyObject *__pyx_n_s_pyx_checksum;
+static PyObject *__pyx_n_s_pyx_result;
+static PyObject *__pyx_n_s_pyx_state;
+static PyObject *__pyx_n_s_pyx_type;
+static PyObject *__pyx_n_s_pyx_unpickle__Quoter;
+static PyObject *__pyx_n_s_pyx_unpickle__Unquoter;
+static PyObject *__pyx_n_s_pyx_vtable;
+static PyObject *__pyx_n_s_qs;
+static PyObject *__pyx_n_s_range;
+static PyObject *__pyx_n_s_reduce;
+static PyObject *__pyx_n_s_reduce_cython;
+static PyObject *__pyx_n_s_reduce_ex;
+static PyObject *__pyx_n_s_requote;
+static PyObject *__pyx_n_s_safe;
+static PyObject *__pyx_n_s_setstate;
+static PyObject *__pyx_n_s_setstate_cython;
+static PyObject *__pyx_n_s_string;
+static PyObject *__pyx_kp_s_stringsource;
+static PyObject *__pyx_n_s_test;
+static PyObject *__pyx_n_s_unsafe;
+static PyObject *__pyx_n_s_update;
+static PyObject *__pyx_n_s_upper;
+static PyObject *__pyx_n_s_val;
+static PyObject *__pyx_n_s_yarl__quoting_c;
+static int __pyx_pf_4yarl_10_quoting_c_7_Quoter___init__(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, PyObject *__pyx_v_safe, PyObject *__pyx_v_protected, int __pyx_v_qs, int __pyx_v_requote); /* proto */
+static PyObject *__pyx_pf_4yarl_10_quoting_c_7_Quoter_2__call__(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, PyObject *__pyx_v_val); /* proto */
+static PyObject *__pyx_pf_4yarl_10_quoting_c_7_Quoter_4__reduce_cython__(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_4yarl_10_quoting_c_7_Quoter_6__setstate_cython__(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */
+static int __pyx_pf_4yarl_10_quoting_c_9_Unquoter___init__(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *__pyx_v_self, PyObject *__pyx_v_unsafe, PyObject *__pyx_v_qs); /* proto */
+static PyObject *__pyx_pf_4yarl_10_quoting_c_9_Unquoter_2__call__(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *__pyx_v_self, PyObject *__pyx_v_val); /* proto */
+static PyObject *__pyx_pf_4yarl_10_quoting_c_9_Unquoter_4__reduce_cython__(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_4yarl_10_quoting_c_9_Unquoter_6__setstate_cython__(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_4yarl_10_quoting_c___pyx_unpickle__Quoter(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_pf_4yarl_10_quoting_c_2__pyx_unpickle__Unquoter(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_tp_new_4yarl_10_quoting_c__Quoter(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_tp_new_4yarl_10_quoting_c__Unquoter(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static PyObject *__pyx_int_2;
+static PyObject *__pyx_int_41310077;
+static PyObject *__pyx_int_244432181;
+static PyObject *__pyx_slice__8;
+static PyObject *__pyx_tuple__2;
+static PyObject *__pyx_tuple__3;
+static PyObject *__pyx_tuple__14;
+static PyObject *__pyx_tuple__16;
+static PyObject *__pyx_codeobj__15;
+static PyObject *__pyx_codeobj__17;
+/* Late includes */
+
+/* "yarl/_quoting_c.pyx":23
+ * cdef char BUFFER[BUF_SIZE]
+ *
+ * cdef inline Py_UCS4 _to_hex(uint8_t v): # <<<<<<<<<<<<<<
+ * if v < 10:
+ * return <Py_UCS4>(v+0x30) # ord('0') == 0x30
+ */
+
+static CYTHON_INLINE Py_UCS4 __pyx_f_4yarl_10_quoting_c__to_hex(uint8_t __pyx_v_v) {
+ Py_UCS4 __pyx_r;
+ __Pyx_RefNannyDeclarations
+ int __pyx_t_1;
+ __Pyx_RefNannySetupContext("_to_hex", 0);
+
+ /* "yarl/_quoting_c.pyx":24
+ *
+ * cdef inline Py_UCS4 _to_hex(uint8_t v):
+ * if v < 10: # <<<<<<<<<<<<<<
+ * return <Py_UCS4>(v+0x30) # ord('0') == 0x30
+ * else:
+ */
+ __pyx_t_1 = ((__pyx_v_v < 10) != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":25
+ * cdef inline Py_UCS4 _to_hex(uint8_t v):
+ * if v < 10:
+ * return <Py_UCS4>(v+0x30) # ord('0') == 0x30 # <<<<<<<<<<<<<<
+ * else:
+ * return <Py_UCS4>(v+0x41-10) # ord('A') == 0x41
+ */
+ __pyx_r = ((Py_UCS4)(__pyx_v_v + 0x30));
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":24
+ *
+ * cdef inline Py_UCS4 _to_hex(uint8_t v):
+ * if v < 10: # <<<<<<<<<<<<<<
+ * return <Py_UCS4>(v+0x30) # ord('0') == 0x30
+ * else:
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":27
+ * return <Py_UCS4>(v+0x30) # ord('0') == 0x30
+ * else:
+ * return <Py_UCS4>(v+0x41-10) # ord('A') == 0x41 # <<<<<<<<<<<<<<
+ *
+ *
+ */
+ /*else*/ {
+ __pyx_r = ((Py_UCS4)((__pyx_v_v + 0x41) - 10));
+ goto __pyx_L0;
+ }
+
+ /* "yarl/_quoting_c.pyx":23
+ * cdef char BUFFER[BUF_SIZE]
+ *
+ * cdef inline Py_UCS4 _to_hex(uint8_t v): # <<<<<<<<<<<<<<
+ * if v < 10:
+ * return <Py_UCS4>(v+0x30) # ord('0') == 0x30
+ */
+
+ /* function exit code */
+ __pyx_L0:;
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "yarl/_quoting_c.pyx":30
+ *
+ *
+ * cdef inline int _from_hex(Py_UCS4 v): # <<<<<<<<<<<<<<
+ * if '0' <= v <= '9':
+ * return <int>(v) - 0x30 # ord('0') == 0x30
+ */
+
+static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c__from_hex(Py_UCS4 __pyx_v_v) {
+ int __pyx_r;
+ __Pyx_RefNannyDeclarations
+ int __pyx_t_1;
+ int __pyx_t_2;
+ __Pyx_RefNannySetupContext("_from_hex", 0);
+
+ /* "yarl/_quoting_c.pyx":31
+ *
+ * cdef inline int _from_hex(Py_UCS4 v):
+ * if '0' <= v <= '9': # <<<<<<<<<<<<<<
+ * return <int>(v) - 0x30 # ord('0') == 0x30
+ * elif 'A' <= v <= 'F':
+ */
+ __pyx_t_1 = (48 <= __pyx_v_v);
+ if (__pyx_t_1) {
+ __pyx_t_1 = (__pyx_v_v <= 57);
+ }
+ __pyx_t_2 = (__pyx_t_1 != 0);
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":32
+ * cdef inline int _from_hex(Py_UCS4 v):
+ * if '0' <= v <= '9':
+ * return <int>(v) - 0x30 # ord('0') == 0x30 # <<<<<<<<<<<<<<
+ * elif 'A' <= v <= 'F':
+ * return <int>(v) - 0x41 + 10 # ord('A') == 0x41
+ */
+ __pyx_r = (((int)__pyx_v_v) - 0x30);
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":31
+ *
+ * cdef inline int _from_hex(Py_UCS4 v):
+ * if '0' <= v <= '9': # <<<<<<<<<<<<<<
+ * return <int>(v) - 0x30 # ord('0') == 0x30
+ * elif 'A' <= v <= 'F':
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":33
+ * if '0' <= v <= '9':
+ * return <int>(v) - 0x30 # ord('0') == 0x30
+ * elif 'A' <= v <= 'F': # <<<<<<<<<<<<<<
+ * return <int>(v) - 0x41 + 10 # ord('A') == 0x41
+ * elif 'a' <= v <= 'f':
+ */
+ __pyx_t_2 = (65 <= __pyx_v_v);
+ if (__pyx_t_2) {
+ __pyx_t_2 = (__pyx_v_v <= 70);
+ }
+ __pyx_t_1 = (__pyx_t_2 != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":34
+ * return <int>(v) - 0x30 # ord('0') == 0x30
+ * elif 'A' <= v <= 'F':
+ * return <int>(v) - 0x41 + 10 # ord('A') == 0x41 # <<<<<<<<<<<<<<
+ * elif 'a' <= v <= 'f':
+ * return <int>(v) - 0x61 + 10 # ord('a') == 0x61
+ */
+ __pyx_r = ((((int)__pyx_v_v) - 0x41) + 10);
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":33
+ * if '0' <= v <= '9':
+ * return <int>(v) - 0x30 # ord('0') == 0x30
+ * elif 'A' <= v <= 'F': # <<<<<<<<<<<<<<
+ * return <int>(v) - 0x41 + 10 # ord('A') == 0x41
+ * elif 'a' <= v <= 'f':
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":35
+ * elif 'A' <= v <= 'F':
+ * return <int>(v) - 0x41 + 10 # ord('A') == 0x41
+ * elif 'a' <= v <= 'f': # <<<<<<<<<<<<<<
+ * return <int>(v) - 0x61 + 10 # ord('a') == 0x61
+ * else:
+ */
+ __pyx_t_1 = (97 <= __pyx_v_v);
+ if (__pyx_t_1) {
+ __pyx_t_1 = (__pyx_v_v <= 0x66);
+ }
+ __pyx_t_2 = (__pyx_t_1 != 0);
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":36
+ * return <int>(v) - 0x41 + 10 # ord('A') == 0x41
+ * elif 'a' <= v <= 'f':
+ * return <int>(v) - 0x61 + 10 # ord('a') == 0x61 # <<<<<<<<<<<<<<
+ * else:
+ * return -1
+ */
+ __pyx_r = ((((int)__pyx_v_v) - 0x61) + 10);
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":35
+ * elif 'A' <= v <= 'F':
+ * return <int>(v) - 0x41 + 10 # ord('A') == 0x41
+ * elif 'a' <= v <= 'f': # <<<<<<<<<<<<<<
+ * return <int>(v) - 0x61 + 10 # ord('a') == 0x61
+ * else:
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":38
+ * return <int>(v) - 0x61 + 10 # ord('a') == 0x61
+ * else:
+ * return -1 # <<<<<<<<<<<<<<
+ *
+ *
+ */
+ /*else*/ {
+ __pyx_r = -1;
+ goto __pyx_L0;
+ }
+
+ /* "yarl/_quoting_c.pyx":30
+ *
+ *
+ * cdef inline int _from_hex(Py_UCS4 v): # <<<<<<<<<<<<<<
+ * if '0' <= v <= '9':
+ * return <int>(v) - 0x30 # ord('0') == 0x30
+ */
+
+ /* function exit code */
+ __pyx_L0:;
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "yarl/_quoting_c.pyx":41
+ *
+ *
+ * cdef inline int _is_lower_hex(Py_UCS4 v): # <<<<<<<<<<<<<<
+ * return 'a' <= v <= 'f'
+ *
+ */
+
+static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c__is_lower_hex(Py_UCS4 __pyx_v_v) {
+ int __pyx_r;
+ __Pyx_RefNannyDeclarations
+ int __pyx_t_1;
+ __Pyx_RefNannySetupContext("_is_lower_hex", 0);
+
+ /* "yarl/_quoting_c.pyx":42
+ *
+ * cdef inline int _is_lower_hex(Py_UCS4 v):
+ * return 'a' <= v <= 'f' # <<<<<<<<<<<<<<
+ *
+ *
+ */
+ __pyx_t_1 = (97 <= __pyx_v_v);
+ if (__pyx_t_1) {
+ __pyx_t_1 = (__pyx_v_v <= 0x66);
+ }
+ __pyx_r = __pyx_t_1;
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":41
+ *
+ *
+ * cdef inline int _is_lower_hex(Py_UCS4 v): # <<<<<<<<<<<<<<
+ * return 'a' <= v <= 'f'
+ *
+ */
+
+ /* function exit code */
+ __pyx_L0:;
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "yarl/_quoting_c.pyx":45
+ *
+ *
+ * cdef inline Py_UCS4 _restore_ch(Py_UCS4 d1, Py_UCS4 d2): # <<<<<<<<<<<<<<
+ * cdef int digit1 = _from_hex(d1)
+ * if digit1 < 0:
+ */
+
+static CYTHON_INLINE Py_UCS4 __pyx_f_4yarl_10_quoting_c__restore_ch(Py_UCS4 __pyx_v_d1, Py_UCS4 __pyx_v_d2) {
+ int __pyx_v_digit1;
+ int __pyx_v_digit2;
+ Py_UCS4 __pyx_r;
+ __Pyx_RefNannyDeclarations
+ int __pyx_t_1;
+ __Pyx_RefNannySetupContext("_restore_ch", 0);
+
+ /* "yarl/_quoting_c.pyx":46
+ *
+ * cdef inline Py_UCS4 _restore_ch(Py_UCS4 d1, Py_UCS4 d2):
+ * cdef int digit1 = _from_hex(d1) # <<<<<<<<<<<<<<
+ * if digit1 < 0:
+ * return <Py_UCS4>-1
+ */
+ __pyx_v_digit1 = __pyx_f_4yarl_10_quoting_c__from_hex(__pyx_v_d1);
+
+ /* "yarl/_quoting_c.pyx":47
+ * cdef inline Py_UCS4 _restore_ch(Py_UCS4 d1, Py_UCS4 d2):
+ * cdef int digit1 = _from_hex(d1)
+ * if digit1 < 0: # <<<<<<<<<<<<<<
+ * return <Py_UCS4>-1
+ * cdef int digit2 = _from_hex(d2)
+ */
+ __pyx_t_1 = ((__pyx_v_digit1 < 0) != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":48
+ * cdef int digit1 = _from_hex(d1)
+ * if digit1 < 0:
+ * return <Py_UCS4>-1 # <<<<<<<<<<<<<<
+ * cdef int digit2 = _from_hex(d2)
+ * if digit2 < 0:
+ */
+ __pyx_r = ((Py_UCS4)-1L);
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":47
+ * cdef inline Py_UCS4 _restore_ch(Py_UCS4 d1, Py_UCS4 d2):
+ * cdef int digit1 = _from_hex(d1)
+ * if digit1 < 0: # <<<<<<<<<<<<<<
+ * return <Py_UCS4>-1
+ * cdef int digit2 = _from_hex(d2)
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":49
+ * if digit1 < 0:
+ * return <Py_UCS4>-1
+ * cdef int digit2 = _from_hex(d2) # <<<<<<<<<<<<<<
+ * if digit2 < 0:
+ * return <Py_UCS4>-1
+ */
+ __pyx_v_digit2 = __pyx_f_4yarl_10_quoting_c__from_hex(__pyx_v_d2);
+
+ /* "yarl/_quoting_c.pyx":50
+ * return <Py_UCS4>-1
+ * cdef int digit2 = _from_hex(d2)
+ * if digit2 < 0: # <<<<<<<<<<<<<<
+ * return <Py_UCS4>-1
+ * return <Py_UCS4>(digit1 << 4 | digit2)
+ */
+ __pyx_t_1 = ((__pyx_v_digit2 < 0) != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":51
+ * cdef int digit2 = _from_hex(d2)
+ * if digit2 < 0:
+ * return <Py_UCS4>-1 # <<<<<<<<<<<<<<
+ * return <Py_UCS4>(digit1 << 4 | digit2)
+ *
+ */
+ __pyx_r = ((Py_UCS4)-1L);
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":50
+ * return <Py_UCS4>-1
+ * cdef int digit2 = _from_hex(d2)
+ * if digit2 < 0: # <<<<<<<<<<<<<<
+ * return <Py_UCS4>-1
+ * return <Py_UCS4>(digit1 << 4 | digit2)
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":52
+ * if digit2 < 0:
+ * return <Py_UCS4>-1
+ * return <Py_UCS4>(digit1 << 4 | digit2) # <<<<<<<<<<<<<<
+ *
+ *
+ */
+ __pyx_r = ((Py_UCS4)((__pyx_v_digit1 << 4) | __pyx_v_digit2));
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":45
+ *
+ *
+ * cdef inline Py_UCS4 _restore_ch(Py_UCS4 d1, Py_UCS4 d2): # <<<<<<<<<<<<<<
+ * cdef int digit1 = _from_hex(d1)
+ * if digit1 < 0:
+ */
+
+ /* function exit code */
+ __pyx_L0:;
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "yarl/_quoting_c.pyx":59
+ *
+ *
+ * cdef inline bint bit_at(uint8_t array[], uint64_t ch): # <<<<<<<<<<<<<<
+ * return array[ch >> 3] & (1 << (ch & 7))
+ *
+ */
+
+static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c_bit_at(uint8_t *__pyx_v_array, uint64_t __pyx_v_ch) {
+ int __pyx_r;
+ __Pyx_RefNannyDeclarations
+ __Pyx_RefNannySetupContext("bit_at", 0);
+
+ /* "yarl/_quoting_c.pyx":60
+ *
+ * cdef inline bint bit_at(uint8_t array[], uint64_t ch):
+ * return array[ch >> 3] & (1 << (ch & 7)) # <<<<<<<<<<<<<<
+ *
+ *
+ */
+ __pyx_r = ((__pyx_v_array[(__pyx_v_ch >> 3)]) & (1 << (__pyx_v_ch & 7)));
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":59
+ *
+ *
+ * cdef inline bint bit_at(uint8_t array[], uint64_t ch): # <<<<<<<<<<<<<<
+ * return array[ch >> 3] & (1 << (ch & 7))
+ *
+ */
+
+ /* function exit code */
+ __pyx_L0:;
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "yarl/_quoting_c.pyx":63
+ *
+ *
+ * cdef inline void set_bit(uint8_t array[], uint64_t ch): # <<<<<<<<<<<<<<
+ * array[ch >> 3] |= (1 << (ch & 7))
+ *
+ */
+
+static CYTHON_INLINE void __pyx_f_4yarl_10_quoting_c_set_bit(uint8_t *__pyx_v_array, uint64_t __pyx_v_ch) {
+ __Pyx_RefNannyDeclarations
+ uint64_t __pyx_t_1;
+ __Pyx_RefNannySetupContext("set_bit", 0);
+
+ /* "yarl/_quoting_c.pyx":64
+ *
+ * cdef inline void set_bit(uint8_t array[], uint64_t ch):
+ * array[ch >> 3] |= (1 << (ch & 7)) # <<<<<<<<<<<<<<
+ *
+ *
+ */
+ __pyx_t_1 = (__pyx_v_ch >> 3);
+ (__pyx_v_array[__pyx_t_1]) = ((__pyx_v_array[__pyx_t_1]) | (1 << (__pyx_v_ch & 7)));
+
+ /* "yarl/_quoting_c.pyx":63
+ *
+ *
+ * cdef inline void set_bit(uint8_t array[], uint64_t ch): # <<<<<<<<<<<<<<
+ * array[ch >> 3] |= (1 << (ch & 7))
+ *
+ */
+
+ /* function exit code */
+ __Pyx_RefNannyFinishContext();
+}
+
+/* "yarl/_quoting_c.pyx":86
+ *
+ *
+ * cdef inline void _init_writer(Writer* writer): # <<<<<<<<<<<<<<
+ * writer.buf = &BUFFER[0]
+ * writer.size = BUF_SIZE
+ */
+
+static CYTHON_INLINE void __pyx_f_4yarl_10_quoting_c__init_writer(struct __pyx_t_4yarl_10_quoting_c_Writer *__pyx_v_writer) {
+ __Pyx_RefNannyDeclarations
+ __Pyx_RefNannySetupContext("_init_writer", 0);
+
+ /* "yarl/_quoting_c.pyx":87
+ *
+ * cdef inline void _init_writer(Writer* writer):
+ * writer.buf = &BUFFER[0] # <<<<<<<<<<<<<<
+ * writer.size = BUF_SIZE
+ * writer.pos = 0
+ */
+ __pyx_v_writer->buf = (&(__pyx_v_4yarl_10_quoting_c_BUFFER[0]));
+
+ /* "yarl/_quoting_c.pyx":88
+ * cdef inline void _init_writer(Writer* writer):
+ * writer.buf = &BUFFER[0]
+ * writer.size = BUF_SIZE # <<<<<<<<<<<<<<
+ * writer.pos = 0
+ * writer.changed = 0
+ */
+ __pyx_v_writer->size = 0x2000;
+
+ /* "yarl/_quoting_c.pyx":89
+ * writer.buf = &BUFFER[0]
+ * writer.size = BUF_SIZE
+ * writer.pos = 0 # <<<<<<<<<<<<<<
+ * writer.changed = 0
+ *
+ */
+ __pyx_v_writer->pos = 0;
+
+ /* "yarl/_quoting_c.pyx":90
+ * writer.size = BUF_SIZE
+ * writer.pos = 0
+ * writer.changed = 0 # <<<<<<<<<<<<<<
+ *
+ *
+ */
+ __pyx_v_writer->changed = 0;
+
+ /* "yarl/_quoting_c.pyx":86
+ *
+ *
+ * cdef inline void _init_writer(Writer* writer): # <<<<<<<<<<<<<<
+ * writer.buf = &BUFFER[0]
+ * writer.size = BUF_SIZE
+ */
+
+ /* function exit code */
+ __Pyx_RefNannyFinishContext();
+}
+
+/* "yarl/_quoting_c.pyx":93
+ *
+ *
+ * cdef inline void _release_writer(Writer* writer): # <<<<<<<<<<<<<<
+ * if writer.buf != BUFFER:
+ * PyMem_Free(writer.buf)
+ */
+
+static CYTHON_INLINE void __pyx_f_4yarl_10_quoting_c__release_writer(struct __pyx_t_4yarl_10_quoting_c_Writer *__pyx_v_writer) {
+ __Pyx_RefNannyDeclarations
+ int __pyx_t_1;
+ __Pyx_RefNannySetupContext("_release_writer", 0);
+
+ /* "yarl/_quoting_c.pyx":94
+ *
+ * cdef inline void _release_writer(Writer* writer):
+ * if writer.buf != BUFFER: # <<<<<<<<<<<<<<
+ * PyMem_Free(writer.buf)
+ *
+ */
+ __pyx_t_1 = ((__pyx_v_writer->buf != __pyx_v_4yarl_10_quoting_c_BUFFER) != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":95
+ * cdef inline void _release_writer(Writer* writer):
+ * if writer.buf != BUFFER:
+ * PyMem_Free(writer.buf) # <<<<<<<<<<<<<<
+ *
+ *
+ */
+ PyMem_Free(__pyx_v_writer->buf);
+
+ /* "yarl/_quoting_c.pyx":94
+ *
+ * cdef inline void _release_writer(Writer* writer):
+ * if writer.buf != BUFFER: # <<<<<<<<<<<<<<
+ * PyMem_Free(writer.buf)
+ *
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":93
+ *
+ *
+ * cdef inline void _release_writer(Writer* writer): # <<<<<<<<<<<<<<
+ * if writer.buf != BUFFER:
+ * PyMem_Free(writer.buf)
+ */
+
+ /* function exit code */
+ __Pyx_RefNannyFinishContext();
+}
+
+/* "yarl/_quoting_c.pyx":98
+ *
+ *
+ * cdef inline int _write_char(Writer* writer, Py_UCS4 ch, bint changed): # <<<<<<<<<<<<<<
+ * cdef char * buf
+ * cdef Py_ssize_t size
+ */
+
+static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c__write_char(struct __pyx_t_4yarl_10_quoting_c_Writer *__pyx_v_writer, Py_UCS4 __pyx_v_ch, int __pyx_v_changed) {
+ char *__pyx_v_buf;
+ Py_ssize_t __pyx_v_size;
+ int __pyx_r;
+ __Pyx_RefNannyDeclarations
+ int __pyx_t_1;
+ PyObject *__pyx_t_2;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannySetupContext("_write_char", 0);
+
+ /* "yarl/_quoting_c.pyx":102
+ * cdef Py_ssize_t size
+ *
+ * if writer.pos == writer.size: # <<<<<<<<<<<<<<
+ * # reallocate
+ * size = writer.size + BUF_SIZE
+ */
+ __pyx_t_1 = ((__pyx_v_writer->pos == __pyx_v_writer->size) != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":104
+ * if writer.pos == writer.size:
+ * # reallocate
+ * size = writer.size + BUF_SIZE # <<<<<<<<<<<<<<
+ * if writer.buf == BUFFER:
+ * buf = <char*>PyMem_Malloc(size)
+ */
+ __pyx_v_size = (__pyx_v_writer->size + 0x2000);
+
+ /* "yarl/_quoting_c.pyx":105
+ * # reallocate
+ * size = writer.size + BUF_SIZE
+ * if writer.buf == BUFFER: # <<<<<<<<<<<<<<
+ * buf = <char*>PyMem_Malloc(size)
+ * if buf == NULL:
+ */
+ __pyx_t_1 = ((__pyx_v_writer->buf == __pyx_v_4yarl_10_quoting_c_BUFFER) != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":106
+ * size = writer.size + BUF_SIZE
+ * if writer.buf == BUFFER:
+ * buf = <char*>PyMem_Malloc(size) # <<<<<<<<<<<<<<
+ * if buf == NULL:
+ * PyErr_NoMemory()
+ */
+ __pyx_v_buf = ((char *)PyMem_Malloc(__pyx_v_size));
+
+ /* "yarl/_quoting_c.pyx":107
+ * if writer.buf == BUFFER:
+ * buf = <char*>PyMem_Malloc(size)
+ * if buf == NULL: # <<<<<<<<<<<<<<
+ * PyErr_NoMemory()
+ * return -1
+ */
+ __pyx_t_1 = ((__pyx_v_buf == NULL) != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":108
+ * buf = <char*>PyMem_Malloc(size)
+ * if buf == NULL:
+ * PyErr_NoMemory() # <<<<<<<<<<<<<<
+ * return -1
+ * memcpy(buf, writer.buf, writer.size)
+ */
+ __pyx_t_2 = PyErr_NoMemory(); if (unlikely(__pyx_t_2 == ((PyObject *)NULL))) __PYX_ERR(0, 108, __pyx_L1_error)
+
+ /* "yarl/_quoting_c.pyx":109
+ * if buf == NULL:
+ * PyErr_NoMemory()
+ * return -1 # <<<<<<<<<<<<<<
+ * memcpy(buf, writer.buf, writer.size)
+ * else:
+ */
+ __pyx_r = -1;
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":107
+ * if writer.buf == BUFFER:
+ * buf = <char*>PyMem_Malloc(size)
+ * if buf == NULL: # <<<<<<<<<<<<<<
+ * PyErr_NoMemory()
+ * return -1
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":110
+ * PyErr_NoMemory()
+ * return -1
+ * memcpy(buf, writer.buf, writer.size) # <<<<<<<<<<<<<<
+ * else:
+ * buf = <char*>PyMem_Realloc(writer.buf, size)
+ */
+ (void)(memcpy(__pyx_v_buf, __pyx_v_writer->buf, __pyx_v_writer->size));
+
+ /* "yarl/_quoting_c.pyx":105
+ * # reallocate
+ * size = writer.size + BUF_SIZE
+ * if writer.buf == BUFFER: # <<<<<<<<<<<<<<
+ * buf = <char*>PyMem_Malloc(size)
+ * if buf == NULL:
+ */
+ goto __pyx_L4;
+ }
+
+ /* "yarl/_quoting_c.pyx":112
+ * memcpy(buf, writer.buf, writer.size)
+ * else:
+ * buf = <char*>PyMem_Realloc(writer.buf, size) # <<<<<<<<<<<<<<
+ * if buf == NULL:
+ * PyErr_NoMemory()
+ */
+ /*else*/ {
+ __pyx_v_buf = ((char *)PyMem_Realloc(__pyx_v_writer->buf, __pyx_v_size));
+
+ /* "yarl/_quoting_c.pyx":113
+ * else:
+ * buf = <char*>PyMem_Realloc(writer.buf, size)
+ * if buf == NULL: # <<<<<<<<<<<<<<
+ * PyErr_NoMemory()
+ * return -1
+ */
+ __pyx_t_1 = ((__pyx_v_buf == NULL) != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":114
+ * buf = <char*>PyMem_Realloc(writer.buf, size)
+ * if buf == NULL:
+ * PyErr_NoMemory() # <<<<<<<<<<<<<<
+ * return -1
+ * writer.buf = buf
+ */
+ __pyx_t_2 = PyErr_NoMemory(); if (unlikely(__pyx_t_2 == ((PyObject *)NULL))) __PYX_ERR(0, 114, __pyx_L1_error)
+
+ /* "yarl/_quoting_c.pyx":115
+ * if buf == NULL:
+ * PyErr_NoMemory()
+ * return -1 # <<<<<<<<<<<<<<
+ * writer.buf = buf
+ * writer.size = size
+ */
+ __pyx_r = -1;
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":113
+ * else:
+ * buf = <char*>PyMem_Realloc(writer.buf, size)
+ * if buf == NULL: # <<<<<<<<<<<<<<
+ * PyErr_NoMemory()
+ * return -1
+ */
+ }
+ }
+ __pyx_L4:;
+
+ /* "yarl/_quoting_c.pyx":116
+ * PyErr_NoMemory()
+ * return -1
+ * writer.buf = buf # <<<<<<<<<<<<<<
+ * writer.size = size
+ * writer.buf[writer.pos] = <char>ch
+ */
+ __pyx_v_writer->buf = __pyx_v_buf;
+
+ /* "yarl/_quoting_c.pyx":117
+ * return -1
+ * writer.buf = buf
+ * writer.size = size # <<<<<<<<<<<<<<
+ * writer.buf[writer.pos] = <char>ch
+ * writer.pos += 1
+ */
+ __pyx_v_writer->size = __pyx_v_size;
+
+ /* "yarl/_quoting_c.pyx":102
+ * cdef Py_ssize_t size
+ *
+ * if writer.pos == writer.size: # <<<<<<<<<<<<<<
+ * # reallocate
+ * size = writer.size + BUF_SIZE
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":118
+ * writer.buf = buf
+ * writer.size = size
+ * writer.buf[writer.pos] = <char>ch # <<<<<<<<<<<<<<
+ * writer.pos += 1
+ * writer.changed |= changed
+ */
+ (__pyx_v_writer->buf[__pyx_v_writer->pos]) = ((char)__pyx_v_ch);
+
+ /* "yarl/_quoting_c.pyx":119
+ * writer.size = size
+ * writer.buf[writer.pos] = <char>ch
+ * writer.pos += 1 # <<<<<<<<<<<<<<
+ * writer.changed |= changed
+ * return 0
+ */
+ __pyx_v_writer->pos = (__pyx_v_writer->pos + 1);
+
+ /* "yarl/_quoting_c.pyx":120
+ * writer.buf[writer.pos] = <char>ch
+ * writer.pos += 1
+ * writer.changed |= changed # <<<<<<<<<<<<<<
+ * return 0
+ *
+ */
+ __pyx_v_writer->changed = (__pyx_v_writer->changed | __pyx_v_changed);
+
+ /* "yarl/_quoting_c.pyx":121
+ * writer.pos += 1
+ * writer.changed |= changed
+ * return 0 # <<<<<<<<<<<<<<
+ *
+ *
+ */
+ __pyx_r = 0;
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":98
+ *
+ *
+ * cdef inline int _write_char(Writer* writer, Py_UCS4 ch, bint changed): # <<<<<<<<<<<<<<
+ * cdef char * buf
+ * cdef Py_ssize_t size
+ */
+
+ /* function exit code */
+ __pyx_L1_error:;
+ __Pyx_WriteUnraisable("yarl._quoting_c._write_char", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
+ __pyx_r = 0;
+ __pyx_L0:;
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "yarl/_quoting_c.pyx":124
+ *
+ *
+ * cdef inline int _write_pct(Writer* writer, uint8_t ch, bint changed): # <<<<<<<<<<<<<<
+ * if _write_char(writer, '%', changed) < 0:
+ * return -1
+ */
+
+static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c__write_pct(struct __pyx_t_4yarl_10_quoting_c_Writer *__pyx_v_writer, uint8_t __pyx_v_ch, int __pyx_v_changed) {
+ int __pyx_r;
+ __Pyx_RefNannyDeclarations
+ int __pyx_t_1;
+ __Pyx_RefNannySetupContext("_write_pct", 0);
+
+ /* "yarl/_quoting_c.pyx":125
+ *
+ * cdef inline int _write_pct(Writer* writer, uint8_t ch, bint changed):
+ * if _write_char(writer, '%', changed) < 0: # <<<<<<<<<<<<<<
+ * return -1
+ * if _write_char(writer, _to_hex(<uint8_t>ch >> 4), changed) < 0:
+ */
+ __pyx_t_1 = ((__pyx_f_4yarl_10_quoting_c__write_char(__pyx_v_writer, 37, __pyx_v_changed) < 0) != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":126
+ * cdef inline int _write_pct(Writer* writer, uint8_t ch, bint changed):
+ * if _write_char(writer, '%', changed) < 0:
+ * return -1 # <<<<<<<<<<<<<<
+ * if _write_char(writer, _to_hex(<uint8_t>ch >> 4), changed) < 0:
+ * return -1
+ */
+ __pyx_r = -1;
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":125
+ *
+ * cdef inline int _write_pct(Writer* writer, uint8_t ch, bint changed):
+ * if _write_char(writer, '%', changed) < 0: # <<<<<<<<<<<<<<
+ * return -1
+ * if _write_char(writer, _to_hex(<uint8_t>ch >> 4), changed) < 0:
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":127
+ * if _write_char(writer, '%', changed) < 0:
+ * return -1
+ * if _write_char(writer, _to_hex(<uint8_t>ch >> 4), changed) < 0: # <<<<<<<<<<<<<<
+ * return -1
+ * return _write_char(writer, _to_hex(<uint8_t>ch & 0x0f), changed)
+ */
+ __pyx_t_1 = ((__pyx_f_4yarl_10_quoting_c__write_char(__pyx_v_writer, __pyx_f_4yarl_10_quoting_c__to_hex((((uint8_t)__pyx_v_ch) >> 4)), __pyx_v_changed) < 0) != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":128
+ * return -1
+ * if _write_char(writer, _to_hex(<uint8_t>ch >> 4), changed) < 0:
+ * return -1 # <<<<<<<<<<<<<<
+ * return _write_char(writer, _to_hex(<uint8_t>ch & 0x0f), changed)
+ *
+ */
+ __pyx_r = -1;
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":127
+ * if _write_char(writer, '%', changed) < 0:
+ * return -1
+ * if _write_char(writer, _to_hex(<uint8_t>ch >> 4), changed) < 0: # <<<<<<<<<<<<<<
+ * return -1
+ * return _write_char(writer, _to_hex(<uint8_t>ch & 0x0f), changed)
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":129
+ * if _write_char(writer, _to_hex(<uint8_t>ch >> 4), changed) < 0:
+ * return -1
+ * return _write_char(writer, _to_hex(<uint8_t>ch & 0x0f), changed) # <<<<<<<<<<<<<<
+ *
+ *
+ */
+ __pyx_r = __pyx_f_4yarl_10_quoting_c__write_char(__pyx_v_writer, __pyx_f_4yarl_10_quoting_c__to_hex((((uint8_t)__pyx_v_ch) & 0x0f)), __pyx_v_changed);
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":124
+ *
+ *
+ * cdef inline int _write_pct(Writer* writer, uint8_t ch, bint changed): # <<<<<<<<<<<<<<
+ * if _write_char(writer, '%', changed) < 0:
+ * return -1
+ */
+
+ /* function exit code */
+ __pyx_L0:;
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "yarl/_quoting_c.pyx":132
+ *
+ *
+ * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): # <<<<<<<<<<<<<<
+ * cdef uint64_t utf = <uint64_t> symbol
+ *
+ */
+
+static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c__write_utf8(struct __pyx_t_4yarl_10_quoting_c_Writer *__pyx_v_writer, Py_UCS4 __pyx_v_symbol) {
+ uint64_t __pyx_v_utf;
+ int __pyx_r;
+ __Pyx_RefNannyDeclarations
+ int __pyx_t_1;
+ int __pyx_t_2;
+ __Pyx_RefNannySetupContext("_write_utf8", 0);
+
+ /* "yarl/_quoting_c.pyx":133
+ *
+ * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol):
+ * cdef uint64_t utf = <uint64_t> symbol # <<<<<<<<<<<<<<
+ *
+ * if utf < 0x80:
+ */
+ __pyx_v_utf = ((uint64_t)__pyx_v_symbol);
+
+ /* "yarl/_quoting_c.pyx":135
+ * cdef uint64_t utf = <uint64_t> symbol
+ *
+ * if utf < 0x80: # <<<<<<<<<<<<<<
+ * return _write_pct(writer, <uint8_t>utf, True)
+ * elif utf < 0x800:
+ */
+ __pyx_t_1 = ((__pyx_v_utf < 0x80) != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":136
+ *
+ * if utf < 0x80:
+ * return _write_pct(writer, <uint8_t>utf, True) # <<<<<<<<<<<<<<
+ * elif utf < 0x800:
+ * if _write_pct(writer, <uint8_t>(0xc0 | (utf >> 6)), True) < 0:
+ */
+ __pyx_r = __pyx_f_4yarl_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)__pyx_v_utf), 1);
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":135
+ * cdef uint64_t utf = <uint64_t> symbol
+ *
+ * if utf < 0x80: # <<<<<<<<<<<<<<
+ * return _write_pct(writer, <uint8_t>utf, True)
+ * elif utf < 0x800:
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":137
+ * if utf < 0x80:
+ * return _write_pct(writer, <uint8_t>utf, True)
+ * elif utf < 0x800: # <<<<<<<<<<<<<<
+ * if _write_pct(writer, <uint8_t>(0xc0 | (utf >> 6)), True) < 0:
+ * return -1
+ */
+ __pyx_t_1 = ((__pyx_v_utf < 0x800) != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":138
+ * return _write_pct(writer, <uint8_t>utf, True)
+ * elif utf < 0x800:
+ * if _write_pct(writer, <uint8_t>(0xc0 | (utf >> 6)), True) < 0: # <<<<<<<<<<<<<<
+ * return -1
+ * return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True)
+ */
+ __pyx_t_1 = ((__pyx_f_4yarl_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)(0xc0 | (__pyx_v_utf >> 6))), 1) < 0) != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":139
+ * elif utf < 0x800:
+ * if _write_pct(writer, <uint8_t>(0xc0 | (utf >> 6)), True) < 0:
+ * return -1 # <<<<<<<<<<<<<<
+ * return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True)
+ * elif 0xD800 <= utf <= 0xDFFF:
+ */
+ __pyx_r = -1;
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":138
+ * return _write_pct(writer, <uint8_t>utf, True)
+ * elif utf < 0x800:
+ * if _write_pct(writer, <uint8_t>(0xc0 | (utf >> 6)), True) < 0: # <<<<<<<<<<<<<<
+ * return -1
+ * return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True)
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":140
+ * if _write_pct(writer, <uint8_t>(0xc0 | (utf >> 6)), True) < 0:
+ * return -1
+ * return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True) # <<<<<<<<<<<<<<
+ * elif 0xD800 <= utf <= 0xDFFF:
+ * # surogate pair, ignored
+ */
+ __pyx_r = __pyx_f_4yarl_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f))), 1);
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":137
+ * if utf < 0x80:
+ * return _write_pct(writer, <uint8_t>utf, True)
+ * elif utf < 0x800: # <<<<<<<<<<<<<<
+ * if _write_pct(writer, <uint8_t>(0xc0 | (utf >> 6)), True) < 0:
+ * return -1
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":141
+ * return -1
+ * return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True)
+ * elif 0xD800 <= utf <= 0xDFFF: # <<<<<<<<<<<<<<
+ * # surogate pair, ignored
+ * return 0
+ */
+ __pyx_t_1 = (0xD800 <= __pyx_v_utf);
+ if (__pyx_t_1) {
+ __pyx_t_1 = (__pyx_v_utf <= 0xDFFF);
+ }
+ __pyx_t_2 = (__pyx_t_1 != 0);
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":143
+ * elif 0xD800 <= utf <= 0xDFFF:
+ * # surogate pair, ignored
+ * return 0 # <<<<<<<<<<<<<<
+ * elif utf < 0x10000:
+ * if _write_pct(writer, <uint8_t>(0xe0 | (utf >> 12)), True) < 0:
+ */
+ __pyx_r = 0;
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":141
+ * return -1
+ * return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True)
+ * elif 0xD800 <= utf <= 0xDFFF: # <<<<<<<<<<<<<<
+ * # surogate pair, ignored
+ * return 0
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":144
+ * # surogate pair, ignored
+ * return 0
+ * elif utf < 0x10000: # <<<<<<<<<<<<<<
+ * if _write_pct(writer, <uint8_t>(0xe0 | (utf >> 12)), True) < 0:
+ * return -1
+ */
+ __pyx_t_2 = ((__pyx_v_utf < 0x10000) != 0);
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":145
+ * return 0
+ * elif utf < 0x10000:
+ * if _write_pct(writer, <uint8_t>(0xe0 | (utf >> 12)), True) < 0: # <<<<<<<<<<<<<<
+ * return -1
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 6) & 0x3f)),
+ */
+ __pyx_t_2 = ((__pyx_f_4yarl_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)(0xe0 | (__pyx_v_utf >> 12))), 1) < 0) != 0);
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":146
+ * elif utf < 0x10000:
+ * if _write_pct(writer, <uint8_t>(0xe0 | (utf >> 12)), True) < 0:
+ * return -1 # <<<<<<<<<<<<<<
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 6) & 0x3f)),
+ * True) < 0:
+ */
+ __pyx_r = -1;
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":145
+ * return 0
+ * elif utf < 0x10000:
+ * if _write_pct(writer, <uint8_t>(0xe0 | (utf >> 12)), True) < 0: # <<<<<<<<<<<<<<
+ * return -1
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 6) & 0x3f)),
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":148
+ * return -1
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 6) & 0x3f)),
+ * True) < 0: # <<<<<<<<<<<<<<
+ * return -1
+ * return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True)
+ */
+ __pyx_t_2 = ((__pyx_f_4yarl_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 6) & 0x3f))), 1) < 0) != 0);
+
+ /* "yarl/_quoting_c.pyx":147
+ * if _write_pct(writer, <uint8_t>(0xe0 | (utf >> 12)), True) < 0:
+ * return -1
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 6) & 0x3f)), # <<<<<<<<<<<<<<
+ * True) < 0:
+ * return -1
+ */
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":149
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 6) & 0x3f)),
+ * True) < 0:
+ * return -1 # <<<<<<<<<<<<<<
+ * return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True)
+ * elif utf > 0x10FFFF:
+ */
+ __pyx_r = -1;
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":147
+ * if _write_pct(writer, <uint8_t>(0xe0 | (utf >> 12)), True) < 0:
+ * return -1
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 6) & 0x3f)), # <<<<<<<<<<<<<<
+ * True) < 0:
+ * return -1
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":150
+ * True) < 0:
+ * return -1
+ * return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True) # <<<<<<<<<<<<<<
+ * elif utf > 0x10FFFF:
+ * # symbol is too large
+ */
+ __pyx_r = __pyx_f_4yarl_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f))), 1);
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":144
+ * # surogate pair, ignored
+ * return 0
+ * elif utf < 0x10000: # <<<<<<<<<<<<<<
+ * if _write_pct(writer, <uint8_t>(0xe0 | (utf >> 12)), True) < 0:
+ * return -1
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":151
+ * return -1
+ * return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True)
+ * elif utf > 0x10FFFF: # <<<<<<<<<<<<<<
+ * # symbol is too large
+ * return 0
+ */
+ __pyx_t_2 = ((__pyx_v_utf > 0x10FFFF) != 0);
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":153
+ * elif utf > 0x10FFFF:
+ * # symbol is too large
+ * return 0 # <<<<<<<<<<<<<<
+ * else:
+ * if _write_pct(writer, <uint8_t>(0xf0 | (utf >> 18)), True) < 0:
+ */
+ __pyx_r = 0;
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":151
+ * return -1
+ * return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True)
+ * elif utf > 0x10FFFF: # <<<<<<<<<<<<<<
+ * # symbol is too large
+ * return 0
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":155
+ * return 0
+ * else:
+ * if _write_pct(writer, <uint8_t>(0xf0 | (utf >> 18)), True) < 0: # <<<<<<<<<<<<<<
+ * return -1
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 12) & 0x3f)),
+ */
+ /*else*/ {
+ __pyx_t_2 = ((__pyx_f_4yarl_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)(0xf0 | (__pyx_v_utf >> 18))), 1) < 0) != 0);
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":156
+ * else:
+ * if _write_pct(writer, <uint8_t>(0xf0 | (utf >> 18)), True) < 0:
+ * return -1 # <<<<<<<<<<<<<<
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 12) & 0x3f)),
+ * True) < 0:
+ */
+ __pyx_r = -1;
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":155
+ * return 0
+ * else:
+ * if _write_pct(writer, <uint8_t>(0xf0 | (utf >> 18)), True) < 0: # <<<<<<<<<<<<<<
+ * return -1
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 12) & 0x3f)),
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":158
+ * return -1
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 12) & 0x3f)),
+ * True) < 0: # <<<<<<<<<<<<<<
+ * return -1
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 6) & 0x3f)),
+ */
+ __pyx_t_2 = ((__pyx_f_4yarl_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 12) & 0x3f))), 1) < 0) != 0);
+
+ /* "yarl/_quoting_c.pyx":157
+ * if _write_pct(writer, <uint8_t>(0xf0 | (utf >> 18)), True) < 0:
+ * return -1
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 12) & 0x3f)), # <<<<<<<<<<<<<<
+ * True) < 0:
+ * return -1
+ */
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":159
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 12) & 0x3f)),
+ * True) < 0:
+ * return -1 # <<<<<<<<<<<<<<
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 6) & 0x3f)),
+ * True) < 0:
+ */
+ __pyx_r = -1;
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":157
+ * if _write_pct(writer, <uint8_t>(0xf0 | (utf >> 18)), True) < 0:
+ * return -1
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 12) & 0x3f)), # <<<<<<<<<<<<<<
+ * True) < 0:
+ * return -1
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":161
+ * return -1
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 6) & 0x3f)),
+ * True) < 0: # <<<<<<<<<<<<<<
+ * return -1
+ * return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True)
+ */
+ __pyx_t_2 = ((__pyx_f_4yarl_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 6) & 0x3f))), 1) < 0) != 0);
+
+ /* "yarl/_quoting_c.pyx":160
+ * True) < 0:
+ * return -1
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 6) & 0x3f)), # <<<<<<<<<<<<<<
+ * True) < 0:
+ * return -1
+ */
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":162
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 6) & 0x3f)),
+ * True) < 0:
+ * return -1 # <<<<<<<<<<<<<<
+ * return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True)
+ *
+ */
+ __pyx_r = -1;
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":160
+ * True) < 0:
+ * return -1
+ * if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 6) & 0x3f)), # <<<<<<<<<<<<<<
+ * True) < 0:
+ * return -1
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":163
+ * True) < 0:
+ * return -1
+ * return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True) # <<<<<<<<<<<<<<
+ *
+ *
+ */
+ __pyx_r = __pyx_f_4yarl_10_quoting_c__write_pct(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f))), 1);
+ goto __pyx_L0;
+ }
+
+ /* "yarl/_quoting_c.pyx":132
+ *
+ *
+ * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): # <<<<<<<<<<<<<<
+ * cdef uint64_t utf = <uint64_t> symbol
+ *
+ */
+
+ /* function exit code */
+ __pyx_L0:;
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "yarl/_quoting_c.pyx":176
+ * cdef uint8_t _protected_table[16]
+ *
+ * def __init__( # <<<<<<<<<<<<<<
+ * self, *, str safe='', str protected='', bint qs=False, bint requote=True,
+ * ):
+ */
+
+/* Python wrapper */
+static int __pyx_pw_4yarl_10_quoting_c_7_Quoter_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_4yarl_10_quoting_c_7_Quoter_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+ PyObject *__pyx_v_safe = 0;
+ PyObject *__pyx_v_protected = 0;
+ int __pyx_v_qs;
+ int __pyx_v_requote;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ int __pyx_r;
+ __Pyx_RefNannyDeclarations
+ __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
+ {
+ static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_safe,&__pyx_n_s_protected,&__pyx_n_s_qs,&__pyx_n_s_requote,0};
+ PyObject* values[4] = {0,0,0,0};
+ values[0] = ((PyObject*)__pyx_kp_u_);
+ values[1] = ((PyObject*)__pyx_kp_u_);
+ if (unlikely(__pyx_kwds)) {
+ Py_ssize_t kw_args;
+ const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+ switch (pos_args) {
+ case 0: break;
+ default: goto __pyx_L5_argtuple_error;
+ }
+ kw_args = PyDict_Size(__pyx_kwds);
+ if (kw_args > 0 && likely(kw_args <= 4)) {
+ Py_ssize_t index;
+ for (index = 0; index < 4 && kw_args > 0; index++) {
+ PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, *__pyx_pyargnames[index]);
+ if (value) { values[index] = value; kw_args--; }
+ }
+ }
+ if (unlikely(kw_args > 0)) {
+ if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, 0, "__init__") < 0)) __PYX_ERR(0, 176, __pyx_L3_error)
+ }
+ } else if (PyTuple_GET_SIZE(__pyx_args) != 0) {
+ goto __pyx_L5_argtuple_error;
+ } else {
+ }
+ __pyx_v_safe = ((PyObject*)values[0]);
+ __pyx_v_protected = ((PyObject*)values[1]);
+ if (values[2]) {
+ __pyx_v_qs = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_qs == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 177, __pyx_L3_error)
+ } else {
+
+ /* "yarl/_quoting_c.pyx":177
+ *
+ * def __init__(
+ * self, *, str safe='', str protected='', bint qs=False, bint requote=True, # <<<<<<<<<<<<<<
+ * ):
+ * cdef Py_UCS4 ch
+ */
+ __pyx_v_qs = ((int)0);
+ }
+ if (values[3]) {
+ __pyx_v_requote = __Pyx_PyObject_IsTrue(values[3]); if (unlikely((__pyx_v_requote == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 177, __pyx_L3_error)
+ } else {
+ __pyx_v_requote = ((int)1);
+ }
+ }
+ goto __pyx_L4_argument_unpacking_done;
+ __pyx_L5_argtuple_error:;
+ __Pyx_RaiseArgtupleInvalid("__init__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 176, __pyx_L3_error)
+ __pyx_L3_error:;
+ __Pyx_AddTraceback("yarl._quoting_c._Quoter.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __Pyx_RefNannyFinishContext();
+ return -1;
+ __pyx_L4_argument_unpacking_done:;
+ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_safe), (&PyUnicode_Type), 1, "safe", 1))) __PYX_ERR(0, 177, __pyx_L1_error)
+ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_protected), (&PyUnicode_Type), 1, "protected", 1))) __PYX_ERR(0, 177, __pyx_L1_error)
+ __pyx_r = __pyx_pf_4yarl_10_quoting_c_7_Quoter___init__(((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)__pyx_v_self), __pyx_v_safe, __pyx_v_protected, __pyx_v_qs, __pyx_v_requote);
+
+ /* "yarl/_quoting_c.pyx":176
+ * cdef uint8_t _protected_table[16]
+ *
+ * def __init__( # <<<<<<<<<<<<<<
+ * self, *, str safe='', str protected='', bint qs=False, bint requote=True,
+ * ):
+ */
+
+ /* function exit code */
+ goto __pyx_L0;
+ __pyx_L1_error:;
+ __pyx_r = -1;
+ __pyx_L0:;
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+static int __pyx_pf_4yarl_10_quoting_c_7_Quoter___init__(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, PyObject *__pyx_v_safe, PyObject *__pyx_v_protected, int __pyx_v_qs, int __pyx_v_requote) {
+ Py_UCS4 __pyx_v_ch;
+ int __pyx_r;
+ __Pyx_RefNannyDeclarations
+ int __pyx_t_1;
+ PyObject *__pyx_t_2 = NULL;
+ Py_ssize_t __pyx_t_3;
+ Py_ssize_t __pyx_t_4;
+ void *__pyx_t_5;
+ int __pyx_t_6;
+ int __pyx_t_7;
+ Py_ssize_t __pyx_t_8;
+ PyObject *__pyx_t_9 = NULL;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannySetupContext("__init__", 0);
+
+ /* "yarl/_quoting_c.pyx":181
+ * cdef Py_UCS4 ch
+ *
+ * self._qs = qs # <<<<<<<<<<<<<<
+ * self._requote = requote
+ *
+ */
+ __pyx_v_self->_qs = __pyx_v_qs;
+
+ /* "yarl/_quoting_c.pyx":182
+ *
+ * self._qs = qs
+ * self._requote = requote # <<<<<<<<<<<<<<
+ *
+ * if not self._qs:
+ */
+ __pyx_v_self->_requote = __pyx_v_requote;
+
+ /* "yarl/_quoting_c.pyx":184
+ * self._requote = requote
+ *
+ * if not self._qs: # <<<<<<<<<<<<<<
+ * memcpy(self._safe_table,
+ * ALLOWED_NOTQS_TABLE,
+ */
+ __pyx_t_1 = ((!(__pyx_v_self->_qs != 0)) != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":185
+ *
+ * if not self._qs:
+ * memcpy(self._safe_table, # <<<<<<<<<<<<<<
+ * ALLOWED_NOTQS_TABLE,
+ * sizeof(self._safe_table))
+ */
+ (void)(memcpy(__pyx_v_self->_safe_table, __pyx_v_4yarl_10_quoting_c_ALLOWED_NOTQS_TABLE, (sizeof(__pyx_v_self->_safe_table))));
+
+ /* "yarl/_quoting_c.pyx":184
+ * self._requote = requote
+ *
+ * if not self._qs: # <<<<<<<<<<<<<<
+ * memcpy(self._safe_table,
+ * ALLOWED_NOTQS_TABLE,
+ */
+ goto __pyx_L3;
+ }
+
+ /* "yarl/_quoting_c.pyx":189
+ * sizeof(self._safe_table))
+ * else:
+ * memcpy(self._safe_table, # <<<<<<<<<<<<<<
+ * ALLOWED_TABLE,
+ * sizeof(self._safe_table))
+ */
+ /*else*/ {
+
+ /* "yarl/_quoting_c.pyx":191
+ * memcpy(self._safe_table,
+ * ALLOWED_TABLE,
+ * sizeof(self._safe_table)) # <<<<<<<<<<<<<<
+ * for ch in safe:
+ * if ord(ch) > 127:
+ */
+ (void)(memcpy(__pyx_v_self->_safe_table, __pyx_v_4yarl_10_quoting_c_ALLOWED_TABLE, (sizeof(__pyx_v_self->_safe_table))));
+ }
+ __pyx_L3:;
+
+ /* "yarl/_quoting_c.pyx":192
+ * ALLOWED_TABLE,
+ * sizeof(self._safe_table))
+ * for ch in safe: # <<<<<<<<<<<<<<
+ * if ord(ch) > 127:
+ * raise ValueError("Only safe symbols with ORD < 128 are allowed")
+ */
+ if (unlikely(__pyx_v_safe == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable");
+ __PYX_ERR(0, 192, __pyx_L1_error)
+ }
+ __Pyx_INCREF(__pyx_v_safe);
+ __pyx_t_2 = __pyx_v_safe;
+ __pyx_t_7 = __Pyx_init_unicode_iteration(__pyx_t_2, (&__pyx_t_4), (&__pyx_t_5), (&__pyx_t_6)); if (unlikely(__pyx_t_7 == ((int)-1))) __PYX_ERR(0, 192, __pyx_L1_error)
+ for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_4; __pyx_t_8++) {
+ __pyx_t_3 = __pyx_t_8;
+ __pyx_v_ch = __Pyx_PyUnicode_READ(__pyx_t_6, __pyx_t_5, __pyx_t_3);
+
+ /* "yarl/_quoting_c.pyx":193
+ * sizeof(self._safe_table))
+ * for ch in safe:
+ * if ord(ch) > 127: # <<<<<<<<<<<<<<
+ * raise ValueError("Only safe symbols with ORD < 128 are allowed")
+ * set_bit(self._safe_table, ch)
+ */
+ __pyx_t_1 = ((((long)__pyx_v_ch) > 0x7F) != 0);
+ if (unlikely(__pyx_t_1)) {
+
+ /* "yarl/_quoting_c.pyx":194
+ * for ch in safe:
+ * if ord(ch) > 127:
+ * raise ValueError("Only safe symbols with ORD < 128 are allowed") # <<<<<<<<<<<<<<
+ * set_bit(self._safe_table, ch)
+ *
+ */
+ __pyx_t_9 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 194, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_9);
+ __Pyx_Raise(__pyx_t_9, 0, 0, 0);
+ __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+ __PYX_ERR(0, 194, __pyx_L1_error)
+
+ /* "yarl/_quoting_c.pyx":193
+ * sizeof(self._safe_table))
+ * for ch in safe:
+ * if ord(ch) > 127: # <<<<<<<<<<<<<<
+ * raise ValueError("Only safe symbols with ORD < 128 are allowed")
+ * set_bit(self._safe_table, ch)
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":195
+ * if ord(ch) > 127:
+ * raise ValueError("Only safe symbols with ORD < 128 are allowed")
+ * set_bit(self._safe_table, ch) # <<<<<<<<<<<<<<
+ *
+ * memset(self._protected_table, 0, sizeof(self._protected_table))
+ */
+ __pyx_f_4yarl_10_quoting_c_set_bit(__pyx_v_self->_safe_table, __pyx_v_ch);
+ }
+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+ /* "yarl/_quoting_c.pyx":197
+ * set_bit(self._safe_table, ch)
+ *
+ * memset(self._protected_table, 0, sizeof(self._protected_table)) # <<<<<<<<<<<<<<
+ * for ch in protected:
+ * if ord(ch) > 127:
+ */
+ (void)(memset(__pyx_v_self->_protected_table, 0, (sizeof(__pyx_v_self->_protected_table))));
+
+ /* "yarl/_quoting_c.pyx":198
+ *
+ * memset(self._protected_table, 0, sizeof(self._protected_table))
+ * for ch in protected: # <<<<<<<<<<<<<<
+ * if ord(ch) > 127:
+ * raise ValueError("Only safe symbols with ORD < 128 are allowed")
+ */
+ if (unlikely(__pyx_v_protected == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable");
+ __PYX_ERR(0, 198, __pyx_L1_error)
+ }
+ __Pyx_INCREF(__pyx_v_protected);
+ __pyx_t_2 = __pyx_v_protected;
+ __pyx_t_7 = __Pyx_init_unicode_iteration(__pyx_t_2, (&__pyx_t_3), (&__pyx_t_5), (&__pyx_t_6)); if (unlikely(__pyx_t_7 == ((int)-1))) __PYX_ERR(0, 198, __pyx_L1_error)
+ for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_3; __pyx_t_8++) {
+ __pyx_t_4 = __pyx_t_8;
+ __pyx_v_ch = __Pyx_PyUnicode_READ(__pyx_t_6, __pyx_t_5, __pyx_t_4);
+
+ /* "yarl/_quoting_c.pyx":199
+ * memset(self._protected_table, 0, sizeof(self._protected_table))
+ * for ch in protected:
+ * if ord(ch) > 127: # <<<<<<<<<<<<<<
+ * raise ValueError("Only safe symbols with ORD < 128 are allowed")
+ * set_bit(self._safe_table, ch)
+ */
+ __pyx_t_1 = ((((long)__pyx_v_ch) > 0x7F) != 0);
+ if (unlikely(__pyx_t_1)) {
+
+ /* "yarl/_quoting_c.pyx":200
+ * for ch in protected:
+ * if ord(ch) > 127:
+ * raise ValueError("Only safe symbols with ORD < 128 are allowed") # <<<<<<<<<<<<<<
+ * set_bit(self._safe_table, ch)
+ * set_bit(self._protected_table, ch)
+ */
+ __pyx_t_9 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 200, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_9);
+ __Pyx_Raise(__pyx_t_9, 0, 0, 0);
+ __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+ __PYX_ERR(0, 200, __pyx_L1_error)
+
+ /* "yarl/_quoting_c.pyx":199
+ * memset(self._protected_table, 0, sizeof(self._protected_table))
+ * for ch in protected:
+ * if ord(ch) > 127: # <<<<<<<<<<<<<<
+ * raise ValueError("Only safe symbols with ORD < 128 are allowed")
+ * set_bit(self._safe_table, ch)
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":201
+ * if ord(ch) > 127:
+ * raise ValueError("Only safe symbols with ORD < 128 are allowed")
+ * set_bit(self._safe_table, ch) # <<<<<<<<<<<<<<
+ * set_bit(self._protected_table, ch)
+ *
+ */
+ __pyx_f_4yarl_10_quoting_c_set_bit(__pyx_v_self->_safe_table, __pyx_v_ch);
+
+ /* "yarl/_quoting_c.pyx":202
+ * raise ValueError("Only safe symbols with ORD < 128 are allowed")
+ * set_bit(self._safe_table, ch)
+ * set_bit(self._protected_table, ch) # <<<<<<<<<<<<<<
+ *
+ * def __call__(self, val):
+ */
+ __pyx_f_4yarl_10_quoting_c_set_bit(__pyx_v_self->_protected_table, __pyx_v_ch);
+ }
+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+ /* "yarl/_quoting_c.pyx":176
+ * cdef uint8_t _protected_table[16]
+ *
+ * def __init__( # <<<<<<<<<<<<<<
+ * self, *, str safe='', str protected='', bint qs=False, bint requote=True,
+ * ):
+ */
+
+ /* function exit code */
+ __pyx_r = 0;
+ goto __pyx_L0;
+ __pyx_L1_error:;
+ __Pyx_XDECREF(__pyx_t_2);
+ __Pyx_XDECREF(__pyx_t_9);
+ __Pyx_AddTraceback("yarl._quoting_c._Quoter.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __pyx_r = -1;
+ __pyx_L0:;
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "yarl/_quoting_c.pyx":204
+ * set_bit(self._protected_table, ch)
+ *
+ * def __call__(self, val): # <<<<<<<<<<<<<<
+ * cdef Writer writer
+ * if val is None:
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_4yarl_10_quoting_c_7_Quoter_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_4yarl_10_quoting_c_7_Quoter_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+ PyObject *__pyx_v_val = 0;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ PyObject *__pyx_r = 0;
+ __Pyx_RefNannyDeclarations
+ __Pyx_RefNannySetupContext("__call__ (wrapper)", 0);
+ {
+ static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_val,0};
+ PyObject* values[1] = {0};
+ if (unlikely(__pyx_kwds)) {
+ Py_ssize_t kw_args;
+ const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+ switch (pos_args) {
+ case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+ CYTHON_FALLTHROUGH;
+ case 0: break;
+ default: goto __pyx_L5_argtuple_error;
+ }
+ kw_args = PyDict_Size(__pyx_kwds);
+ switch (pos_args) {
+ case 0:
+ if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_val)) != 0)) kw_args--;
+ else goto __pyx_L5_argtuple_error;
+ }
+ if (unlikely(kw_args > 0)) {
+ if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__call__") < 0)) __PYX_ERR(0, 204, __pyx_L3_error)
+ }
+ } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
+ goto __pyx_L5_argtuple_error;
+ } else {
+ values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+ }
+ __pyx_v_val = values[0];
+ }
+ goto __pyx_L4_argument_unpacking_done;
+ __pyx_L5_argtuple_error:;
+ __Pyx_RaiseArgtupleInvalid("__call__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 204, __pyx_L3_error)
+ __pyx_L3_error:;
+ __Pyx_AddTraceback("yarl._quoting_c._Quoter.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __Pyx_RefNannyFinishContext();
+ return NULL;
+ __pyx_L4_argument_unpacking_done:;
+ __pyx_r = __pyx_pf_4yarl_10_quoting_c_7_Quoter_2__call__(((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)__pyx_v_self), __pyx_v_val);
+
+ /* function exit code */
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+static PyObject *__pyx_pf_4yarl_10_quoting_c_7_Quoter_2__call__(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, PyObject *__pyx_v_val) {
+ struct __pyx_t_4yarl_10_quoting_c_Writer __pyx_v_writer;
+ PyObject *__pyx_r = NULL;
+ __Pyx_RefNannyDeclarations
+ int __pyx_t_1;
+ int __pyx_t_2;
+ PyObject *__pyx_t_3 = NULL;
+ int __pyx_t_4;
+ int __pyx_t_5;
+ char const *__pyx_t_6;
+ PyObject *__pyx_t_7 = NULL;
+ PyObject *__pyx_t_8 = NULL;
+ PyObject *__pyx_t_9 = NULL;
+ PyObject *__pyx_t_10 = NULL;
+ PyObject *__pyx_t_11 = NULL;
+ PyObject *__pyx_t_12 = NULL;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannySetupContext("__call__", 0);
+ __Pyx_INCREF(__pyx_v_val);
+
+ /* "yarl/_quoting_c.pyx":206
+ * def __call__(self, val):
+ * cdef Writer writer
+ * if val is None: # <<<<<<<<<<<<<<
+ * return None
+ * if type(val) is not str:
+ */
+ __pyx_t_1 = (__pyx_v_val == Py_None);
+ __pyx_t_2 = (__pyx_t_1 != 0);
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":207
+ * cdef Writer writer
+ * if val is None:
+ * return None # <<<<<<<<<<<<<<
+ * if type(val) is not str:
+ * if isinstance(val, str):
+ */
+ __Pyx_XDECREF(__pyx_r);
+ __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":206
+ * def __call__(self, val):
+ * cdef Writer writer
+ * if val is None: # <<<<<<<<<<<<<<
+ * return None
+ * if type(val) is not str:
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":208
+ * if val is None:
+ * return None
+ * if type(val) is not str: # <<<<<<<<<<<<<<
+ * if isinstance(val, str):
+ * # derived from str
+ */
+ __pyx_t_2 = (((PyObject *)Py_TYPE(__pyx_v_val)) != ((PyObject *)(&PyUnicode_Type)));
+ __pyx_t_1 = (__pyx_t_2 != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":209
+ * return None
+ * if type(val) is not str:
+ * if isinstance(val, str): # <<<<<<<<<<<<<<
+ * # derived from str
+ * val = str(val)
+ */
+ __pyx_t_1 = PyUnicode_Check(__pyx_v_val);
+ __pyx_t_2 = (__pyx_t_1 != 0);
+ if (likely(__pyx_t_2)) {
+
+ /* "yarl/_quoting_c.pyx":211
+ * if isinstance(val, str):
+ * # derived from str
+ * val = str(val) # <<<<<<<<<<<<<<
+ * else:
+ * raise TypeError("Argument should be str")
+ */
+ __pyx_t_3 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_val); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 211, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_DECREF_SET(__pyx_v_val, __pyx_t_3);
+ __pyx_t_3 = 0;
+
+ /* "yarl/_quoting_c.pyx":209
+ * return None
+ * if type(val) is not str:
+ * if isinstance(val, str): # <<<<<<<<<<<<<<
+ * # derived from str
+ * val = str(val)
+ */
+ goto __pyx_L5;
+ }
+
+ /* "yarl/_quoting_c.pyx":213
+ * val = str(val)
+ * else:
+ * raise TypeError("Argument should be str") # <<<<<<<<<<<<<<
+ * _init_writer(&writer)
+ * try:
+ */
+ /*else*/ {
+ __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 213, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+ __PYX_ERR(0, 213, __pyx_L1_error)
+ }
+ __pyx_L5:;
+
+ /* "yarl/_quoting_c.pyx":208
+ * if val is None:
+ * return None
+ * if type(val) is not str: # <<<<<<<<<<<<<<
+ * if isinstance(val, str):
+ * # derived from str
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":214
+ * else:
+ * raise TypeError("Argument should be str")
+ * _init_writer(&writer) # <<<<<<<<<<<<<<
+ * try:
+ * return self._do_quote(<str>val, &writer)
+ */
+ __pyx_f_4yarl_10_quoting_c__init_writer((&__pyx_v_writer));
+
+ /* "yarl/_quoting_c.pyx":215
+ * raise TypeError("Argument should be str")
+ * _init_writer(&writer)
+ * try: # <<<<<<<<<<<<<<
+ * return self._do_quote(<str>val, &writer)
+ * finally:
+ */
+ /*try:*/ {
+
+ /* "yarl/_quoting_c.pyx":216
+ * _init_writer(&writer)
+ * try:
+ * return self._do_quote(<str>val, &writer) # <<<<<<<<<<<<<<
+ * finally:
+ * _release_writer(&writer)
+ */
+ __Pyx_XDECREF(__pyx_r);
+ __pyx_t_3 = ((struct __pyx_vtabstruct_4yarl_10_quoting_c__Quoter *)__pyx_v_self->__pyx_vtab)->_do_quote(__pyx_v_self, ((PyObject*)__pyx_v_val), (&__pyx_v_writer)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 216, __pyx_L7_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __pyx_r = __pyx_t_3;
+ __pyx_t_3 = 0;
+ goto __pyx_L6_return;
+ }
+
+ /* "yarl/_quoting_c.pyx":218
+ * return self._do_quote(<str>val, &writer)
+ * finally:
+ * _release_writer(&writer) # <<<<<<<<<<<<<<
+ *
+ * cdef str _do_quote(self, str val, Writer *writer):
+ */
+ /*finally:*/ {
+ __pyx_L7_error:;
+ /*exception exit:*/{
+ __Pyx_PyThreadState_declare
+ __Pyx_PyThreadState_assign
+ __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0;
+ __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+ if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12);
+ if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9) < 0)) __Pyx_ErrFetch(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9);
+ __Pyx_XGOTREF(__pyx_t_7);
+ __Pyx_XGOTREF(__pyx_t_8);
+ __Pyx_XGOTREF(__pyx_t_9);
+ __Pyx_XGOTREF(__pyx_t_10);
+ __Pyx_XGOTREF(__pyx_t_11);
+ __Pyx_XGOTREF(__pyx_t_12);
+ __pyx_t_4 = __pyx_lineno; __pyx_t_5 = __pyx_clineno; __pyx_t_6 = __pyx_filename;
+ {
+ __pyx_f_4yarl_10_quoting_c__release_writer((&__pyx_v_writer));
+ }
+ if (PY_MAJOR_VERSION >= 3) {
+ __Pyx_XGIVEREF(__pyx_t_10);
+ __Pyx_XGIVEREF(__pyx_t_11);
+ __Pyx_XGIVEREF(__pyx_t_12);
+ __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12);
+ }
+ __Pyx_XGIVEREF(__pyx_t_7);
+ __Pyx_XGIVEREF(__pyx_t_8);
+ __Pyx_XGIVEREF(__pyx_t_9);
+ __Pyx_ErrRestore(__pyx_t_7, __pyx_t_8, __pyx_t_9);
+ __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0;
+ __pyx_lineno = __pyx_t_4; __pyx_clineno = __pyx_t_5; __pyx_filename = __pyx_t_6;
+ goto __pyx_L1_error;
+ }
+ __pyx_L6_return: {
+ __pyx_t_12 = __pyx_r;
+ __pyx_r = 0;
+ __pyx_f_4yarl_10_quoting_c__release_writer((&__pyx_v_writer));
+ __pyx_r = __pyx_t_12;
+ __pyx_t_12 = 0;
+ goto __pyx_L0;
+ }
+ }
+
+ /* "yarl/_quoting_c.pyx":204
+ * set_bit(self._protected_table, ch)
+ *
+ * def __call__(self, val): # <<<<<<<<<<<<<<
+ * cdef Writer writer
+ * if val is None:
+ */
+
+ /* function exit code */
+ __pyx_L1_error:;
+ __Pyx_XDECREF(__pyx_t_3);
+ __Pyx_AddTraceback("yarl._quoting_c._Quoter.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __pyx_r = NULL;
+ __pyx_L0:;
+ __Pyx_XDECREF(__pyx_v_val);
+ __Pyx_XGIVEREF(__pyx_r);
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "yarl/_quoting_c.pyx":220
+ * _release_writer(&writer)
+ *
+ * cdef str _do_quote(self, str val, Writer *writer): # <<<<<<<<<<<<<<
+ * cdef Py_UCS4 ch
+ * cdef int changed
+ */
+
+static PyObject *__pyx_f_4yarl_10_quoting_c_7_Quoter__do_quote(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, PyObject *__pyx_v_val, struct __pyx_t_4yarl_10_quoting_c_Writer *__pyx_v_writer) {
+ Py_UCS4 __pyx_v_ch;
+ int __pyx_v_changed;
+ int __pyx_v_idx;
+ int __pyx_v_length;
+ PyObject *__pyx_r = NULL;
+ __Pyx_RefNannyDeclarations
+ Py_ssize_t __pyx_t_1;
+ int __pyx_t_2;
+ Py_UCS4 __pyx_t_3;
+ int __pyx_t_4;
+ long __pyx_t_5;
+ Py_UCS4 __pyx_t_6;
+ int __pyx_t_7;
+ int __pyx_t_8;
+ PyObject *__pyx_t_9 = NULL;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannySetupContext("_do_quote", 0);
+
+ /* "yarl/_quoting_c.pyx":223
+ * cdef Py_UCS4 ch
+ * cdef int changed
+ * cdef int idx = 0 # <<<<<<<<<<<<<<
+ * cdef int length = len(val)
+ *
+ */
+ __pyx_v_idx = 0;
+
+ /* "yarl/_quoting_c.pyx":224
+ * cdef int changed
+ * cdef int idx = 0
+ * cdef int length = len(val) # <<<<<<<<<<<<<<
+ *
+ * while idx < length:
+ */
+ if (unlikely(__pyx_v_val == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
+ __PYX_ERR(0, 224, __pyx_L1_error)
+ }
+ __pyx_t_1 = __Pyx_PyUnicode_GET_LENGTH(__pyx_v_val); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 224, __pyx_L1_error)
+ __pyx_v_length = __pyx_t_1;
+
+ /* "yarl/_quoting_c.pyx":226
+ * cdef int length = len(val)
+ *
+ * while idx < length: # <<<<<<<<<<<<<<
+ * ch = val[idx]
+ * idx += 1
+ */
+ while (1) {
+ __pyx_t_2 = ((__pyx_v_idx < __pyx_v_length) != 0);
+ if (!__pyx_t_2) break;
+
+ /* "yarl/_quoting_c.pyx":227
+ *
+ * while idx < length:
+ * ch = val[idx] # <<<<<<<<<<<<<<
+ * idx += 1
+ * if ch == '%' and self._requote and idx <= length - 2:
+ */
+ __pyx_t_3 = __Pyx_GetItemInt_Unicode(__pyx_v_val, __pyx_v_idx, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(__pyx_t_3 == (Py_UCS4)-1)) __PYX_ERR(0, 227, __pyx_L1_error)
+ __pyx_v_ch = __pyx_t_3;
+
+ /* "yarl/_quoting_c.pyx":228
+ * while idx < length:
+ * ch = val[idx]
+ * idx += 1 # <<<<<<<<<<<<<<
+ * if ch == '%' and self._requote and idx <= length - 2:
+ * ch = _restore_ch(val[idx], val[idx + 1])
+ */
+ __pyx_v_idx = (__pyx_v_idx + 1);
+
+ /* "yarl/_quoting_c.pyx":229
+ * ch = val[idx]
+ * idx += 1
+ * if ch == '%' and self._requote and idx <= length - 2: # <<<<<<<<<<<<<<
+ * ch = _restore_ch(val[idx], val[idx + 1])
+ * if ch != <Py_UCS4>-1:
+ */
+ __pyx_t_4 = ((__pyx_v_ch == 37) != 0);
+ if (__pyx_t_4) {
+ } else {
+ __pyx_t_2 = __pyx_t_4;
+ goto __pyx_L6_bool_binop_done;
+ }
+ __pyx_t_4 = (__pyx_v_self->_requote != 0);
+ if (__pyx_t_4) {
+ } else {
+ __pyx_t_2 = __pyx_t_4;
+ goto __pyx_L6_bool_binop_done;
+ }
+ __pyx_t_4 = ((__pyx_v_idx <= (__pyx_v_length - 2)) != 0);
+ __pyx_t_2 = __pyx_t_4;
+ __pyx_L6_bool_binop_done:;
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":230
+ * idx += 1
+ * if ch == '%' and self._requote and idx <= length - 2:
+ * ch = _restore_ch(val[idx], val[idx + 1]) # <<<<<<<<<<<<<<
+ * if ch != <Py_UCS4>-1:
+ * idx += 2
+ */
+ __pyx_t_3 = __Pyx_GetItemInt_Unicode(__pyx_v_val, __pyx_v_idx, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(__pyx_t_3 == (Py_UCS4)-1)) __PYX_ERR(0, 230, __pyx_L1_error)
+ __pyx_t_5 = (__pyx_v_idx + 1);
+ __pyx_t_6 = __Pyx_GetItemInt_Unicode(__pyx_v_val, __pyx_t_5, long, 1, __Pyx_PyInt_From_long, 0, 1, 1); if (unlikely(__pyx_t_6 == (Py_UCS4)-1)) __PYX_ERR(0, 230, __pyx_L1_error)
+ __pyx_v_ch = __pyx_f_4yarl_10_quoting_c__restore_ch(__pyx_t_3, __pyx_t_6);
+
+ /* "yarl/_quoting_c.pyx":231
+ * if ch == '%' and self._requote and idx <= length - 2:
+ * ch = _restore_ch(val[idx], val[idx + 1])
+ * if ch != <Py_UCS4>-1: # <<<<<<<<<<<<<<
+ * idx += 2
+ * if ch < 128:
+ */
+ __pyx_t_2 = ((__pyx_v_ch != ((Py_UCS4)-1L)) != 0);
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":232
+ * ch = _restore_ch(val[idx], val[idx + 1])
+ * if ch != <Py_UCS4>-1:
+ * idx += 2 # <<<<<<<<<<<<<<
+ * if ch < 128:
+ * if bit_at(self._protected_table, ch):
+ */
+ __pyx_v_idx = (__pyx_v_idx + 2);
+
+ /* "yarl/_quoting_c.pyx":233
+ * if ch != <Py_UCS4>-1:
+ * idx += 2
+ * if ch < 128: # <<<<<<<<<<<<<<
+ * if bit_at(self._protected_table, ch):
+ * if _write_pct(writer, ch, True) < 0:
+ */
+ __pyx_t_2 = ((__pyx_v_ch < 0x80) != 0);
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":234
+ * idx += 2
+ * if ch < 128:
+ * if bit_at(self._protected_table, ch): # <<<<<<<<<<<<<<
+ * if _write_pct(writer, ch, True) < 0:
+ * raise
+ */
+ __pyx_t_2 = (__pyx_f_4yarl_10_quoting_c_bit_at(__pyx_v_self->_protected_table, __pyx_v_ch) != 0);
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":235
+ * if ch < 128:
+ * if bit_at(self._protected_table, ch):
+ * if _write_pct(writer, ch, True) < 0: # <<<<<<<<<<<<<<
+ * raise
+ * continue
+ */
+ __pyx_t_2 = ((__pyx_f_4yarl_10_quoting_c__write_pct(__pyx_v_writer, __pyx_v_ch, 1) < 0) != 0);
+ if (unlikely(__pyx_t_2)) {
+
+ /* "yarl/_quoting_c.pyx":236
+ * if bit_at(self._protected_table, ch):
+ * if _write_pct(writer, ch, True) < 0:
+ * raise # <<<<<<<<<<<<<<
+ * continue
+ *
+ */
+ __Pyx_ReraiseException(); __PYX_ERR(0, 236, __pyx_L1_error)
+
+ /* "yarl/_quoting_c.pyx":235
+ * if ch < 128:
+ * if bit_at(self._protected_table, ch):
+ * if _write_pct(writer, ch, True) < 0: # <<<<<<<<<<<<<<
+ * raise
+ * continue
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":237
+ * if _write_pct(writer, ch, True) < 0:
+ * raise
+ * continue # <<<<<<<<<<<<<<
+ *
+ * if bit_at(self._safe_table, ch):
+ */
+ goto __pyx_L3_continue;
+
+ /* "yarl/_quoting_c.pyx":234
+ * idx += 2
+ * if ch < 128:
+ * if bit_at(self._protected_table, ch): # <<<<<<<<<<<<<<
+ * if _write_pct(writer, ch, True) < 0:
+ * raise
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":239
+ * continue
+ *
+ * if bit_at(self._safe_table, ch): # <<<<<<<<<<<<<<
+ * if _write_char(writer, ch, True) < 0:
+ * raise
+ */
+ __pyx_t_2 = (__pyx_f_4yarl_10_quoting_c_bit_at(__pyx_v_self->_safe_table, __pyx_v_ch) != 0);
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":240
+ *
+ * if bit_at(self._safe_table, ch):
+ * if _write_char(writer, ch, True) < 0: # <<<<<<<<<<<<<<
+ * raise
+ * continue
+ */
+ __pyx_t_2 = ((__pyx_f_4yarl_10_quoting_c__write_char(__pyx_v_writer, __pyx_v_ch, 1) < 0) != 0);
+ if (unlikely(__pyx_t_2)) {
+
+ /* "yarl/_quoting_c.pyx":241
+ * if bit_at(self._safe_table, ch):
+ * if _write_char(writer, ch, True) < 0:
+ * raise # <<<<<<<<<<<<<<
+ * continue
+ *
+ */
+ __Pyx_ReraiseException(); __PYX_ERR(0, 241, __pyx_L1_error)
+
+ /* "yarl/_quoting_c.pyx":240
+ *
+ * if bit_at(self._safe_table, ch):
+ * if _write_char(writer, ch, True) < 0: # <<<<<<<<<<<<<<
+ * raise
+ * continue
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":242
+ * if _write_char(writer, ch, True) < 0:
+ * raise
+ * continue # <<<<<<<<<<<<<<
+ *
+ * changed = (_is_lower_hex(val[idx - 2]) or
+ */
+ goto __pyx_L3_continue;
+
+ /* "yarl/_quoting_c.pyx":239
+ * continue
+ *
+ * if bit_at(self._safe_table, ch): # <<<<<<<<<<<<<<
+ * if _write_char(writer, ch, True) < 0:
+ * raise
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":233
+ * if ch != <Py_UCS4>-1:
+ * idx += 2
+ * if ch < 128: # <<<<<<<<<<<<<<
+ * if bit_at(self._protected_table, ch):
+ * if _write_pct(writer, ch, True) < 0:
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":244
+ * continue
+ *
+ * changed = (_is_lower_hex(val[idx - 2]) or # <<<<<<<<<<<<<<
+ * _is_lower_hex(val[idx - 1]))
+ * if _write_pct(writer, ch, changed) < 0:
+ */
+ __pyx_t_5 = (__pyx_v_idx - 2);
+ __pyx_t_6 = __Pyx_GetItemInt_Unicode(__pyx_v_val, __pyx_t_5, long, 1, __Pyx_PyInt_From_long, 0, 1, 1); if (unlikely(__pyx_t_6 == (Py_UCS4)-1)) __PYX_ERR(0, 244, __pyx_L1_error)
+ __pyx_t_8 = __pyx_f_4yarl_10_quoting_c__is_lower_hex(__pyx_t_6);
+ if (!__pyx_t_8) {
+ } else {
+ __pyx_t_7 = __pyx_t_8;
+ goto __pyx_L15_bool_binop_done;
+ }
+
+ /* "yarl/_quoting_c.pyx":245
+ *
+ * changed = (_is_lower_hex(val[idx - 2]) or
+ * _is_lower_hex(val[idx - 1])) # <<<<<<<<<<<<<<
+ * if _write_pct(writer, ch, changed) < 0:
+ * raise
+ */
+ __pyx_t_5 = (__pyx_v_idx - 1);
+ __pyx_t_6 = __Pyx_GetItemInt_Unicode(__pyx_v_val, __pyx_t_5, long, 1, __Pyx_PyInt_From_long, 0, 1, 1); if (unlikely(__pyx_t_6 == (Py_UCS4)-1)) __PYX_ERR(0, 245, __pyx_L1_error)
+ __pyx_t_8 = __pyx_f_4yarl_10_quoting_c__is_lower_hex(__pyx_t_6);
+ __pyx_t_7 = __pyx_t_8;
+ __pyx_L15_bool_binop_done:;
+ __pyx_v_changed = __pyx_t_7;
+
+ /* "yarl/_quoting_c.pyx":246
+ * changed = (_is_lower_hex(val[idx - 2]) or
+ * _is_lower_hex(val[idx - 1]))
+ * if _write_pct(writer, ch, changed) < 0: # <<<<<<<<<<<<<<
+ * raise
+ * continue
+ */
+ __pyx_t_2 = ((__pyx_f_4yarl_10_quoting_c__write_pct(__pyx_v_writer, __pyx_v_ch, __pyx_v_changed) < 0) != 0);
+ if (unlikely(__pyx_t_2)) {
+
+ /* "yarl/_quoting_c.pyx":247
+ * _is_lower_hex(val[idx - 1]))
+ * if _write_pct(writer, ch, changed) < 0:
+ * raise # <<<<<<<<<<<<<<
+ * continue
+ * else:
+ */
+ __Pyx_ReraiseException(); __PYX_ERR(0, 247, __pyx_L1_error)
+
+ /* "yarl/_quoting_c.pyx":246
+ * changed = (_is_lower_hex(val[idx - 2]) or
+ * _is_lower_hex(val[idx - 1]))
+ * if _write_pct(writer, ch, changed) < 0: # <<<<<<<<<<<<<<
+ * raise
+ * continue
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":248
+ * if _write_pct(writer, ch, changed) < 0:
+ * raise
+ * continue # <<<<<<<<<<<<<<
+ * else:
+ * ch = '%'
+ */
+ goto __pyx_L3_continue;
+
+ /* "yarl/_quoting_c.pyx":231
+ * if ch == '%' and self._requote and idx <= length - 2:
+ * ch = _restore_ch(val[idx], val[idx + 1])
+ * if ch != <Py_UCS4>-1: # <<<<<<<<<<<<<<
+ * idx += 2
+ * if ch < 128:
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":250
+ * continue
+ * else:
+ * ch = '%' # <<<<<<<<<<<<<<
+ *
+ * if self._write(writer, ch) < 0:
+ */
+ /*else*/ {
+ __pyx_v_ch = 37;
+ }
+
+ /* "yarl/_quoting_c.pyx":229
+ * ch = val[idx]
+ * idx += 1
+ * if ch == '%' and self._requote and idx <= length - 2: # <<<<<<<<<<<<<<
+ * ch = _restore_ch(val[idx], val[idx + 1])
+ * if ch != <Py_UCS4>-1:
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":252
+ * ch = '%'
+ *
+ * if self._write(writer, ch) < 0: # <<<<<<<<<<<<<<
+ * raise
+ *
+ */
+ __pyx_t_2 = ((__pyx_f_4yarl_10_quoting_c_7_Quoter__write(__pyx_v_self, __pyx_v_writer, __pyx_v_ch) < 0) != 0);
+ if (unlikely(__pyx_t_2)) {
+
+ /* "yarl/_quoting_c.pyx":253
+ *
+ * if self._write(writer, ch) < 0:
+ * raise # <<<<<<<<<<<<<<
+ *
+ * if not writer.changed:
+ */
+ __Pyx_ReraiseException(); __PYX_ERR(0, 253, __pyx_L1_error)
+
+ /* "yarl/_quoting_c.pyx":252
+ * ch = '%'
+ *
+ * if self._write(writer, ch) < 0: # <<<<<<<<<<<<<<
+ * raise
+ *
+ */
+ }
+ __pyx_L3_continue:;
+ }
+
+ /* "yarl/_quoting_c.pyx":255
+ * raise
+ *
+ * if not writer.changed: # <<<<<<<<<<<<<<
+ * return val
+ * else:
+ */
+ __pyx_t_2 = ((!(__pyx_v_writer->changed != 0)) != 0);
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":256
+ *
+ * if not writer.changed:
+ * return val # <<<<<<<<<<<<<<
+ * else:
+ * return PyUnicode_DecodeASCII(writer.buf, writer.pos, "strict")
+ */
+ __Pyx_XDECREF(__pyx_r);
+ __Pyx_INCREF(__pyx_v_val);
+ __pyx_r = __pyx_v_val;
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":255
+ * raise
+ *
+ * if not writer.changed: # <<<<<<<<<<<<<<
+ * return val
+ * else:
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":258
+ * return val
+ * else:
+ * return PyUnicode_DecodeASCII(writer.buf, writer.pos, "strict") # <<<<<<<<<<<<<<
+ *
+ * cdef inline int _write(self, Writer *writer, Py_UCS4 ch):
+ */
+ /*else*/ {
+ __Pyx_XDECREF(__pyx_r);
+ __pyx_t_9 = PyUnicode_DecodeASCII(__pyx_v_writer->buf, __pyx_v_writer->pos, ((char *)"strict")); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 258, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_9);
+ __pyx_r = ((PyObject*)__pyx_t_9);
+ __pyx_t_9 = 0;
+ goto __pyx_L0;
+ }
+
+ /* "yarl/_quoting_c.pyx":220
+ * _release_writer(&writer)
+ *
+ * cdef str _do_quote(self, str val, Writer *writer): # <<<<<<<<<<<<<<
+ * cdef Py_UCS4 ch
+ * cdef int changed
+ */
+
+ /* function exit code */
+ __pyx_L1_error:;
+ __Pyx_XDECREF(__pyx_t_9);
+ __Pyx_AddTraceback("yarl._quoting_c._Quoter._do_quote", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __pyx_r = 0;
+ __pyx_L0:;
+ __Pyx_XGIVEREF(__pyx_r);
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "yarl/_quoting_c.pyx":260
+ * return PyUnicode_DecodeASCII(writer.buf, writer.pos, "strict")
+ *
+ * cdef inline int _write(self, Writer *writer, Py_UCS4 ch): # <<<<<<<<<<<<<<
+ * if self._qs:
+ * if ch == ' ':
+ */
+
+static CYTHON_INLINE int __pyx_f_4yarl_10_quoting_c_7_Quoter__write(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, struct __pyx_t_4yarl_10_quoting_c_Writer *__pyx_v_writer, Py_UCS4 __pyx_v_ch) {
+ int __pyx_r;
+ __Pyx_RefNannyDeclarations
+ int __pyx_t_1;
+ int __pyx_t_2;
+ __Pyx_RefNannySetupContext("_write", 0);
+
+ /* "yarl/_quoting_c.pyx":261
+ *
+ * cdef inline int _write(self, Writer *writer, Py_UCS4 ch):
+ * if self._qs: # <<<<<<<<<<<<<<
+ * if ch == ' ':
+ * return _write_char(writer, '+', True)
+ */
+ __pyx_t_1 = (__pyx_v_self->_qs != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":262
+ * cdef inline int _write(self, Writer *writer, Py_UCS4 ch):
+ * if self._qs:
+ * if ch == ' ': # <<<<<<<<<<<<<<
+ * return _write_char(writer, '+', True)
+ *
+ */
+ __pyx_t_1 = ((__pyx_v_ch == 32) != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":263
+ * if self._qs:
+ * if ch == ' ':
+ * return _write_char(writer, '+', True) # <<<<<<<<<<<<<<
+ *
+ * if ch < 128 and bit_at(self._safe_table, ch):
+ */
+ __pyx_r = __pyx_f_4yarl_10_quoting_c__write_char(__pyx_v_writer, 43, 1);
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":262
+ * cdef inline int _write(self, Writer *writer, Py_UCS4 ch):
+ * if self._qs:
+ * if ch == ' ': # <<<<<<<<<<<<<<
+ * return _write_char(writer, '+', True)
+ *
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":261
+ *
+ * cdef inline int _write(self, Writer *writer, Py_UCS4 ch):
+ * if self._qs: # <<<<<<<<<<<<<<
+ * if ch == ' ':
+ * return _write_char(writer, '+', True)
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":265
+ * return _write_char(writer, '+', True)
+ *
+ * if ch < 128 and bit_at(self._safe_table, ch): # <<<<<<<<<<<<<<
+ * return _write_char(writer, ch, False)
+ *
+ */
+ __pyx_t_2 = ((__pyx_v_ch < 0x80) != 0);
+ if (__pyx_t_2) {
+ } else {
+ __pyx_t_1 = __pyx_t_2;
+ goto __pyx_L6_bool_binop_done;
+ }
+ __pyx_t_2 = (__pyx_f_4yarl_10_quoting_c_bit_at(__pyx_v_self->_safe_table, __pyx_v_ch) != 0);
+ __pyx_t_1 = __pyx_t_2;
+ __pyx_L6_bool_binop_done:;
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":266
+ *
+ * if ch < 128 and bit_at(self._safe_table, ch):
+ * return _write_char(writer, ch, False) # <<<<<<<<<<<<<<
+ *
+ * return _write_utf8(writer, ch)
+ */
+ __pyx_r = __pyx_f_4yarl_10_quoting_c__write_char(__pyx_v_writer, __pyx_v_ch, 0);
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":265
+ * return _write_char(writer, '+', True)
+ *
+ * if ch < 128 and bit_at(self._safe_table, ch): # <<<<<<<<<<<<<<
+ * return _write_char(writer, ch, False)
+ *
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":268
+ * return _write_char(writer, ch, False)
+ *
+ * return _write_utf8(writer, ch) # <<<<<<<<<<<<<<
+ *
+ *
+ */
+ __pyx_r = __pyx_f_4yarl_10_quoting_c__write_utf8(__pyx_v_writer, __pyx_v_ch);
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":260
+ * return PyUnicode_DecodeASCII(writer.buf, writer.pos, "strict")
+ *
+ * cdef inline int _write(self, Writer *writer, Py_UCS4 ch): # <<<<<<<<<<<<<<
+ * if self._qs:
+ * if ch == ' ':
+ */
+
+ /* function exit code */
+ __pyx_L0:;
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self): # <<<<<<<<<<<<<<
+ * cdef tuple state
+ * cdef object _dict
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_4yarl_10_quoting_c_7_Quoter_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_4yarl_10_quoting_c_7_Quoter_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+ PyObject *__pyx_r = 0;
+ __Pyx_RefNannyDeclarations
+ __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+ __pyx_r = __pyx_pf_4yarl_10_quoting_c_7_Quoter_4__reduce_cython__(((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)__pyx_v_self));
+
+ /* function exit code */
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+static PyObject *__pyx_pf_4yarl_10_quoting_c_7_Quoter_4__reduce_cython__(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self) {
+ PyObject *__pyx_v_state = 0;
+ PyObject *__pyx_v__dict = 0;
+ int __pyx_v_use_setstate;
+ PyObject *__pyx_r = NULL;
+ __Pyx_RefNannyDeclarations
+ PyObject *__pyx_t_1 = NULL;
+ PyObject *__pyx_t_2 = NULL;
+ PyObject *__pyx_t_3 = NULL;
+ PyObject *__pyx_t_4 = NULL;
+ PyObject *__pyx_t_5 = NULL;
+ int __pyx_t_6;
+ int __pyx_t_7;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannySetupContext("__reduce_cython__", 0);
+
+ /* "(tree fragment)":5
+ * cdef object _dict
+ * cdef bint use_setstate
+ * state = (self._protected_table, self._qs, self._requote, self._safe_table) # <<<<<<<<<<<<<<
+ * _dict = getattr(self, '__dict__', None)
+ * if _dict is not None:
+ */
+ __pyx_t_1 = __Pyx_PyObject_FromCString(__pyx_v_self->_protected_table); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->_qs); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_2);
+ __pyx_t_3 = __Pyx_PyBool_FromLong(__pyx_v_self->_requote); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __pyx_t_4 = __Pyx_PyObject_FromCString(__pyx_v_self->_safe_table); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 5, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_4);
+ __pyx_t_5 = PyTuple_New(4); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 5, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_5);
+ __Pyx_GIVEREF(__pyx_t_1);
+ PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
+ __Pyx_GIVEREF(__pyx_t_2);
+ PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2);
+ __Pyx_GIVEREF(__pyx_t_3);
+ PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_3);
+ __Pyx_GIVEREF(__pyx_t_4);
+ PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_4);
+ __pyx_t_1 = 0;
+ __pyx_t_2 = 0;
+ __pyx_t_3 = 0;
+ __pyx_t_4 = 0;
+ __pyx_v_state = ((PyObject*)__pyx_t_5);
+ __pyx_t_5 = 0;
+
+ /* "(tree fragment)":6
+ * cdef bint use_setstate
+ * state = (self._protected_table, self._qs, self._requote, self._safe_table)
+ * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<<
+ * if _dict is not None:
+ * state += (_dict,)
+ */
+ __pyx_t_5 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 6, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_5);
+ __pyx_v__dict = __pyx_t_5;
+ __pyx_t_5 = 0;
+
+ /* "(tree fragment)":7
+ * state = (self._protected_table, self._qs, self._requote, self._safe_table)
+ * _dict = getattr(self, '__dict__', None)
+ * if _dict is not None: # <<<<<<<<<<<<<<
+ * state += (_dict,)
+ * use_setstate = True
+ */
+ __pyx_t_6 = (__pyx_v__dict != Py_None);
+ __pyx_t_7 = (__pyx_t_6 != 0);
+ if (__pyx_t_7) {
+
+ /* "(tree fragment)":8
+ * _dict = getattr(self, '__dict__', None)
+ * if _dict is not None:
+ * state += (_dict,) # <<<<<<<<<<<<<<
+ * use_setstate = True
+ * else:
+ */
+ __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 8, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_5);
+ __Pyx_INCREF(__pyx_v__dict);
+ __Pyx_GIVEREF(__pyx_v__dict);
+ PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v__dict);
+ __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 8, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_4);
+ __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+ __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_4));
+ __pyx_t_4 = 0;
+
+ /* "(tree fragment)":9
+ * if _dict is not None:
+ * state += (_dict,)
+ * use_setstate = True # <<<<<<<<<<<<<<
+ * else:
+ * use_setstate = False
+ */
+ __pyx_v_use_setstate = 1;
+
+ /* "(tree fragment)":7
+ * state = (self._protected_table, self._qs, self._requote, self._safe_table)
+ * _dict = getattr(self, '__dict__', None)
+ * if _dict is not None: # <<<<<<<<<<<<<<
+ * state += (_dict,)
+ * use_setstate = True
+ */
+ goto __pyx_L3;
+ }
+
+ /* "(tree fragment)":11
+ * use_setstate = True
+ * else:
+ * use_setstate = False # <<<<<<<<<<<<<<
+ * if use_setstate:
+ * return __pyx_unpickle__Quoter, (type(self), 0xe91bd35, None), state
+ */
+ /*else*/ {
+ __pyx_v_use_setstate = 0;
+ }
+ __pyx_L3:;
+
+ /* "(tree fragment)":12
+ * else:
+ * use_setstate = False
+ * if use_setstate: # <<<<<<<<<<<<<<
+ * return __pyx_unpickle__Quoter, (type(self), 0xe91bd35, None), state
+ * else:
+ */
+ __pyx_t_7 = (__pyx_v_use_setstate != 0);
+ if (__pyx_t_7) {
+
+ /* "(tree fragment)":13
+ * use_setstate = False
+ * if use_setstate:
+ * return __pyx_unpickle__Quoter, (type(self), 0xe91bd35, None), state # <<<<<<<<<<<<<<
+ * else:
+ * return __pyx_unpickle__Quoter, (type(self), 0xe91bd35, state)
+ */
+ __Pyx_XDECREF(__pyx_r);
+ __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle__Quoter); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_4);
+ __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 13, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_5);
+ __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+ __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+ PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+ __Pyx_INCREF(__pyx_int_244432181);
+ __Pyx_GIVEREF(__pyx_int_244432181);
+ PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_int_244432181);
+ __Pyx_INCREF(Py_None);
+ __Pyx_GIVEREF(Py_None);
+ PyTuple_SET_ITEM(__pyx_t_5, 2, Py_None);
+ __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_GIVEREF(__pyx_t_4);
+ PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
+ __Pyx_GIVEREF(__pyx_t_5);
+ PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5);
+ __Pyx_INCREF(__pyx_v_state);
+ __Pyx_GIVEREF(__pyx_v_state);
+ PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_state);
+ __pyx_t_4 = 0;
+ __pyx_t_5 = 0;
+ __pyx_r = __pyx_t_3;
+ __pyx_t_3 = 0;
+ goto __pyx_L0;
+
+ /* "(tree fragment)":12
+ * else:
+ * use_setstate = False
+ * if use_setstate: # <<<<<<<<<<<<<<
+ * return __pyx_unpickle__Quoter, (type(self), 0xe91bd35, None), state
+ * else:
+ */
+ }
+
+ /* "(tree fragment)":15
+ * return __pyx_unpickle__Quoter, (type(self), 0xe91bd35, None), state
+ * else:
+ * return __pyx_unpickle__Quoter, (type(self), 0xe91bd35, state) # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ * __pyx_unpickle__Quoter__set_state(self, __pyx_state)
+ */
+ /*else*/ {
+ __Pyx_XDECREF(__pyx_r);
+ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_pyx_unpickle__Quoter); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 15, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 15, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_5);
+ __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+ __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+ PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+ __Pyx_INCREF(__pyx_int_244432181);
+ __Pyx_GIVEREF(__pyx_int_244432181);
+ PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_int_244432181);
+ __Pyx_INCREF(__pyx_v_state);
+ __Pyx_GIVEREF(__pyx_v_state);
+ PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_v_state);
+ __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_4);
+ __Pyx_GIVEREF(__pyx_t_3);
+ PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
+ __Pyx_GIVEREF(__pyx_t_5);
+ PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_5);
+ __pyx_t_3 = 0;
+ __pyx_t_5 = 0;
+ __pyx_r = __pyx_t_4;
+ __pyx_t_4 = 0;
+ goto __pyx_L0;
+ }
+
+ /* "(tree fragment)":1
+ * def __reduce_cython__(self): # <<<<<<<<<<<<<<
+ * cdef tuple state
+ * cdef object _dict
+ */
+
+ /* function exit code */
+ __pyx_L1_error:;
+ __Pyx_XDECREF(__pyx_t_1);
+ __Pyx_XDECREF(__pyx_t_2);
+ __Pyx_XDECREF(__pyx_t_3);
+ __Pyx_XDECREF(__pyx_t_4);
+ __Pyx_XDECREF(__pyx_t_5);
+ __Pyx_AddTraceback("yarl._quoting_c._Quoter.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __pyx_r = NULL;
+ __pyx_L0:;
+ __Pyx_XDECREF(__pyx_v_state);
+ __Pyx_XDECREF(__pyx_v__dict);
+ __Pyx_XGIVEREF(__pyx_r);
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "(tree fragment)":16
+ * else:
+ * return __pyx_unpickle__Quoter, (type(self), 0xe91bd35, state)
+ * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<<
+ * __pyx_unpickle__Quoter__set_state(self, __pyx_state)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_4yarl_10_quoting_c_7_Quoter_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/
+static PyObject *__pyx_pw_4yarl_10_quoting_c_7_Quoter_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
+ PyObject *__pyx_r = 0;
+ __Pyx_RefNannyDeclarations
+ __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+ __pyx_r = __pyx_pf_4yarl_10_quoting_c_7_Quoter_6__setstate_cython__(((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state));
+
+ /* function exit code */
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+static PyObject *__pyx_pf_4yarl_10_quoting_c_7_Quoter_6__setstate_cython__(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
+ PyObject *__pyx_r = NULL;
+ __Pyx_RefNannyDeclarations
+ PyObject *__pyx_t_1 = NULL;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannySetupContext("__setstate_cython__", 0);
+
+ /* "(tree fragment)":17
+ * return __pyx_unpickle__Quoter, (type(self), 0xe91bd35, state)
+ * def __setstate_cython__(self, __pyx_state):
+ * __pyx_unpickle__Quoter__set_state(self, __pyx_state) # <<<<<<<<<<<<<<
+ */
+ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 17, __pyx_L1_error)
+ __pyx_t_1 = __pyx_f_4yarl_10_quoting_c___pyx_unpickle__Quoter__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+ /* "(tree fragment)":16
+ * else:
+ * return __pyx_unpickle__Quoter, (type(self), 0xe91bd35, state)
+ * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<<
+ * __pyx_unpickle__Quoter__set_state(self, __pyx_state)
+ */
+
+ /* function exit code */
+ __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+ goto __pyx_L0;
+ __pyx_L1_error:;
+ __Pyx_XDECREF(__pyx_t_1);
+ __Pyx_AddTraceback("yarl._quoting_c._Quoter.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __pyx_r = NULL;
+ __pyx_L0:;
+ __Pyx_XGIVEREF(__pyx_r);
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "yarl/_quoting_c.pyx":277
+ * cdef _Quoter _qs_quoter
+ *
+ * def __init__(self, *, unsafe='', qs=False): # <<<<<<<<<<<<<<
+ * self._unsafe = unsafe
+ * self._qs = qs
+ */
+
+/* Python wrapper */
+static int __pyx_pw_4yarl_10_quoting_c_9_Unquoter_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_4yarl_10_quoting_c_9_Unquoter_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+ PyObject *__pyx_v_unsafe = 0;
+ PyObject *__pyx_v_qs = 0;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ int __pyx_r;
+ __Pyx_RefNannyDeclarations
+ __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
+ {
+ static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_unsafe,&__pyx_n_s_qs,0};
+ PyObject* values[2] = {0,0};
+ values[0] = ((PyObject *)__pyx_kp_u_);
+ values[1] = ((PyObject *)Py_False);
+ if (unlikely(__pyx_kwds)) {
+ Py_ssize_t kw_args;
+ const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+ switch (pos_args) {
+ case 0: break;
+ default: goto __pyx_L5_argtuple_error;
+ }
+ kw_args = PyDict_Size(__pyx_kwds);
+ if (kw_args > 0 && likely(kw_args <= 2)) {
+ Py_ssize_t index;
+ for (index = 0; index < 2 && kw_args > 0; index++) {
+ PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, *__pyx_pyargnames[index]);
+ if (value) { values[index] = value; kw_args--; }
+ }
+ }
+ if (unlikely(kw_args > 0)) {
+ if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, 0, "__init__") < 0)) __PYX_ERR(0, 277, __pyx_L3_error)
+ }
+ } else if (PyTuple_GET_SIZE(__pyx_args) != 0) {
+ goto __pyx_L5_argtuple_error;
+ } else {
+ }
+ __pyx_v_unsafe = values[0];
+ __pyx_v_qs = values[1];
+ }
+ goto __pyx_L4_argument_unpacking_done;
+ __pyx_L5_argtuple_error:;
+ __Pyx_RaiseArgtupleInvalid("__init__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 277, __pyx_L3_error)
+ __pyx_L3_error:;
+ __Pyx_AddTraceback("yarl._quoting_c._Unquoter.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __Pyx_RefNannyFinishContext();
+ return -1;
+ __pyx_L4_argument_unpacking_done:;
+ __pyx_r = __pyx_pf_4yarl_10_quoting_c_9_Unquoter___init__(((struct __pyx_obj_4yarl_10_quoting_c__Unquoter *)__pyx_v_self), __pyx_v_unsafe, __pyx_v_qs);
+
+ /* function exit code */
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+static int __pyx_pf_4yarl_10_quoting_c_9_Unquoter___init__(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *__pyx_v_self, PyObject *__pyx_v_unsafe, PyObject *__pyx_v_qs) {
+ int __pyx_r;
+ __Pyx_RefNannyDeclarations
+ PyObject *__pyx_t_1 = NULL;
+ int __pyx_t_2;
+ PyObject *__pyx_t_3 = NULL;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannySetupContext("__init__", 0);
+
+ /* "yarl/_quoting_c.pyx":278
+ *
+ * def __init__(self, *, unsafe='', qs=False):
+ * self._unsafe = unsafe # <<<<<<<<<<<<<<
+ * self._qs = qs
+ * self._quoter = _Quoter()
+ */
+ if (!(likely(PyUnicode_CheckExact(__pyx_v_unsafe))||((__pyx_v_unsafe) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_unsafe)->tp_name), 0))) __PYX_ERR(0, 278, __pyx_L1_error)
+ __pyx_t_1 = __pyx_v_unsafe;
+ __Pyx_INCREF(__pyx_t_1);
+ __Pyx_GIVEREF(__pyx_t_1);
+ __Pyx_GOTREF(__pyx_v_self->_unsafe);
+ __Pyx_DECREF(__pyx_v_self->_unsafe);
+ __pyx_v_self->_unsafe = ((PyObject*)__pyx_t_1);
+ __pyx_t_1 = 0;
+
+ /* "yarl/_quoting_c.pyx":279
+ * def __init__(self, *, unsafe='', qs=False):
+ * self._unsafe = unsafe
+ * self._qs = qs # <<<<<<<<<<<<<<
+ * self._quoter = _Quoter()
+ * self._qs_quoter = _Quoter(qs=True)
+ */
+ __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_qs); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 279, __pyx_L1_error)
+ __pyx_v_self->_qs = __pyx_t_2;
+
+ /* "yarl/_quoting_c.pyx":280
+ * self._unsafe = unsafe
+ * self._qs = qs
+ * self._quoter = _Quoter() # <<<<<<<<<<<<<<
+ * self._qs_quoter = _Quoter(qs=True)
+ *
+ */
+ __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_4yarl_10_quoting_c__Quoter)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 280, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __Pyx_GIVEREF(__pyx_t_1);
+ __Pyx_GOTREF(__pyx_v_self->_quoter);
+ __Pyx_DECREF(((PyObject *)__pyx_v_self->_quoter));
+ __pyx_v_self->_quoter = ((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)__pyx_t_1);
+ __pyx_t_1 = 0;
+
+ /* "yarl/_quoting_c.pyx":281
+ * self._qs = qs
+ * self._quoter = _Quoter()
+ * self._qs_quoter = _Quoter(qs=True) # <<<<<<<<<<<<<<
+ *
+ * def __call__(self, val):
+ */
+ __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 281, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_qs, Py_True) < 0) __PYX_ERR(0, 281, __pyx_L1_error)
+ __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_4yarl_10_quoting_c__Quoter), __pyx_empty_tuple, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 281, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+ __Pyx_GIVEREF(__pyx_t_3);
+ __Pyx_GOTREF(__pyx_v_self->_qs_quoter);
+ __Pyx_DECREF(((PyObject *)__pyx_v_self->_qs_quoter));
+ __pyx_v_self->_qs_quoter = ((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)__pyx_t_3);
+ __pyx_t_3 = 0;
+
+ /* "yarl/_quoting_c.pyx":277
+ * cdef _Quoter _qs_quoter
+ *
+ * def __init__(self, *, unsafe='', qs=False): # <<<<<<<<<<<<<<
+ * self._unsafe = unsafe
+ * self._qs = qs
+ */
+
+ /* function exit code */
+ __pyx_r = 0;
+ goto __pyx_L0;
+ __pyx_L1_error:;
+ __Pyx_XDECREF(__pyx_t_1);
+ __Pyx_XDECREF(__pyx_t_3);
+ __Pyx_AddTraceback("yarl._quoting_c._Unquoter.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __pyx_r = -1;
+ __pyx_L0:;
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "yarl/_quoting_c.pyx":283
+ * self._qs_quoter = _Quoter(qs=True)
+ *
+ * def __call__(self, val): # <<<<<<<<<<<<<<
+ * if val is None:
+ * return None
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_4yarl_10_quoting_c_9_Unquoter_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_4yarl_10_quoting_c_9_Unquoter_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+ PyObject *__pyx_v_val = 0;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ PyObject *__pyx_r = 0;
+ __Pyx_RefNannyDeclarations
+ __Pyx_RefNannySetupContext("__call__ (wrapper)", 0);
+ {
+ static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_val,0};
+ PyObject* values[1] = {0};
+ if (unlikely(__pyx_kwds)) {
+ Py_ssize_t kw_args;
+ const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+ switch (pos_args) {
+ case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+ CYTHON_FALLTHROUGH;
+ case 0: break;
+ default: goto __pyx_L5_argtuple_error;
+ }
+ kw_args = PyDict_Size(__pyx_kwds);
+ switch (pos_args) {
+ case 0:
+ if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_val)) != 0)) kw_args--;
+ else goto __pyx_L5_argtuple_error;
+ }
+ if (unlikely(kw_args > 0)) {
+ if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__call__") < 0)) __PYX_ERR(0, 283, __pyx_L3_error)
+ }
+ } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
+ goto __pyx_L5_argtuple_error;
+ } else {
+ values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+ }
+ __pyx_v_val = values[0];
+ }
+ goto __pyx_L4_argument_unpacking_done;
+ __pyx_L5_argtuple_error:;
+ __Pyx_RaiseArgtupleInvalid("__call__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 283, __pyx_L3_error)
+ __pyx_L3_error:;
+ __Pyx_AddTraceback("yarl._quoting_c._Unquoter.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __Pyx_RefNannyFinishContext();
+ return NULL;
+ __pyx_L4_argument_unpacking_done:;
+ __pyx_r = __pyx_pf_4yarl_10_quoting_c_9_Unquoter_2__call__(((struct __pyx_obj_4yarl_10_quoting_c__Unquoter *)__pyx_v_self), __pyx_v_val);
+
+ /* function exit code */
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+static PyObject *__pyx_pf_4yarl_10_quoting_c_9_Unquoter_2__call__(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *__pyx_v_self, PyObject *__pyx_v_val) {
+ PyObject *__pyx_r = NULL;
+ __Pyx_RefNannyDeclarations
+ int __pyx_t_1;
+ int __pyx_t_2;
+ PyObject *__pyx_t_3 = NULL;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannySetupContext("__call__", 0);
+ __Pyx_INCREF(__pyx_v_val);
+
+ /* "yarl/_quoting_c.pyx":284
+ *
+ * def __call__(self, val):
+ * if val is None: # <<<<<<<<<<<<<<
+ * return None
+ * if type(val) is not str:
+ */
+ __pyx_t_1 = (__pyx_v_val == Py_None);
+ __pyx_t_2 = (__pyx_t_1 != 0);
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":285
+ * def __call__(self, val):
+ * if val is None:
+ * return None # <<<<<<<<<<<<<<
+ * if type(val) is not str:
+ * if isinstance(val, str):
+ */
+ __Pyx_XDECREF(__pyx_r);
+ __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":284
+ *
+ * def __call__(self, val):
+ * if val is None: # <<<<<<<<<<<<<<
+ * return None
+ * if type(val) is not str:
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":286
+ * if val is None:
+ * return None
+ * if type(val) is not str: # <<<<<<<<<<<<<<
+ * if isinstance(val, str):
+ * # derived from str
+ */
+ __pyx_t_2 = (((PyObject *)Py_TYPE(__pyx_v_val)) != ((PyObject *)(&PyUnicode_Type)));
+ __pyx_t_1 = (__pyx_t_2 != 0);
+ if (__pyx_t_1) {
+
+ /* "yarl/_quoting_c.pyx":287
+ * return None
+ * if type(val) is not str:
+ * if isinstance(val, str): # <<<<<<<<<<<<<<
+ * # derived from str
+ * val = str(val)
+ */
+ __pyx_t_1 = PyUnicode_Check(__pyx_v_val);
+ __pyx_t_2 = (__pyx_t_1 != 0);
+ if (likely(__pyx_t_2)) {
+
+ /* "yarl/_quoting_c.pyx":289
+ * if isinstance(val, str):
+ * # derived from str
+ * val = str(val) # <<<<<<<<<<<<<<
+ * else:
+ * raise TypeError("Argument should be str")
+ */
+ __pyx_t_3 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_val); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 289, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_DECREF_SET(__pyx_v_val, __pyx_t_3);
+ __pyx_t_3 = 0;
+
+ /* "yarl/_quoting_c.pyx":287
+ * return None
+ * if type(val) is not str:
+ * if isinstance(val, str): # <<<<<<<<<<<<<<
+ * # derived from str
+ * val = str(val)
+ */
+ goto __pyx_L5;
+ }
+
+ /* "yarl/_quoting_c.pyx":291
+ * val = str(val)
+ * else:
+ * raise TypeError("Argument should be str") # <<<<<<<<<<<<<<
+ * return self._do_unquote(<str>val)
+ *
+ */
+ /*else*/ {
+ __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 291, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+ __PYX_ERR(0, 291, __pyx_L1_error)
+ }
+ __pyx_L5:;
+
+ /* "yarl/_quoting_c.pyx":286
+ * if val is None:
+ * return None
+ * if type(val) is not str: # <<<<<<<<<<<<<<
+ * if isinstance(val, str):
+ * # derived from str
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":292
+ * else:
+ * raise TypeError("Argument should be str")
+ * return self._do_unquote(<str>val) # <<<<<<<<<<<<<<
+ *
+ * cdef str _do_unquote(self, str val):
+ */
+ __Pyx_XDECREF(__pyx_r);
+ __pyx_t_3 = ((struct __pyx_vtabstruct_4yarl_10_quoting_c__Unquoter *)__pyx_v_self->__pyx_vtab)->_do_unquote(__pyx_v_self, ((PyObject*)__pyx_v_val)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 292, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __pyx_r = __pyx_t_3;
+ __pyx_t_3 = 0;
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":283
+ * self._qs_quoter = _Quoter(qs=True)
+ *
+ * def __call__(self, val): # <<<<<<<<<<<<<<
+ * if val is None:
+ * return None
+ */
+
+ /* function exit code */
+ __pyx_L1_error:;
+ __Pyx_XDECREF(__pyx_t_3);
+ __Pyx_AddTraceback("yarl._quoting_c._Unquoter.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __pyx_r = NULL;
+ __pyx_L0:;
+ __Pyx_XDECREF(__pyx_v_val);
+ __Pyx_XGIVEREF(__pyx_r);
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "yarl/_quoting_c.pyx":294
+ * return self._do_unquote(<str>val)
+ *
+ * cdef str _do_unquote(self, str val): # <<<<<<<<<<<<<<
+ * if len(val) == 0:
+ * return val
+ */
+
+static PyObject *__pyx_f_4yarl_10_quoting_c_9_Unquoter__do_unquote(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *__pyx_v_self, PyObject *__pyx_v_val) {
+ PyObject *__pyx_v_ret = 0;
+ char __pyx_v_buffer[4];
+ Py_ssize_t __pyx_v_buflen;
+ Py_ssize_t __pyx_v_consumed;
+ PyObject *__pyx_v_unquoted = 0;
+ Py_UCS4 __pyx_v_ch;
+ Py_ssize_t __pyx_v_idx;
+ Py_ssize_t __pyx_v_length;
+ Py_ssize_t __pyx_v_start_pct;
+ PyObject *__pyx_v_h = NULL;
+ PyObject *__pyx_r = NULL;
+ __Pyx_RefNannyDeclarations
+ Py_ssize_t __pyx_t_1;
+ int __pyx_t_2;
+ PyObject *__pyx_t_3 = NULL;
+ Py_UCS4 __pyx_t_4;
+ int __pyx_t_5;
+ Py_UCS4 __pyx_t_6;
+ PyObject *__pyx_t_7 = NULL;
+ PyObject *__pyx_t_8 = NULL;
+ PyObject *__pyx_t_9 = NULL;
+ int __pyx_t_10;
+ PyObject *__pyx_t_11 = NULL;
+ PyObject *__pyx_t_12 = NULL;
+ PyObject *__pyx_t_13 = NULL;
+ int __pyx_t_14;
+ PyObject *__pyx_t_15 = NULL;
+ PyObject *__pyx_t_16 = NULL;
+ PyObject *__pyx_t_17 = NULL;
+ PyObject *__pyx_t_18 = NULL;
+ PyObject *__pyx_t_19 = NULL;
+ PyObject *__pyx_t_20 = NULL;
+ int __pyx_t_21;
+ PyObject *(*__pyx_t_22)(PyObject *);
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannySetupContext("_do_unquote", 0);
+
+ /* "yarl/_quoting_c.pyx":295
+ *
+ * cdef str _do_unquote(self, str val):
+ * if len(val) == 0: # <<<<<<<<<<<<<<
+ * return val
+ * cdef list ret = []
+ */
+ if (unlikely(__pyx_v_val == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
+ __PYX_ERR(0, 295, __pyx_L1_error)
+ }
+ __pyx_t_1 = __Pyx_PyUnicode_GET_LENGTH(__pyx_v_val); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 295, __pyx_L1_error)
+ __pyx_t_2 = ((__pyx_t_1 == 0) != 0);
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":296
+ * cdef str _do_unquote(self, str val):
+ * if len(val) == 0:
+ * return val # <<<<<<<<<<<<<<
+ * cdef list ret = []
+ * cdef char buffer[4]
+ */
+ __Pyx_XDECREF(__pyx_r);
+ __Pyx_INCREF(__pyx_v_val);
+ __pyx_r = __pyx_v_val;
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":295
+ *
+ * cdef str _do_unquote(self, str val):
+ * if len(val) == 0: # <<<<<<<<<<<<<<
+ * return val
+ * cdef list ret = []
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":297
+ * if len(val) == 0:
+ * return val
+ * cdef list ret = [] # <<<<<<<<<<<<<<
+ * cdef char buffer[4]
+ * cdef Py_ssize_t buflen = 0
+ */
+ __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 297, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __pyx_v_ret = ((PyObject*)__pyx_t_3);
+ __pyx_t_3 = 0;
+
+ /* "yarl/_quoting_c.pyx":299
+ * cdef list ret = []
+ * cdef char buffer[4]
+ * cdef Py_ssize_t buflen = 0 # <<<<<<<<<<<<<<
+ * cdef Py_ssize_t consumed
+ * cdef str unquoted
+ */
+ __pyx_v_buflen = 0;
+
+ /* "yarl/_quoting_c.pyx":302
+ * cdef Py_ssize_t consumed
+ * cdef str unquoted
+ * cdef Py_UCS4 ch = 0 # <<<<<<<<<<<<<<
+ * cdef Py_ssize_t idx = 0
+ * cdef Py_ssize_t length = len(val)
+ */
+ __pyx_v_ch = 0;
+
+ /* "yarl/_quoting_c.pyx":303
+ * cdef str unquoted
+ * cdef Py_UCS4 ch = 0
+ * cdef Py_ssize_t idx = 0 # <<<<<<<<<<<<<<
+ * cdef Py_ssize_t length = len(val)
+ * cdef Py_ssize_t start_pct
+ */
+ __pyx_v_idx = 0;
+
+ /* "yarl/_quoting_c.pyx":304
+ * cdef Py_UCS4 ch = 0
+ * cdef Py_ssize_t idx = 0
+ * cdef Py_ssize_t length = len(val) # <<<<<<<<<<<<<<
+ * cdef Py_ssize_t start_pct
+ *
+ */
+ if (unlikely(__pyx_v_val == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
+ __PYX_ERR(0, 304, __pyx_L1_error)
+ }
+ __pyx_t_1 = __Pyx_PyUnicode_GET_LENGTH(__pyx_v_val); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 304, __pyx_L1_error)
+ __pyx_v_length = __pyx_t_1;
+
+ /* "yarl/_quoting_c.pyx":307
+ * cdef Py_ssize_t start_pct
+ *
+ * while idx < length: # <<<<<<<<<<<<<<
+ * ch = val[idx]
+ * idx += 1
+ */
+ while (1) {
+ __pyx_t_2 = ((__pyx_v_idx < __pyx_v_length) != 0);
+ if (!__pyx_t_2) break;
+
+ /* "yarl/_quoting_c.pyx":308
+ *
+ * while idx < length:
+ * ch = val[idx] # <<<<<<<<<<<<<<
+ * idx += 1
+ * if ch == '%' and idx <= length - 2:
+ */
+ __pyx_t_4 = __Pyx_GetItemInt_Unicode(__pyx_v_val, __pyx_v_idx, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 1); if (unlikely(__pyx_t_4 == (Py_UCS4)-1)) __PYX_ERR(0, 308, __pyx_L1_error)
+ __pyx_v_ch = __pyx_t_4;
+
+ /* "yarl/_quoting_c.pyx":309
+ * while idx < length:
+ * ch = val[idx]
+ * idx += 1 # <<<<<<<<<<<<<<
+ * if ch == '%' and idx <= length - 2:
+ * ch = _restore_ch(val[idx], val[idx + 1])
+ */
+ __pyx_v_idx = (__pyx_v_idx + 1);
+
+ /* "yarl/_quoting_c.pyx":310
+ * ch = val[idx]
+ * idx += 1
+ * if ch == '%' and idx <= length - 2: # <<<<<<<<<<<<<<
+ * ch = _restore_ch(val[idx], val[idx + 1])
+ * if ch != <Py_UCS4>-1:
+ */
+ __pyx_t_5 = ((__pyx_v_ch == 37) != 0);
+ if (__pyx_t_5) {
+ } else {
+ __pyx_t_2 = __pyx_t_5;
+ goto __pyx_L7_bool_binop_done;
+ }
+ __pyx_t_5 = ((__pyx_v_idx <= (__pyx_v_length - 2)) != 0);
+ __pyx_t_2 = __pyx_t_5;
+ __pyx_L7_bool_binop_done:;
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":311
+ * idx += 1
+ * if ch == '%' and idx <= length - 2:
+ * ch = _restore_ch(val[idx], val[idx + 1]) # <<<<<<<<<<<<<<
+ * if ch != <Py_UCS4>-1:
+ * idx += 2
+ */
+ __pyx_t_4 = __Pyx_GetItemInt_Unicode(__pyx_v_val, __pyx_v_idx, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 1); if (unlikely(__pyx_t_4 == (Py_UCS4)-1)) __PYX_ERR(0, 311, __pyx_L1_error)
+ __pyx_t_1 = (__pyx_v_idx + 1);
+ __pyx_t_6 = __Pyx_GetItemInt_Unicode(__pyx_v_val, __pyx_t_1, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 1); if (unlikely(__pyx_t_6 == (Py_UCS4)-1)) __PYX_ERR(0, 311, __pyx_L1_error)
+ __pyx_v_ch = __pyx_f_4yarl_10_quoting_c__restore_ch(__pyx_t_4, __pyx_t_6);
+
+ /* "yarl/_quoting_c.pyx":312
+ * if ch == '%' and idx <= length - 2:
+ * ch = _restore_ch(val[idx], val[idx + 1])
+ * if ch != <Py_UCS4>-1: # <<<<<<<<<<<<<<
+ * idx += 2
+ * assert buflen < 4
+ */
+ __pyx_t_2 = ((__pyx_v_ch != ((Py_UCS4)-1L)) != 0);
+ if (__pyx_t_2) {
+
+ /* "yarl/_quoting_c.pyx":313
+ * ch = _restore_ch(val[idx], val[idx + 1])
+ * if ch != <Py_UCS4>-1:
+ * idx += 2 # <<<<<<<<<<<<<<
+ * assert buflen < 4
+ * buffer[buflen] = ch
+ */
+ __pyx_v_idx = (__pyx_v_idx + 2);
+
+ /* "yarl/_quoting_c.pyx":314
+ * if ch != <Py_UCS4>-1:
+ * idx += 2
+ * assert buflen < 4 # <<<<<<<<<<<<<<
+ * buffer[buflen] = ch
+ * buflen += 1
+ */
+ #ifndef CYTHON_WITHOUT_ASSERTIONS
+ if (unlikely(!Py_OptimizeFlag)) {
+ if (unlikely(!((__pyx_v_buflen < 4) != 0))) {
+ PyErr_SetNone(PyExc_AssertionError);
+ __PYX_ERR(0, 314, __pyx_L1_error)
+ }
+ }
+ #endif
+
+ /* "yarl/_quoting_c.pyx":315
+ * idx += 2
+ * assert buflen < 4
+ * buffer[buflen] = ch # <<<<<<<<<<<<<<
+ * buflen += 1
+ * try:
+ */
+ (__pyx_v_buffer[__pyx_v_buflen]) = __pyx_v_ch;
+
+ /* "yarl/_quoting_c.pyx":316
+ * assert buflen < 4
+ * buffer[buflen] = ch
+ * buflen += 1 # <<<<<<<<<<<<<<
+ * try:
+ * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen,
+ */
+ __pyx_v_buflen = (__pyx_v_buflen + 1);
+
+ /* "yarl/_quoting_c.pyx":317
+ * buffer[buflen] = ch
+ * buflen += 1
+ * try: # <<<<<<<<<<<<<<
+ * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen,
+ * NULL, &consumed)
+ */
+ {
+ __Pyx_PyThreadState_declare
+ __Pyx_PyThreadState_assign
+ __Pyx_ExceptionSave(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9);
+ __Pyx_XGOTREF(__pyx_t_7);
+ __Pyx_XGOTREF(__pyx_t_8);
+ __Pyx_XGOTREF(__pyx_t_9);
+ /*try:*/ {
+
+ /* "yarl/_quoting_c.pyx":318
+ * buflen += 1
+ * try:
+ * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen, # <<<<<<<<<<<<<<
+ * NULL, &consumed)
+ * except UnicodeDecodeError:
+ */
+ __pyx_t_3 = PyUnicode_DecodeUTF8Stateful(__pyx_v_buffer, __pyx_v_buflen, NULL, (&__pyx_v_consumed)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 318, __pyx_L10_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_XDECREF_SET(__pyx_v_unquoted, ((PyObject*)__pyx_t_3));
+ __pyx_t_3 = 0;
+
+ /* "yarl/_quoting_c.pyx":317
+ * buffer[buflen] = ch
+ * buflen += 1
+ * try: # <<<<<<<<<<<<<<
+ * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen,
+ * NULL, &consumed)
+ */
+ }
+ __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+ __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+ __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+ goto __pyx_L17_try_end;
+ __pyx_L10_error:;
+ __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+ /* "yarl/_quoting_c.pyx":320
+ * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen,
+ * NULL, &consumed)
+ * except UnicodeDecodeError: # <<<<<<<<<<<<<<
+ * start_pct = idx - buflen * 3
+ * buffer[0] = ch
+ */
+ __pyx_t_10 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_UnicodeDecodeError);
+ if (__pyx_t_10) {
+ __Pyx_AddTraceback("yarl._quoting_c._Unquoter._do_unquote", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_11, &__pyx_t_12) < 0) __PYX_ERR(0, 320, __pyx_L12_except_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_GOTREF(__pyx_t_11);
+ __Pyx_GOTREF(__pyx_t_12);
+
+ /* "yarl/_quoting_c.pyx":321
+ * NULL, &consumed)
+ * except UnicodeDecodeError:
+ * start_pct = idx - buflen * 3 # <<<<<<<<<<<<<<
+ * buffer[0] = ch
+ * buflen = 1
+ */
+ __pyx_v_start_pct = (__pyx_v_idx - (__pyx_v_buflen * 3));
+
+ /* "yarl/_quoting_c.pyx":322
+ * except UnicodeDecodeError:
+ * start_pct = idx - buflen * 3
+ * buffer[0] = ch # <<<<<<<<<<<<<<
+ * buflen = 1
+ * ret.append(val[start_pct : idx - 3])
+ */
+ (__pyx_v_buffer[0]) = __pyx_v_ch;
+
+ /* "yarl/_quoting_c.pyx":323
+ * start_pct = idx - buflen * 3
+ * buffer[0] = ch
+ * buflen = 1 # <<<<<<<<<<<<<<
+ * ret.append(val[start_pct : idx - 3])
+ * try:
+ */
+ __pyx_v_buflen = 1;
+
+ /* "yarl/_quoting_c.pyx":324
+ * buffer[0] = ch
+ * buflen = 1
+ * ret.append(val[start_pct : idx - 3]) # <<<<<<<<<<<<<<
+ * try:
+ * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen,
+ */
+ if (unlikely(__pyx_v_val == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+ __PYX_ERR(0, 324, __pyx_L12_except_error)
+ }
+ __pyx_t_13 = __Pyx_PyUnicode_Substring(__pyx_v_val, __pyx_v_start_pct, (__pyx_v_idx - 3)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 324, __pyx_L12_except_error)
+ __Pyx_GOTREF(__pyx_t_13);
+ __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_13); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 324, __pyx_L12_except_error)
+ __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+
+ /* "yarl/_quoting_c.pyx":325
+ * buflen = 1
+ * ret.append(val[start_pct : idx - 3])
+ * try: # <<<<<<<<<<<<<<
+ * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen,
+ * NULL, &consumed)
+ */
+ {
+ __Pyx_PyThreadState_declare
+ __Pyx_PyThreadState_assign
+ __Pyx_ExceptionSave(&__pyx_t_15, &__pyx_t_16, &__pyx_t_17);
+ __Pyx_XGOTREF(__pyx_t_15);
+ __Pyx_XGOTREF(__pyx_t_16);
+ __Pyx_XGOTREF(__pyx_t_17);
+ /*try:*/ {
+
+ /* "yarl/_quoting_c.pyx":326
+ * ret.append(val[start_pct : idx - 3])
+ * try:
+ * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen, # <<<<<<<<<<<<<<
+ * NULL, &consumed)
+ * except UnicodeDecodeError:
+ */
+ __pyx_t_13 = PyUnicode_DecodeUTF8Stateful(__pyx_v_buffer, __pyx_v_buflen, NULL, (&__pyx_v_consumed)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 326, __pyx_L20_error)
+ __Pyx_GOTREF(__pyx_t_13);
+ __Pyx_XDECREF_SET(__pyx_v_unquoted, ((PyObject*)__pyx_t_13));
+ __pyx_t_13 = 0;
+
+ /* "yarl/_quoting_c.pyx":325
+ * buflen = 1
+ * ret.append(val[start_pct : idx - 3])
+ * try: # <<<<<<<<<<<<<<
+ * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen,
+ * NULL, &consumed)
+ */
+ }
+ __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
+ __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0;
+ __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0;
+ goto __pyx_L27_try_end;
+ __pyx_L20_error:;
+ __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
+
+ /* "yarl/_quoting_c.pyx":328
+ * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen,
+ * NULL, &consumed)
+ * except UnicodeDecodeError: # <<<<<<<<<<<<<<
+ * buflen = 0
+ * ret.append(val[idx - 3 : idx])
+ */
+ __pyx_t_10 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_UnicodeDecodeError);
+ if (__pyx_t_10) {
+ __Pyx_AddTraceback("yarl._quoting_c._Unquoter._do_unquote", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ if (__Pyx_GetException(&__pyx_t_13, &__pyx_t_18, &__pyx_t_19) < 0) __PYX_ERR(0, 328, __pyx_L22_except_error)
+ __Pyx_GOTREF(__pyx_t_13);
+ __Pyx_GOTREF(__pyx_t_18);
+ __Pyx_GOTREF(__pyx_t_19);
+
+ /* "yarl/_quoting_c.pyx":329
+ * NULL, &consumed)
+ * except UnicodeDecodeError:
+ * buflen = 0 # <<<<<<<<<<<<<<
+ * ret.append(val[idx - 3 : idx])
+ * continue
+ */
+ __pyx_v_buflen = 0;
+
+ /* "yarl/_quoting_c.pyx":330
+ * except UnicodeDecodeError:
+ * buflen = 0
+ * ret.append(val[idx - 3 : idx]) # <<<<<<<<<<<<<<
+ * continue
+ * if not unquoted:
+ */
+ if (unlikely(__pyx_v_val == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+ __PYX_ERR(0, 330, __pyx_L22_except_error)
+ }
+ __pyx_t_20 = __Pyx_PyUnicode_Substring(__pyx_v_val, (__pyx_v_idx - 3), __pyx_v_idx); if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 330, __pyx_L22_except_error)
+ __Pyx_GOTREF(__pyx_t_20);
+ __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_20); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 330, __pyx_L22_except_error)
+ __Pyx_DECREF(__pyx_t_20); __pyx_t_20 = 0;
+
+ /* "yarl/_quoting_c.pyx":331
+ * buflen = 0
+ * ret.append(val[idx - 3 : idx])
+ * continue # <<<<<<<<<<<<<<
+ * if not unquoted:
+ * assert consumed == 0
+ */
+ goto __pyx_L29_except_continue;
+ __pyx_L29_except_continue:;
+ __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+ __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
+ __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+ goto __pyx_L26_try_continue;
+ }
+ goto __pyx_L22_except_error;
+ __pyx_L22_except_error:;
+
+ /* "yarl/_quoting_c.pyx":325
+ * buflen = 1
+ * ret.append(val[start_pct : idx - 3])
+ * try: # <<<<<<<<<<<<<<
+ * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen,
+ * NULL, &consumed)
+ */
+ __Pyx_XGIVEREF(__pyx_t_15);
+ __Pyx_XGIVEREF(__pyx_t_16);
+ __Pyx_XGIVEREF(__pyx_t_17);
+ __Pyx_ExceptionReset(__pyx_t_15, __pyx_t_16, __pyx_t_17);
+ goto __pyx_L12_except_error;
+ __pyx_L26_try_continue:;
+ __Pyx_XGIVEREF(__pyx_t_15);
+ __Pyx_XGIVEREF(__pyx_t_16);
+ __Pyx_XGIVEREF(__pyx_t_17);
+ __Pyx_ExceptionReset(__pyx_t_15, __pyx_t_16, __pyx_t_17);
+ goto __pyx_L19_except_continue;
+ __pyx_L27_try_end:;
+ }
+ __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+ __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
+ __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
+ goto __pyx_L11_exception_handled;
+ __pyx_L19_except_continue:;
+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+ __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+ __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+ goto __pyx_L16_try_continue;
+ }
+ goto __pyx_L12_except_error;
+ __pyx_L12_except_error:;
+
+ /* "yarl/_quoting_c.pyx":317
+ * buffer[buflen] = ch
+ * buflen += 1
+ * try: # <<<<<<<<<<<<<<
+ * unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen,
+ * NULL, &consumed)
+ */
+ __Pyx_XGIVEREF(__pyx_t_7);
+ __Pyx_XGIVEREF(__pyx_t_8);
+ __Pyx_XGIVEREF(__pyx_t_9);
+ __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
+ goto __pyx_L1_error;
+ __pyx_L16_try_continue:;
+ __Pyx_XGIVEREF(__pyx_t_7);
+ __Pyx_XGIVEREF(__pyx_t_8);
+ __Pyx_XGIVEREF(__pyx_t_9);
+ __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
+ goto __pyx_L4_continue;
+ __pyx_L11_exception_handled:;
+ __Pyx_XGIVEREF(__pyx_t_7);
+ __Pyx_XGIVEREF(__pyx_t_8);
+ __Pyx_XGIVEREF(__pyx_t_9);
+ __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
+ __pyx_L17_try_end:;
+ }
+
+ /* "yarl/_quoting_c.pyx":332
+ * ret.append(val[idx - 3 : idx])
+ * continue
+ * if not unquoted: # <<<<<<<<<<<<<<
+ * assert consumed == 0
+ * continue
+ */
+ __pyx_t_2 = (__pyx_v_unquoted != Py_None)&&(__Pyx_PyUnicode_IS_TRUE(__pyx_v_unquoted) != 0);
+ __pyx_t_5 = ((!__pyx_t_2) != 0);
+ if (__pyx_t_5) {
+
+ /* "yarl/_quoting_c.pyx":333
+ * continue
+ * if not unquoted:
+ * assert consumed == 0 # <<<<<<<<<<<<<<
+ * continue
+ * assert consumed == buflen
+ */
+ #ifndef CYTHON_WITHOUT_ASSERTIONS
+ if (unlikely(!Py_OptimizeFlag)) {
+ if (unlikely(!((__pyx_v_consumed == 0) != 0))) {
+ PyErr_SetNone(PyExc_AssertionError);
+ __PYX_ERR(0, 333, __pyx_L1_error)
+ }
+ }
+ #endif
+
+ /* "yarl/_quoting_c.pyx":334
+ * if not unquoted:
+ * assert consumed == 0
+ * continue # <<<<<<<<<<<<<<
+ * assert consumed == buflen
+ * buflen = 0
+ */
+ goto __pyx_L4_continue;
+
+ /* "yarl/_quoting_c.pyx":332
+ * ret.append(val[idx - 3 : idx])
+ * continue
+ * if not unquoted: # <<<<<<<<<<<<<<
+ * assert consumed == 0
+ * continue
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":335
+ * assert consumed == 0
+ * continue
+ * assert consumed == buflen # <<<<<<<<<<<<<<
+ * buflen = 0
+ * if self._qs and unquoted in '+=&;':
+ */
+ #ifndef CYTHON_WITHOUT_ASSERTIONS
+ if (unlikely(!Py_OptimizeFlag)) {
+ if (unlikely(!((__pyx_v_consumed == __pyx_v_buflen) != 0))) {
+ PyErr_SetNone(PyExc_AssertionError);
+ __PYX_ERR(0, 335, __pyx_L1_error)
+ }
+ }
+ #endif
+
+ /* "yarl/_quoting_c.pyx":336
+ * continue
+ * assert consumed == buflen
+ * buflen = 0 # <<<<<<<<<<<<<<
+ * if self._qs and unquoted in '+=&;':
+ * ret.append(self._qs_quoter(unquoted))
+ */
+ __pyx_v_buflen = 0;
+
+ /* "yarl/_quoting_c.pyx":337
+ * assert consumed == buflen
+ * buflen = 0
+ * if self._qs and unquoted in '+=&;': # <<<<<<<<<<<<<<
+ * ret.append(self._qs_quoter(unquoted))
+ * elif unquoted in self._unsafe:
+ */
+ __pyx_t_2 = (__pyx_v_self->_qs != 0);
+ if (__pyx_t_2) {
+ } else {
+ __pyx_t_5 = __pyx_t_2;
+ goto __pyx_L32_bool_binop_done;
+ }
+ __pyx_t_2 = (__Pyx_PyUnicode_ContainsTF(__pyx_v_unquoted, __pyx_kp_u__4, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 337, __pyx_L1_error)
+ __pyx_t_21 = (__pyx_t_2 != 0);
+ __pyx_t_5 = __pyx_t_21;
+ __pyx_L32_bool_binop_done:;
+ if (__pyx_t_5) {
+
+ /* "yarl/_quoting_c.pyx":338
+ * buflen = 0
+ * if self._qs and unquoted in '+=&;':
+ * ret.append(self._qs_quoter(unquoted)) # <<<<<<<<<<<<<<
+ * elif unquoted in self._unsafe:
+ * ret.append(self._quoter(unquoted))
+ */
+ __Pyx_INCREF(((PyObject *)__pyx_v_self->_qs_quoter));
+ __pyx_t_11 = ((PyObject *)__pyx_v_self->_qs_quoter); __pyx_t_3 = NULL;
+ if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_11))) {
+ __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_11);
+ if (likely(__pyx_t_3)) {
+ PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11);
+ __Pyx_INCREF(__pyx_t_3);
+ __Pyx_INCREF(function);
+ __Pyx_DECREF_SET(__pyx_t_11, function);
+ }
+ }
+ __pyx_t_12 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_11, __pyx_t_3, __pyx_v_unquoted) : __Pyx_PyObject_CallOneArg(__pyx_t_11, __pyx_v_unquoted);
+ __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+ if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 338, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_12);
+ __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+ __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_12); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 338, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+
+ /* "yarl/_quoting_c.pyx":337
+ * assert consumed == buflen
+ * buflen = 0
+ * if self._qs and unquoted in '+=&;': # <<<<<<<<<<<<<<
+ * ret.append(self._qs_quoter(unquoted))
+ * elif unquoted in self._unsafe:
+ */
+ goto __pyx_L31;
+ }
+
+ /* "yarl/_quoting_c.pyx":339
+ * if self._qs and unquoted in '+=&;':
+ * ret.append(self._qs_quoter(unquoted))
+ * elif unquoted in self._unsafe: # <<<<<<<<<<<<<<
+ * ret.append(self._quoter(unquoted))
+ * else:
+ */
+ if (unlikely(__pyx_v_self->_unsafe == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+ __PYX_ERR(0, 339, __pyx_L1_error)
+ }
+ __pyx_t_5 = (__Pyx_PyUnicode_ContainsTF(__pyx_v_unquoted, __pyx_v_self->_unsafe, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 339, __pyx_L1_error)
+ __pyx_t_21 = (__pyx_t_5 != 0);
+ if (__pyx_t_21) {
+
+ /* "yarl/_quoting_c.pyx":340
+ * ret.append(self._qs_quoter(unquoted))
+ * elif unquoted in self._unsafe:
+ * ret.append(self._quoter(unquoted)) # <<<<<<<<<<<<<<
+ * else:
+ * ret.append(unquoted)
+ */
+ __Pyx_INCREF(((PyObject *)__pyx_v_self->_quoter));
+ __pyx_t_11 = ((PyObject *)__pyx_v_self->_quoter); __pyx_t_3 = NULL;
+ if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_11))) {
+ __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_11);
+ if (likely(__pyx_t_3)) {
+ PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11);
+ __Pyx_INCREF(__pyx_t_3);
+ __Pyx_INCREF(function);
+ __Pyx_DECREF_SET(__pyx_t_11, function);
+ }
+ }
+ __pyx_t_12 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_11, __pyx_t_3, __pyx_v_unquoted) : __Pyx_PyObject_CallOneArg(__pyx_t_11, __pyx_v_unquoted);
+ __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+ if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 340, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_12);
+ __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+ __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_12); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 340, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+
+ /* "yarl/_quoting_c.pyx":339
+ * if self._qs and unquoted in '+=&;':
+ * ret.append(self._qs_quoter(unquoted))
+ * elif unquoted in self._unsafe: # <<<<<<<<<<<<<<
+ * ret.append(self._quoter(unquoted))
+ * else:
+ */
+ goto __pyx_L31;
+ }
+
+ /* "yarl/_quoting_c.pyx":342
+ * ret.append(self._quoter(unquoted))
+ * else:
+ * ret.append(unquoted) # <<<<<<<<<<<<<<
+ * continue
+ * else:
+ */
+ /*else*/ {
+ __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_v_unquoted); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 342, __pyx_L1_error)
+ }
+ __pyx_L31:;
+
+ /* "yarl/_quoting_c.pyx":343
+ * else:
+ * ret.append(unquoted)
+ * continue # <<<<<<<<<<<<<<
+ * else:
+ * ch = '%'
+ */
+ goto __pyx_L4_continue;
+
+ /* "yarl/_quoting_c.pyx":312
+ * if ch == '%' and idx <= length - 2:
+ * ch = _restore_ch(val[idx], val[idx + 1])
+ * if ch != <Py_UCS4>-1: # <<<<<<<<<<<<<<
+ * idx += 2
+ * assert buflen < 4
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":345
+ * continue
+ * else:
+ * ch = '%' # <<<<<<<<<<<<<<
+ *
+ * if buflen:
+ */
+ /*else*/ {
+ __pyx_v_ch = 37;
+ }
+
+ /* "yarl/_quoting_c.pyx":310
+ * ch = val[idx]
+ * idx += 1
+ * if ch == '%' and idx <= length - 2: # <<<<<<<<<<<<<<
+ * ch = _restore_ch(val[idx], val[idx + 1])
+ * if ch != <Py_UCS4>-1:
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":347
+ * ch = '%'
+ *
+ * if buflen: # <<<<<<<<<<<<<<
+ * start_pct = idx - 1 - buflen * 3
+ * ret.append(val[start_pct : idx - 1])
+ */
+ __pyx_t_21 = (__pyx_v_buflen != 0);
+ if (__pyx_t_21) {
+
+ /* "yarl/_quoting_c.pyx":348
+ *
+ * if buflen:
+ * start_pct = idx - 1 - buflen * 3 # <<<<<<<<<<<<<<
+ * ret.append(val[start_pct : idx - 1])
+ * buflen = 0
+ */
+ __pyx_v_start_pct = ((__pyx_v_idx - 1) - (__pyx_v_buflen * 3));
+
+ /* "yarl/_quoting_c.pyx":349
+ * if buflen:
+ * start_pct = idx - 1 - buflen * 3
+ * ret.append(val[start_pct : idx - 1]) # <<<<<<<<<<<<<<
+ * buflen = 0
+ *
+ */
+ if (unlikely(__pyx_v_val == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+ __PYX_ERR(0, 349, __pyx_L1_error)
+ }
+ __pyx_t_12 = __Pyx_PyUnicode_Substring(__pyx_v_val, __pyx_v_start_pct, (__pyx_v_idx - 1)); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 349, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_12);
+ __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_12); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 349, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+
+ /* "yarl/_quoting_c.pyx":350
+ * start_pct = idx - 1 - buflen * 3
+ * ret.append(val[start_pct : idx - 1])
+ * buflen = 0 # <<<<<<<<<<<<<<
+ *
+ * if ch == '+':
+ */
+ __pyx_v_buflen = 0;
+
+ /* "yarl/_quoting_c.pyx":347
+ * ch = '%'
+ *
+ * if buflen: # <<<<<<<<<<<<<<
+ * start_pct = idx - 1 - buflen * 3
+ * ret.append(val[start_pct : idx - 1])
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":352
+ * buflen = 0
+ *
+ * if ch == '+': # <<<<<<<<<<<<<<
+ * if not self._qs or ch in self._unsafe:
+ * ret.append('+')
+ */
+ __pyx_t_21 = ((__pyx_v_ch == 43) != 0);
+ if (__pyx_t_21) {
+
+ /* "yarl/_quoting_c.pyx":353
+ *
+ * if ch == '+':
+ * if not self._qs or ch in self._unsafe: # <<<<<<<<<<<<<<
+ * ret.append('+')
+ * else:
+ */
+ __pyx_t_5 = ((!(__pyx_v_self->_qs != 0)) != 0);
+ if (!__pyx_t_5) {
+ } else {
+ __pyx_t_21 = __pyx_t_5;
+ goto __pyx_L37_bool_binop_done;
+ }
+ if (unlikely(__pyx_v_self->_unsafe == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "argument of type 'NoneType' is not iterable");
+ __PYX_ERR(0, 353, __pyx_L1_error)
+ }
+ __pyx_t_5 = ((__Pyx_UnicodeContainsUCS4(__pyx_v_self->_unsafe, __pyx_v_ch)) != 0);
+ __pyx_t_21 = __pyx_t_5;
+ __pyx_L37_bool_binop_done:;
+ if (__pyx_t_21) {
+
+ /* "yarl/_quoting_c.pyx":354
+ * if ch == '+':
+ * if not self._qs or ch in self._unsafe:
+ * ret.append('+') # <<<<<<<<<<<<<<
+ * else:
+ * ret.append(' ')
+ */
+ __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_kp_u__5); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 354, __pyx_L1_error)
+
+ /* "yarl/_quoting_c.pyx":353
+ *
+ * if ch == '+':
+ * if not self._qs or ch in self._unsafe: # <<<<<<<<<<<<<<
+ * ret.append('+')
+ * else:
+ */
+ goto __pyx_L36;
+ }
+
+ /* "yarl/_quoting_c.pyx":356
+ * ret.append('+')
+ * else:
+ * ret.append(' ') # <<<<<<<<<<<<<<
+ * continue
+ *
+ */
+ /*else*/ {
+ __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_kp_u__6); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 356, __pyx_L1_error)
+ }
+ __pyx_L36:;
+
+ /* "yarl/_quoting_c.pyx":357
+ * else:
+ * ret.append(' ')
+ * continue # <<<<<<<<<<<<<<
+ *
+ * if ch in self._unsafe:
+ */
+ goto __pyx_L4_continue;
+
+ /* "yarl/_quoting_c.pyx":352
+ * buflen = 0
+ *
+ * if ch == '+': # <<<<<<<<<<<<<<
+ * if not self._qs or ch in self._unsafe:
+ * ret.append('+')
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":359
+ * continue
+ *
+ * if ch in self._unsafe: # <<<<<<<<<<<<<<
+ * ret.append('%')
+ * h = hex(ord(ch)).upper()[2:]
+ */
+ if (unlikely(__pyx_v_self->_unsafe == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "argument of type 'NoneType' is not iterable");
+ __PYX_ERR(0, 359, __pyx_L1_error)
+ }
+ __pyx_t_21 = ((__Pyx_UnicodeContainsUCS4(__pyx_v_self->_unsafe, __pyx_v_ch)) != 0);
+ if (__pyx_t_21) {
+
+ /* "yarl/_quoting_c.pyx":360
+ *
+ * if ch in self._unsafe:
+ * ret.append('%') # <<<<<<<<<<<<<<
+ * h = hex(ord(ch)).upper()[2:]
+ * for ch in h:
+ */
+ __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_kp_u__7); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 360, __pyx_L1_error)
+
+ /* "yarl/_quoting_c.pyx":361
+ * if ch in self._unsafe:
+ * ret.append('%')
+ * h = hex(ord(ch)).upper()[2:] # <<<<<<<<<<<<<<
+ * for ch in h:
+ * ret.append(ch)
+ */
+ __pyx_t_11 = __Pyx_PyInt_From_long(((long)__pyx_v_ch)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 361, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_11);
+ __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_hex, __pyx_t_11); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 361, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+ __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_upper); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 361, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_11);
+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+ __pyx_t_3 = NULL;
+ if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_11))) {
+ __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_11);
+ if (likely(__pyx_t_3)) {
+ PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11);
+ __Pyx_INCREF(__pyx_t_3);
+ __Pyx_INCREF(function);
+ __Pyx_DECREF_SET(__pyx_t_11, function);
+ }
+ }
+ __pyx_t_12 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_11, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_11);
+ __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+ if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 361, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_12);
+ __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+ __pyx_t_11 = __Pyx_PyObject_GetSlice(__pyx_t_12, 2, 0, NULL, NULL, &__pyx_slice__8, 1, 0, 1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 361, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_11);
+ __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+ __Pyx_XDECREF_SET(__pyx_v_h, __pyx_t_11);
+ __pyx_t_11 = 0;
+
+ /* "yarl/_quoting_c.pyx":362
+ * ret.append('%')
+ * h = hex(ord(ch)).upper()[2:]
+ * for ch in h: # <<<<<<<<<<<<<<
+ * ret.append(ch)
+ * continue
+ */
+ if (likely(PyList_CheckExact(__pyx_v_h)) || PyTuple_CheckExact(__pyx_v_h)) {
+ __pyx_t_11 = __pyx_v_h; __Pyx_INCREF(__pyx_t_11); __pyx_t_1 = 0;
+ __pyx_t_22 = NULL;
+ } else {
+ __pyx_t_1 = -1; __pyx_t_11 = PyObject_GetIter(__pyx_v_h); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 362, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_11);
+ __pyx_t_22 = Py_TYPE(__pyx_t_11)->tp_iternext; if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 362, __pyx_L1_error)
+ }
+ for (;;) {
+ if (likely(!__pyx_t_22)) {
+ if (likely(PyList_CheckExact(__pyx_t_11))) {
+ if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_11)) break;
+ #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+ __pyx_t_12 = PyList_GET_ITEM(__pyx_t_11, __pyx_t_1); __Pyx_INCREF(__pyx_t_12); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 362, __pyx_L1_error)
+ #else
+ __pyx_t_12 = PySequence_ITEM(__pyx_t_11, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 362, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_12);
+ #endif
+ } else {
+ if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_11)) break;
+ #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+ __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_11, __pyx_t_1); __Pyx_INCREF(__pyx_t_12); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(0, 362, __pyx_L1_error)
+ #else
+ __pyx_t_12 = PySequence_ITEM(__pyx_t_11, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 362, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_12);
+ #endif
+ }
+ } else {
+ __pyx_t_12 = __pyx_t_22(__pyx_t_11);
+ if (unlikely(!__pyx_t_12)) {
+ PyObject* exc_type = PyErr_Occurred();
+ if (exc_type) {
+ if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+ else __PYX_ERR(0, 362, __pyx_L1_error)
+ }
+ break;
+ }
+ __Pyx_GOTREF(__pyx_t_12);
+ }
+ __pyx_t_6 = __Pyx_PyObject_AsPy_UCS4(__pyx_t_12); if (unlikely((__pyx_t_6 == (Py_UCS4)-1) && PyErr_Occurred())) __PYX_ERR(0, 362, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+ __pyx_v_ch = __pyx_t_6;
+
+ /* "yarl/_quoting_c.pyx":363
+ * h = hex(ord(ch)).upper()[2:]
+ * for ch in h:
+ * ret.append(ch) # <<<<<<<<<<<<<<
+ * continue
+ *
+ */
+ __pyx_t_12 = PyUnicode_FromOrdinal(__pyx_v_ch); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 363, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_12);
+ __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_12); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 363, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+
+ /* "yarl/_quoting_c.pyx":362
+ * ret.append('%')
+ * h = hex(ord(ch)).upper()[2:]
+ * for ch in h: # <<<<<<<<<<<<<<
+ * ret.append(ch)
+ * continue
+ */
+ }
+ __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+
+ /* "yarl/_quoting_c.pyx":364
+ * for ch in h:
+ * ret.append(ch)
+ * continue # <<<<<<<<<<<<<<
+ *
+ * ret.append(ch)
+ */
+ goto __pyx_L4_continue;
+
+ /* "yarl/_quoting_c.pyx":359
+ * continue
+ *
+ * if ch in self._unsafe: # <<<<<<<<<<<<<<
+ * ret.append('%')
+ * h = hex(ord(ch)).upper()[2:]
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":366
+ * continue
+ *
+ * ret.append(ch) # <<<<<<<<<<<<<<
+ *
+ * if buflen:
+ */
+ __pyx_t_11 = PyUnicode_FromOrdinal(__pyx_v_ch); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 366, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_11);
+ __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_11); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 366, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+ __pyx_L4_continue:;
+ }
+
+ /* "yarl/_quoting_c.pyx":368
+ * ret.append(ch)
+ *
+ * if buflen: # <<<<<<<<<<<<<<
+ * ret.append(val[length - buflen * 3 : length])
+ *
+ */
+ __pyx_t_21 = (__pyx_v_buflen != 0);
+ if (__pyx_t_21) {
+
+ /* "yarl/_quoting_c.pyx":369
+ *
+ * if buflen:
+ * ret.append(val[length - buflen * 3 : length]) # <<<<<<<<<<<<<<
+ *
+ * return ''.join(ret)
+ */
+ if (unlikely(__pyx_v_val == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+ __PYX_ERR(0, 369, __pyx_L1_error)
+ }
+ __pyx_t_11 = __Pyx_PyUnicode_Substring(__pyx_v_val, (__pyx_v_length - (__pyx_v_buflen * 3)), __pyx_v_length); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 369, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_11);
+ __pyx_t_14 = __Pyx_PyList_Append(__pyx_v_ret, __pyx_t_11); if (unlikely(__pyx_t_14 == ((int)-1))) __PYX_ERR(0, 369, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+
+ /* "yarl/_quoting_c.pyx":368
+ * ret.append(ch)
+ *
+ * if buflen: # <<<<<<<<<<<<<<
+ * ret.append(val[length - buflen * 3 : length])
+ *
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":371
+ * ret.append(val[length - buflen * 3 : length])
+ *
+ * return ''.join(ret) # <<<<<<<<<<<<<<
+ */
+ __Pyx_XDECREF(__pyx_r);
+ __pyx_t_11 = PyUnicode_Join(__pyx_kp_u_, __pyx_v_ret); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 371, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_11);
+ __pyx_r = ((PyObject*)__pyx_t_11);
+ __pyx_t_11 = 0;
+ goto __pyx_L0;
+
+ /* "yarl/_quoting_c.pyx":294
+ * return self._do_unquote(<str>val)
+ *
+ * cdef str _do_unquote(self, str val): # <<<<<<<<<<<<<<
+ * if len(val) == 0:
+ * return val
+ */
+
+ /* function exit code */
+ __pyx_L1_error:;
+ __Pyx_XDECREF(__pyx_t_3);
+ __Pyx_XDECREF(__pyx_t_11);
+ __Pyx_XDECREF(__pyx_t_12);
+ __Pyx_XDECREF(__pyx_t_13);
+ __Pyx_XDECREF(__pyx_t_18);
+ __Pyx_XDECREF(__pyx_t_19);
+ __Pyx_XDECREF(__pyx_t_20);
+ __Pyx_AddTraceback("yarl._quoting_c._Unquoter._do_unquote", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __pyx_r = 0;
+ __pyx_L0:;
+ __Pyx_XDECREF(__pyx_v_ret);
+ __Pyx_XDECREF(__pyx_v_unquoted);
+ __Pyx_XDECREF(__pyx_v_h);
+ __Pyx_XGIVEREF(__pyx_r);
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __reduce_cython__(self): # <<<<<<<<<<<<<<
+ * cdef tuple state
+ * cdef object _dict
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_4yarl_10_quoting_c_9_Unquoter_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_4yarl_10_quoting_c_9_Unquoter_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+ PyObject *__pyx_r = 0;
+ __Pyx_RefNannyDeclarations
+ __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
+ __pyx_r = __pyx_pf_4yarl_10_quoting_c_9_Unquoter_4__reduce_cython__(((struct __pyx_obj_4yarl_10_quoting_c__Unquoter *)__pyx_v_self));
+
+ /* function exit code */
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+static PyObject *__pyx_pf_4yarl_10_quoting_c_9_Unquoter_4__reduce_cython__(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *__pyx_v_self) {
+ PyObject *__pyx_v_state = 0;
+ PyObject *__pyx_v__dict = 0;
+ int __pyx_v_use_setstate;
+ PyObject *__pyx_r = NULL;
+ __Pyx_RefNannyDeclarations
+ PyObject *__pyx_t_1 = NULL;
+ PyObject *__pyx_t_2 = NULL;
+ int __pyx_t_3;
+ int __pyx_t_4;
+ int __pyx_t_5;
+ PyObject *__pyx_t_6 = NULL;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannySetupContext("__reduce_cython__", 0);
+
+ /* "(tree fragment)":5
+ * cdef object _dict
+ * cdef bint use_setstate
+ * state = (self._qs, self._qs_quoter, self._quoter, self._unsafe) # <<<<<<<<<<<<<<
+ * _dict = getattr(self, '__dict__', None)
+ * if _dict is not None:
+ */
+ __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->_qs); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_2);
+ __Pyx_GIVEREF(__pyx_t_1);
+ PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
+ __Pyx_INCREF(((PyObject *)__pyx_v_self->_qs_quoter));
+ __Pyx_GIVEREF(((PyObject *)__pyx_v_self->_qs_quoter));
+ PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self->_qs_quoter));
+ __Pyx_INCREF(((PyObject *)__pyx_v_self->_quoter));
+ __Pyx_GIVEREF(((PyObject *)__pyx_v_self->_quoter));
+ PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_self->_quoter));
+ __Pyx_INCREF(__pyx_v_self->_unsafe);
+ __Pyx_GIVEREF(__pyx_v_self->_unsafe);
+ PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_self->_unsafe);
+ __pyx_t_1 = 0;
+ __pyx_v_state = ((PyObject*)__pyx_t_2);
+ __pyx_t_2 = 0;
+
+ /* "(tree fragment)":6
+ * cdef bint use_setstate
+ * state = (self._qs, self._qs_quoter, self._quoter, self._unsafe)
+ * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<<
+ * if _dict is not None:
+ * state += (_dict,)
+ */
+ __pyx_t_2 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_2);
+ __pyx_v__dict = __pyx_t_2;
+ __pyx_t_2 = 0;
+
+ /* "(tree fragment)":7
+ * state = (self._qs, self._qs_quoter, self._quoter, self._unsafe)
+ * _dict = getattr(self, '__dict__', None)
+ * if _dict is not None: # <<<<<<<<<<<<<<
+ * state += (_dict,)
+ * use_setstate = True
+ */
+ __pyx_t_3 = (__pyx_v__dict != Py_None);
+ __pyx_t_4 = (__pyx_t_3 != 0);
+ if (__pyx_t_4) {
+
+ /* "(tree fragment)":8
+ * _dict = getattr(self, '__dict__', None)
+ * if _dict is not None:
+ * state += (_dict,) # <<<<<<<<<<<<<<
+ * use_setstate = True
+ * else:
+ */
+ __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 8, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_2);
+ __Pyx_INCREF(__pyx_v__dict);
+ __Pyx_GIVEREF(__pyx_v__dict);
+ PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v__dict);
+ __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+ __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_1));
+ __pyx_t_1 = 0;
+
+ /* "(tree fragment)":9
+ * if _dict is not None:
+ * state += (_dict,)
+ * use_setstate = True # <<<<<<<<<<<<<<
+ * else:
+ * use_setstate = self._qs_quoter is not None or self._quoter is not None or self._unsafe is not None
+ */
+ __pyx_v_use_setstate = 1;
+
+ /* "(tree fragment)":7
+ * state = (self._qs, self._qs_quoter, self._quoter, self._unsafe)
+ * _dict = getattr(self, '__dict__', None)
+ * if _dict is not None: # <<<<<<<<<<<<<<
+ * state += (_dict,)
+ * use_setstate = True
+ */
+ goto __pyx_L3;
+ }
+
+ /* "(tree fragment)":11
+ * use_setstate = True
+ * else:
+ * use_setstate = self._qs_quoter is not None or self._quoter is not None or self._unsafe is not None # <<<<<<<<<<<<<<
+ * if use_setstate:
+ * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, None), state
+ */
+ /*else*/ {
+ __pyx_t_3 = (((PyObject *)__pyx_v_self->_qs_quoter) != Py_None);
+ __pyx_t_5 = (__pyx_t_3 != 0);
+ if (!__pyx_t_5) {
+ } else {
+ __pyx_t_4 = __pyx_t_5;
+ goto __pyx_L4_bool_binop_done;
+ }
+ __pyx_t_5 = (((PyObject *)__pyx_v_self->_quoter) != Py_None);
+ __pyx_t_3 = (__pyx_t_5 != 0);
+ if (!__pyx_t_3) {
+ } else {
+ __pyx_t_4 = __pyx_t_3;
+ goto __pyx_L4_bool_binop_done;
+ }
+ __pyx_t_3 = (__pyx_v_self->_unsafe != ((PyObject*)Py_None));
+ __pyx_t_5 = (__pyx_t_3 != 0);
+ __pyx_t_4 = __pyx_t_5;
+ __pyx_L4_bool_binop_done:;
+ __pyx_v_use_setstate = __pyx_t_4;
+ }
+ __pyx_L3:;
+
+ /* "(tree fragment)":12
+ * else:
+ * use_setstate = self._qs_quoter is not None or self._quoter is not None or self._unsafe is not None
+ * if use_setstate: # <<<<<<<<<<<<<<
+ * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, None), state
+ * else:
+ */
+ __pyx_t_4 = (__pyx_v_use_setstate != 0);
+ if (__pyx_t_4) {
+
+ /* "(tree fragment)":13
+ * use_setstate = self._qs_quoter is not None or self._quoter is not None or self._unsafe is not None
+ * if use_setstate:
+ * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, None), state # <<<<<<<<<<<<<<
+ * else:
+ * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, state)
+ */
+ __Pyx_XDECREF(__pyx_r);
+ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pyx_unpickle__Unquoter); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_2);
+ __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+ __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+ PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+ __Pyx_INCREF(__pyx_int_41310077);
+ __Pyx_GIVEREF(__pyx_int_41310077);
+ PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_41310077);
+ __Pyx_INCREF(Py_None);
+ __Pyx_GIVEREF(Py_None);
+ PyTuple_SET_ITEM(__pyx_t_2, 2, Py_None);
+ __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 13, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_6);
+ __Pyx_GIVEREF(__pyx_t_1);
+ PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1);
+ __Pyx_GIVEREF(__pyx_t_2);
+ PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_2);
+ __Pyx_INCREF(__pyx_v_state);
+ __Pyx_GIVEREF(__pyx_v_state);
+ PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_v_state);
+ __pyx_t_1 = 0;
+ __pyx_t_2 = 0;
+ __pyx_r = __pyx_t_6;
+ __pyx_t_6 = 0;
+ goto __pyx_L0;
+
+ /* "(tree fragment)":12
+ * else:
+ * use_setstate = self._qs_quoter is not None or self._quoter is not None or self._unsafe is not None
+ * if use_setstate: # <<<<<<<<<<<<<<
+ * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, None), state
+ * else:
+ */
+ }
+
+ /* "(tree fragment)":15
+ * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, None), state
+ * else:
+ * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, state) # <<<<<<<<<<<<<<
+ * def __setstate_cython__(self, __pyx_state):
+ * __pyx_unpickle__Unquoter__set_state(self, __pyx_state)
+ */
+ /*else*/ {
+ __Pyx_XDECREF(__pyx_r);
+ __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_pyx_unpickle__Unquoter); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 15, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_6);
+ __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 15, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_2);
+ __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+ __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+ PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self))));
+ __Pyx_INCREF(__pyx_int_41310077);
+ __Pyx_GIVEREF(__pyx_int_41310077);
+ PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_41310077);
+ __Pyx_INCREF(__pyx_v_state);
+ __Pyx_GIVEREF(__pyx_v_state);
+ PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_state);
+ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __Pyx_GIVEREF(__pyx_t_6);
+ PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_6);
+ __Pyx_GIVEREF(__pyx_t_2);
+ PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2);
+ __pyx_t_6 = 0;
+ __pyx_t_2 = 0;
+ __pyx_r = __pyx_t_1;
+ __pyx_t_1 = 0;
+ goto __pyx_L0;
+ }
+
+ /* "(tree fragment)":1
+ * def __reduce_cython__(self): # <<<<<<<<<<<<<<
+ * cdef tuple state
+ * cdef object _dict
+ */
+
+ /* function exit code */
+ __pyx_L1_error:;
+ __Pyx_XDECREF(__pyx_t_1);
+ __Pyx_XDECREF(__pyx_t_2);
+ __Pyx_XDECREF(__pyx_t_6);
+ __Pyx_AddTraceback("yarl._quoting_c._Unquoter.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __pyx_r = NULL;
+ __pyx_L0:;
+ __Pyx_XDECREF(__pyx_v_state);
+ __Pyx_XDECREF(__pyx_v__dict);
+ __Pyx_XGIVEREF(__pyx_r);
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "(tree fragment)":16
+ * else:
+ * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, state)
+ * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<<
+ * __pyx_unpickle__Unquoter__set_state(self, __pyx_state)
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_4yarl_10_quoting_c_9_Unquoter_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/
+static PyObject *__pyx_pw_4yarl_10_quoting_c_9_Unquoter_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
+ PyObject *__pyx_r = 0;
+ __Pyx_RefNannyDeclarations
+ __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
+ __pyx_r = __pyx_pf_4yarl_10_quoting_c_9_Unquoter_6__setstate_cython__(((struct __pyx_obj_4yarl_10_quoting_c__Unquoter *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state));
+
+ /* function exit code */
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+static PyObject *__pyx_pf_4yarl_10_quoting_c_9_Unquoter_6__setstate_cython__(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
+ PyObject *__pyx_r = NULL;
+ __Pyx_RefNannyDeclarations
+ PyObject *__pyx_t_1 = NULL;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannySetupContext("__setstate_cython__", 0);
+
+ /* "(tree fragment)":17
+ * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, state)
+ * def __setstate_cython__(self, __pyx_state):
+ * __pyx_unpickle__Unquoter__set_state(self, __pyx_state) # <<<<<<<<<<<<<<
+ */
+ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 17, __pyx_L1_error)
+ __pyx_t_1 = __pyx_f_4yarl_10_quoting_c___pyx_unpickle__Unquoter__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+ /* "(tree fragment)":16
+ * else:
+ * return __pyx_unpickle__Unquoter, (type(self), 0x276577d, state)
+ * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<<
+ * __pyx_unpickle__Unquoter__set_state(self, __pyx_state)
+ */
+
+ /* function exit code */
+ __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+ goto __pyx_L0;
+ __pyx_L1_error:;
+ __Pyx_XDECREF(__pyx_t_1);
+ __Pyx_AddTraceback("yarl._quoting_c._Unquoter.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __pyx_r = NULL;
+ __pyx_L0:;
+ __Pyx_XGIVEREF(__pyx_r);
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __pyx_unpickle__Quoter(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<<
+ * cdef object __pyx_PickleError
+ * cdef object __pyx_result
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_4yarl_10_quoting_c_1__pyx_unpickle__Quoter(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyMethodDef __pyx_mdef_4yarl_10_quoting_c_1__pyx_unpickle__Quoter = {"__pyx_unpickle__Quoter", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_4yarl_10_quoting_c_1__pyx_unpickle__Quoter, METH_VARARGS|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_4yarl_10_quoting_c_1__pyx_unpickle__Quoter(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+ PyObject *__pyx_v___pyx_type = 0;
+ long __pyx_v___pyx_checksum;
+ PyObject *__pyx_v___pyx_state = 0;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ PyObject *__pyx_r = 0;
+ __Pyx_RefNannyDeclarations
+ __Pyx_RefNannySetupContext("__pyx_unpickle__Quoter (wrapper)", 0);
+ {
+ static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0};
+ PyObject* values[3] = {0,0,0};
+ if (unlikely(__pyx_kwds)) {
+ Py_ssize_t kw_args;
+ const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+ switch (pos_args) {
+ case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+ CYTHON_FALLTHROUGH;
+ case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+ CYTHON_FALLTHROUGH;
+ case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+ CYTHON_FALLTHROUGH;
+ case 0: break;
+ default: goto __pyx_L5_argtuple_error;
+ }
+ kw_args = PyDict_Size(__pyx_kwds);
+ switch (pos_args) {
+ case 0:
+ if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--;
+ else goto __pyx_L5_argtuple_error;
+ CYTHON_FALLTHROUGH;
+ case 1:
+ if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--;
+ else {
+ __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__Quoter", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error)
+ }
+ CYTHON_FALLTHROUGH;
+ case 2:
+ if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--;
+ else {
+ __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__Quoter", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error)
+ }
+ }
+ if (unlikely(kw_args > 0)) {
+ if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle__Quoter") < 0)) __PYX_ERR(1, 1, __pyx_L3_error)
+ }
+ } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
+ goto __pyx_L5_argtuple_error;
+ } else {
+ values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+ values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+ values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+ }
+ __pyx_v___pyx_type = values[0];
+ __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error)
+ __pyx_v___pyx_state = values[2];
+ }
+ goto __pyx_L4_argument_unpacking_done;
+ __pyx_L5_argtuple_error:;
+ __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__Quoter", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 1, __pyx_L3_error)
+ __pyx_L3_error:;
+ __Pyx_AddTraceback("yarl._quoting_c.__pyx_unpickle__Quoter", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __Pyx_RefNannyFinishContext();
+ return NULL;
+ __pyx_L4_argument_unpacking_done:;
+ __pyx_r = __pyx_pf_4yarl_10_quoting_c___pyx_unpickle__Quoter(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state);
+
+ /* function exit code */
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+static PyObject *__pyx_pf_4yarl_10_quoting_c___pyx_unpickle__Quoter(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) {
+ PyObject *__pyx_v___pyx_PickleError = 0;
+ PyObject *__pyx_v___pyx_result = 0;
+ PyObject *__pyx_r = NULL;
+ __Pyx_RefNannyDeclarations
+ int __pyx_t_1;
+ PyObject *__pyx_t_2 = NULL;
+ PyObject *__pyx_t_3 = NULL;
+ PyObject *__pyx_t_4 = NULL;
+ PyObject *__pyx_t_5 = NULL;
+ int __pyx_t_6;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannySetupContext("__pyx_unpickle__Quoter", 0);
+
+ /* "(tree fragment)":4
+ * cdef object __pyx_PickleError
+ * cdef object __pyx_result
+ * if __pyx_checksum != 0xe91bd35: # <<<<<<<<<<<<<<
+ * from pickle import PickleError as __pyx_PickleError
+ * raise __pyx_PickleError("Incompatible checksums (%s vs 0xe91bd35 = (_protected_table, _qs, _requote, _safe_table))" % __pyx_checksum)
+ */
+ __pyx_t_1 = ((__pyx_v___pyx_checksum != 0xe91bd35) != 0);
+ if (__pyx_t_1) {
+
+ /* "(tree fragment)":5
+ * cdef object __pyx_result
+ * if __pyx_checksum != 0xe91bd35:
+ * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<<
+ * raise __pyx_PickleError("Incompatible checksums (%s vs 0xe91bd35 = (_protected_table, _qs, _requote, _safe_table))" % __pyx_checksum)
+ * __pyx_result = _Quoter.__new__(__pyx_type)
+ */
+ __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_2);
+ __Pyx_INCREF(__pyx_n_s_PickleError);
+ __Pyx_GIVEREF(__pyx_n_s_PickleError);
+ PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError);
+ __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+ __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_2);
+ __Pyx_INCREF(__pyx_t_2);
+ __pyx_v___pyx_PickleError = __pyx_t_2;
+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+ /* "(tree fragment)":6
+ * if __pyx_checksum != 0xe91bd35:
+ * from pickle import PickleError as __pyx_PickleError
+ * raise __pyx_PickleError("Incompatible checksums (%s vs 0xe91bd35 = (_protected_table, _qs, _requote, _safe_table))" % __pyx_checksum) # <<<<<<<<<<<<<<
+ * __pyx_result = _Quoter.__new__(__pyx_type)
+ * if __pyx_state is not None:
+ */
+ __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_2);
+ __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0xe9, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_4);
+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+ __Pyx_INCREF(__pyx_v___pyx_PickleError);
+ __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL;
+ if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) {
+ __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2);
+ if (likely(__pyx_t_5)) {
+ PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+ __Pyx_INCREF(__pyx_t_5);
+ __Pyx_INCREF(function);
+ __Pyx_DECREF_SET(__pyx_t_2, function);
+ }
+ }
+ __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4);
+ __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+ __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+ if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+ __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+ __PYX_ERR(1, 6, __pyx_L1_error)
+
+ /* "(tree fragment)":4
+ * cdef object __pyx_PickleError
+ * cdef object __pyx_result
+ * if __pyx_checksum != 0xe91bd35: # <<<<<<<<<<<<<<
+ * from pickle import PickleError as __pyx_PickleError
+ * raise __pyx_PickleError("Incompatible checksums (%s vs 0xe91bd35 = (_protected_table, _qs, _requote, _safe_table))" % __pyx_checksum)
+ */
+ }
+
+ /* "(tree fragment)":7
+ * from pickle import PickleError as __pyx_PickleError
+ * raise __pyx_PickleError("Incompatible checksums (%s vs 0xe91bd35 = (_protected_table, _qs, _requote, _safe_table))" % __pyx_checksum)
+ * __pyx_result = _Quoter.__new__(__pyx_type) # <<<<<<<<<<<<<<
+ * if __pyx_state is not None:
+ * __pyx_unpickle__Quoter__set_state(<_Quoter> __pyx_result, __pyx_state)
+ */
+ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_4yarl_10_quoting_c__Quoter), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 7, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_2);
+ __pyx_t_4 = NULL;
+ if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
+ __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+ if (likely(__pyx_t_4)) {
+ PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+ __Pyx_INCREF(__pyx_t_4);
+ __Pyx_INCREF(function);
+ __Pyx_DECREF_SET(__pyx_t_2, function);
+ }
+ }
+ __pyx_t_3 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type);
+ __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+ if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+ __pyx_v___pyx_result = __pyx_t_3;
+ __pyx_t_3 = 0;
+
+ /* "(tree fragment)":8
+ * raise __pyx_PickleError("Incompatible checksums (%s vs 0xe91bd35 = (_protected_table, _qs, _requote, _safe_table))" % __pyx_checksum)
+ * __pyx_result = _Quoter.__new__(__pyx_type)
+ * if __pyx_state is not None: # <<<<<<<<<<<<<<
+ * __pyx_unpickle__Quoter__set_state(<_Quoter> __pyx_result, __pyx_state)
+ * return __pyx_result
+ */
+ __pyx_t_1 = (__pyx_v___pyx_state != Py_None);
+ __pyx_t_6 = (__pyx_t_1 != 0);
+ if (__pyx_t_6) {
+
+ /* "(tree fragment)":9
+ * __pyx_result = _Quoter.__new__(__pyx_type)
+ * if __pyx_state is not None:
+ * __pyx_unpickle__Quoter__set_state(<_Quoter> __pyx_result, __pyx_state) # <<<<<<<<<<<<<<
+ * return __pyx_result
+ * cdef __pyx_unpickle__Quoter__set_state(_Quoter __pyx_result, tuple __pyx_state):
+ */
+ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 9, __pyx_L1_error)
+ __pyx_t_3 = __pyx_f_4yarl_10_quoting_c___pyx_unpickle__Quoter__set_state(((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 9, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+ /* "(tree fragment)":8
+ * raise __pyx_PickleError("Incompatible checksums (%s vs 0xe91bd35 = (_protected_table, _qs, _requote, _safe_table))" % __pyx_checksum)
+ * __pyx_result = _Quoter.__new__(__pyx_type)
+ * if __pyx_state is not None: # <<<<<<<<<<<<<<
+ * __pyx_unpickle__Quoter__set_state(<_Quoter> __pyx_result, __pyx_state)
+ * return __pyx_result
+ */
+ }
+
+ /* "(tree fragment)":10
+ * if __pyx_state is not None:
+ * __pyx_unpickle__Quoter__set_state(<_Quoter> __pyx_result, __pyx_state)
+ * return __pyx_result # <<<<<<<<<<<<<<
+ * cdef __pyx_unpickle__Quoter__set_state(_Quoter __pyx_result, tuple __pyx_state):
+ * __pyx_result._protected_table = __pyx_state[0]; __pyx_result._qs = __pyx_state[1]; __pyx_result._requote = __pyx_state[2]; __pyx_result._safe_table = __pyx_state[3]
+ */
+ __Pyx_XDECREF(__pyx_r);
+ __Pyx_INCREF(__pyx_v___pyx_result);
+ __pyx_r = __pyx_v___pyx_result;
+ goto __pyx_L0;
+
+ /* "(tree fragment)":1
+ * def __pyx_unpickle__Quoter(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<<
+ * cdef object __pyx_PickleError
+ * cdef object __pyx_result
+ */
+
+ /* function exit code */
+ __pyx_L1_error:;
+ __Pyx_XDECREF(__pyx_t_2);
+ __Pyx_XDECREF(__pyx_t_3);
+ __Pyx_XDECREF(__pyx_t_4);
+ __Pyx_XDECREF(__pyx_t_5);
+ __Pyx_AddTraceback("yarl._quoting_c.__pyx_unpickle__Quoter", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __pyx_r = NULL;
+ __pyx_L0:;
+ __Pyx_XDECREF(__pyx_v___pyx_PickleError);
+ __Pyx_XDECREF(__pyx_v___pyx_result);
+ __Pyx_XGIVEREF(__pyx_r);
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "(tree fragment)":11
+ * __pyx_unpickle__Quoter__set_state(<_Quoter> __pyx_result, __pyx_state)
+ * return __pyx_result
+ * cdef __pyx_unpickle__Quoter__set_state(_Quoter __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<<
+ * __pyx_result._protected_table = __pyx_state[0]; __pyx_result._qs = __pyx_state[1]; __pyx_result._requote = __pyx_state[2]; __pyx_result._safe_table = __pyx_state[3]
+ * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'):
+ */
+
+static PyObject *__pyx_f_4yarl_10_quoting_c___pyx_unpickle__Quoter__set_state(struct __pyx_obj_4yarl_10_quoting_c__Quoter *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) {
+ PyObject *__pyx_r = NULL;
+ __Pyx_RefNannyDeclarations
+ PyObject *__pyx_t_1 = NULL;
+ uint8_t __pyx_t_2[16];
+ int __pyx_t_3;
+ Py_ssize_t __pyx_t_4;
+ int __pyx_t_5;
+ int __pyx_t_6;
+ PyObject *__pyx_t_7 = NULL;
+ PyObject *__pyx_t_8 = NULL;
+ PyObject *__pyx_t_9 = NULL;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannySetupContext("__pyx_unpickle__Quoter__set_state", 0);
+
+ /* "(tree fragment)":12
+ * return __pyx_result
+ * cdef __pyx_unpickle__Quoter__set_state(_Quoter __pyx_result, tuple __pyx_state):
+ * __pyx_result._protected_table = __pyx_state[0]; __pyx_result._qs = __pyx_state[1]; __pyx_result._requote = __pyx_state[2]; __pyx_result._safe_table = __pyx_state[3] # <<<<<<<<<<<<<<
+ * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'):
+ * __pyx_result.__dict__.update(__pyx_state[4])
+ */
+ if (unlikely(__pyx_v___pyx_state == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+ __PYX_ERR(1, 12, __pyx_L1_error)
+ }
+ __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ if (unlikely(__Pyx_carray_from_py_uint8_t(__pyx_t_1, __pyx_t_2, 16) < 0)) __PYX_ERR(1, 12, __pyx_L1_error)
+ memcpy(&(__pyx_v___pyx_result->_protected_table[0]), __pyx_t_2, sizeof(__pyx_v___pyx_result->_protected_table[0]) * (16));
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+ if (unlikely(__pyx_v___pyx_state == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+ __PYX_ERR(1, 12, __pyx_L1_error)
+ }
+ __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+ __pyx_v___pyx_result->_qs = __pyx_t_3;
+ if (unlikely(__pyx_v___pyx_state == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+ __PYX_ERR(1, 12, __pyx_L1_error)
+ }
+ __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+ __pyx_v___pyx_result->_requote = __pyx_t_3;
+ if (unlikely(__pyx_v___pyx_state == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+ __PYX_ERR(1, 12, __pyx_L1_error)
+ }
+ __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ if (unlikely(__Pyx_carray_from_py_uint8_t(__pyx_t_1, __pyx_t_2, 16) < 0)) __PYX_ERR(1, 12, __pyx_L1_error)
+ memcpy(&(__pyx_v___pyx_result->_safe_table[0]), __pyx_t_2, sizeof(__pyx_v___pyx_result->_safe_table[0]) * (16));
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+ /* "(tree fragment)":13
+ * cdef __pyx_unpickle__Quoter__set_state(_Quoter __pyx_result, tuple __pyx_state):
+ * __pyx_result._protected_table = __pyx_state[0]; __pyx_result._qs = __pyx_state[1]; __pyx_result._requote = __pyx_state[2]; __pyx_result._safe_table = __pyx_state[3]
+ * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<<
+ * __pyx_result.__dict__.update(__pyx_state[4])
+ */
+ if (unlikely(__pyx_v___pyx_state == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
+ __PYX_ERR(1, 13, __pyx_L1_error)
+ }
+ __pyx_t_4 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error)
+ __pyx_t_5 = ((__pyx_t_4 > 4) != 0);
+ if (__pyx_t_5) {
+ } else {
+ __pyx_t_3 = __pyx_t_5;
+ goto __pyx_L4_bool_binop_done;
+ }
+ __pyx_t_5 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error)
+ __pyx_t_6 = (__pyx_t_5 != 0);
+ __pyx_t_3 = __pyx_t_6;
+ __pyx_L4_bool_binop_done:;
+ if (__pyx_t_3) {
+
+ /* "(tree fragment)":14
+ * __pyx_result._protected_table = __pyx_state[0]; __pyx_result._qs = __pyx_state[1]; __pyx_result._requote = __pyx_state[2]; __pyx_result._safe_table = __pyx_state[3]
+ * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'):
+ * __pyx_result.__dict__.update(__pyx_state[4]) # <<<<<<<<<<<<<<
+ */
+ __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_7);
+ __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_update); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 14, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_8);
+ __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+ if (unlikely(__pyx_v___pyx_state == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+ __PYX_ERR(1, 14, __pyx_L1_error)
+ }
+ __pyx_t_7 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_7);
+ __pyx_t_9 = NULL;
+ if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_8))) {
+ __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_8);
+ if (likely(__pyx_t_9)) {
+ PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
+ __Pyx_INCREF(__pyx_t_9);
+ __Pyx_INCREF(function);
+ __Pyx_DECREF_SET(__pyx_t_8, function);
+ }
+ }
+ __pyx_t_1 = (__pyx_t_9) ? __Pyx_PyObject_Call2Args(__pyx_t_8, __pyx_t_9, __pyx_t_7) : __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_7);
+ __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
+ __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+ if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+ /* "(tree fragment)":13
+ * cdef __pyx_unpickle__Quoter__set_state(_Quoter __pyx_result, tuple __pyx_state):
+ * __pyx_result._protected_table = __pyx_state[0]; __pyx_result._qs = __pyx_state[1]; __pyx_result._requote = __pyx_state[2]; __pyx_result._safe_table = __pyx_state[3]
+ * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<<
+ * __pyx_result.__dict__.update(__pyx_state[4])
+ */
+ }
+
+ /* "(tree fragment)":11
+ * __pyx_unpickle__Quoter__set_state(<_Quoter> __pyx_result, __pyx_state)
+ * return __pyx_result
+ * cdef __pyx_unpickle__Quoter__set_state(_Quoter __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<<
+ * __pyx_result._protected_table = __pyx_state[0]; __pyx_result._qs = __pyx_state[1]; __pyx_result._requote = __pyx_state[2]; __pyx_result._safe_table = __pyx_state[3]
+ * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'):
+ */
+
+ /* function exit code */
+ __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+ goto __pyx_L0;
+ __pyx_L1_error:;
+ __Pyx_XDECREF(__pyx_t_1);
+ __Pyx_XDECREF(__pyx_t_7);
+ __Pyx_XDECREF(__pyx_t_8);
+ __Pyx_XDECREF(__pyx_t_9);
+ __Pyx_AddTraceback("yarl._quoting_c.__pyx_unpickle__Quoter__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __pyx_r = 0;
+ __pyx_L0:;
+ __Pyx_XGIVEREF(__pyx_r);
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "(tree fragment)":1
+ * def __pyx_unpickle__Unquoter(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<<
+ * cdef object __pyx_PickleError
+ * cdef object __pyx_result
+ */
+
+/* Python wrapper */
+static PyObject *__pyx_pw_4yarl_10_quoting_c_3__pyx_unpickle__Unquoter(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyMethodDef __pyx_mdef_4yarl_10_quoting_c_3__pyx_unpickle__Unquoter = {"__pyx_unpickle__Unquoter", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_4yarl_10_quoting_c_3__pyx_unpickle__Unquoter, METH_VARARGS|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_4yarl_10_quoting_c_3__pyx_unpickle__Unquoter(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+ PyObject *__pyx_v___pyx_type = 0;
+ long __pyx_v___pyx_checksum;
+ PyObject *__pyx_v___pyx_state = 0;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ PyObject *__pyx_r = 0;
+ __Pyx_RefNannyDeclarations
+ __Pyx_RefNannySetupContext("__pyx_unpickle__Unquoter (wrapper)", 0);
+ {
+ static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0};
+ PyObject* values[3] = {0,0,0};
+ if (unlikely(__pyx_kwds)) {
+ Py_ssize_t kw_args;
+ const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+ switch (pos_args) {
+ case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+ CYTHON_FALLTHROUGH;
+ case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+ CYTHON_FALLTHROUGH;
+ case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+ CYTHON_FALLTHROUGH;
+ case 0: break;
+ default: goto __pyx_L5_argtuple_error;
+ }
+ kw_args = PyDict_Size(__pyx_kwds);
+ switch (pos_args) {
+ case 0:
+ if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--;
+ else goto __pyx_L5_argtuple_error;
+ CYTHON_FALLTHROUGH;
+ case 1:
+ if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--;
+ else {
+ __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__Unquoter", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error)
+ }
+ CYTHON_FALLTHROUGH;
+ case 2:
+ if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--;
+ else {
+ __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__Unquoter", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error)
+ }
+ }
+ if (unlikely(kw_args > 0)) {
+ if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle__Unquoter") < 0)) __PYX_ERR(1, 1, __pyx_L3_error)
+ }
+ } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
+ goto __pyx_L5_argtuple_error;
+ } else {
+ values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+ values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+ values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+ }
+ __pyx_v___pyx_type = values[0];
+ __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error)
+ __pyx_v___pyx_state = values[2];
+ }
+ goto __pyx_L4_argument_unpacking_done;
+ __pyx_L5_argtuple_error:;
+ __Pyx_RaiseArgtupleInvalid("__pyx_unpickle__Unquoter", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 1, __pyx_L3_error)
+ __pyx_L3_error:;
+ __Pyx_AddTraceback("yarl._quoting_c.__pyx_unpickle__Unquoter", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __Pyx_RefNannyFinishContext();
+ return NULL;
+ __pyx_L4_argument_unpacking_done:;
+ __pyx_r = __pyx_pf_4yarl_10_quoting_c_2__pyx_unpickle__Unquoter(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state);
+
+ /* function exit code */
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+static PyObject *__pyx_pf_4yarl_10_quoting_c_2__pyx_unpickle__Unquoter(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) {
+ PyObject *__pyx_v___pyx_PickleError = 0;
+ PyObject *__pyx_v___pyx_result = 0;
+ PyObject *__pyx_r = NULL;
+ __Pyx_RefNannyDeclarations
+ int __pyx_t_1;
+ PyObject *__pyx_t_2 = NULL;
+ PyObject *__pyx_t_3 = NULL;
+ PyObject *__pyx_t_4 = NULL;
+ PyObject *__pyx_t_5 = NULL;
+ int __pyx_t_6;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannySetupContext("__pyx_unpickle__Unquoter", 0);
+
+ /* "(tree fragment)":4
+ * cdef object __pyx_PickleError
+ * cdef object __pyx_result
+ * if __pyx_checksum != 0x276577d: # <<<<<<<<<<<<<<
+ * from pickle import PickleError as __pyx_PickleError
+ * raise __pyx_PickleError("Incompatible checksums (%s vs 0x276577d = (_qs, _qs_quoter, _quoter, _unsafe))" % __pyx_checksum)
+ */
+ __pyx_t_1 = ((__pyx_v___pyx_checksum != 0x276577d) != 0);
+ if (__pyx_t_1) {
+
+ /* "(tree fragment)":5
+ * cdef object __pyx_result
+ * if __pyx_checksum != 0x276577d:
+ * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<<
+ * raise __pyx_PickleError("Incompatible checksums (%s vs 0x276577d = (_qs, _qs_quoter, _quoter, _unsafe))" % __pyx_checksum)
+ * __pyx_result = _Unquoter.__new__(__pyx_type)
+ */
+ __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_2);
+ __Pyx_INCREF(__pyx_n_s_PickleError);
+ __Pyx_GIVEREF(__pyx_n_s_PickleError);
+ PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError);
+ __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+ __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_2);
+ __Pyx_INCREF(__pyx_t_2);
+ __pyx_v___pyx_PickleError = __pyx_t_2;
+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+ /* "(tree fragment)":6
+ * if __pyx_checksum != 0x276577d:
+ * from pickle import PickleError as __pyx_PickleError
+ * raise __pyx_PickleError("Incompatible checksums (%s vs 0x276577d = (_qs, _qs_quoter, _quoter, _unsafe))" % __pyx_checksum) # <<<<<<<<<<<<<<
+ * __pyx_result = _Unquoter.__new__(__pyx_type)
+ * if __pyx_state is not None:
+ */
+ __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_2);
+ __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0x27, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_4);
+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+ __Pyx_INCREF(__pyx_v___pyx_PickleError);
+ __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL;
+ if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) {
+ __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2);
+ if (likely(__pyx_t_5)) {
+ PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+ __Pyx_INCREF(__pyx_t_5);
+ __Pyx_INCREF(function);
+ __Pyx_DECREF_SET(__pyx_t_2, function);
+ }
+ }
+ __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4);
+ __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+ __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+ if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+ __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+ __PYX_ERR(1, 6, __pyx_L1_error)
+
+ /* "(tree fragment)":4
+ * cdef object __pyx_PickleError
+ * cdef object __pyx_result
+ * if __pyx_checksum != 0x276577d: # <<<<<<<<<<<<<<
+ * from pickle import PickleError as __pyx_PickleError
+ * raise __pyx_PickleError("Incompatible checksums (%s vs 0x276577d = (_qs, _qs_quoter, _quoter, _unsafe))" % __pyx_checksum)
+ */
+ }
+
+ /* "(tree fragment)":7
+ * from pickle import PickleError as __pyx_PickleError
+ * raise __pyx_PickleError("Incompatible checksums (%s vs 0x276577d = (_qs, _qs_quoter, _quoter, _unsafe))" % __pyx_checksum)
+ * __pyx_result = _Unquoter.__new__(__pyx_type) # <<<<<<<<<<<<<<
+ * if __pyx_state is not None:
+ * __pyx_unpickle__Unquoter__set_state(<_Unquoter> __pyx_result, __pyx_state)
+ */
+ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_4yarl_10_quoting_c__Unquoter), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 7, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_2);
+ __pyx_t_4 = NULL;
+ if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
+ __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+ if (likely(__pyx_t_4)) {
+ PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+ __Pyx_INCREF(__pyx_t_4);
+ __Pyx_INCREF(function);
+ __Pyx_DECREF_SET(__pyx_t_2, function);
+ }
+ }
+ __pyx_t_3 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type);
+ __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
+ if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+ __pyx_v___pyx_result = __pyx_t_3;
+ __pyx_t_3 = 0;
+
+ /* "(tree fragment)":8
+ * raise __pyx_PickleError("Incompatible checksums (%s vs 0x276577d = (_qs, _qs_quoter, _quoter, _unsafe))" % __pyx_checksum)
+ * __pyx_result = _Unquoter.__new__(__pyx_type)
+ * if __pyx_state is not None: # <<<<<<<<<<<<<<
+ * __pyx_unpickle__Unquoter__set_state(<_Unquoter> __pyx_result, __pyx_state)
+ * return __pyx_result
+ */
+ __pyx_t_1 = (__pyx_v___pyx_state != Py_None);
+ __pyx_t_6 = (__pyx_t_1 != 0);
+ if (__pyx_t_6) {
+
+ /* "(tree fragment)":9
+ * __pyx_result = _Unquoter.__new__(__pyx_type)
+ * if __pyx_state is not None:
+ * __pyx_unpickle__Unquoter__set_state(<_Unquoter> __pyx_result, __pyx_state) # <<<<<<<<<<<<<<
+ * return __pyx_result
+ * cdef __pyx_unpickle__Unquoter__set_state(_Unquoter __pyx_result, tuple __pyx_state):
+ */
+ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 9, __pyx_L1_error)
+ __pyx_t_3 = __pyx_f_4yarl_10_quoting_c___pyx_unpickle__Unquoter__set_state(((struct __pyx_obj_4yarl_10_quoting_c__Unquoter *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 9, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+ /* "(tree fragment)":8
+ * raise __pyx_PickleError("Incompatible checksums (%s vs 0x276577d = (_qs, _qs_quoter, _quoter, _unsafe))" % __pyx_checksum)
+ * __pyx_result = _Unquoter.__new__(__pyx_type)
+ * if __pyx_state is not None: # <<<<<<<<<<<<<<
+ * __pyx_unpickle__Unquoter__set_state(<_Unquoter> __pyx_result, __pyx_state)
+ * return __pyx_result
+ */
+ }
+
+ /* "(tree fragment)":10
+ * if __pyx_state is not None:
+ * __pyx_unpickle__Unquoter__set_state(<_Unquoter> __pyx_result, __pyx_state)
+ * return __pyx_result # <<<<<<<<<<<<<<
+ * cdef __pyx_unpickle__Unquoter__set_state(_Unquoter __pyx_result, tuple __pyx_state):
+ * __pyx_result._qs = __pyx_state[0]; __pyx_result._qs_quoter = __pyx_state[1]; __pyx_result._quoter = __pyx_state[2]; __pyx_result._unsafe = __pyx_state[3]
+ */
+ __Pyx_XDECREF(__pyx_r);
+ __Pyx_INCREF(__pyx_v___pyx_result);
+ __pyx_r = __pyx_v___pyx_result;
+ goto __pyx_L0;
+
+ /* "(tree fragment)":1
+ * def __pyx_unpickle__Unquoter(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<<
+ * cdef object __pyx_PickleError
+ * cdef object __pyx_result
+ */
+
+ /* function exit code */
+ __pyx_L1_error:;
+ __Pyx_XDECREF(__pyx_t_2);
+ __Pyx_XDECREF(__pyx_t_3);
+ __Pyx_XDECREF(__pyx_t_4);
+ __Pyx_XDECREF(__pyx_t_5);
+ __Pyx_AddTraceback("yarl._quoting_c.__pyx_unpickle__Unquoter", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __pyx_r = NULL;
+ __pyx_L0:;
+ __Pyx_XDECREF(__pyx_v___pyx_PickleError);
+ __Pyx_XDECREF(__pyx_v___pyx_result);
+ __Pyx_XGIVEREF(__pyx_r);
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "(tree fragment)":11
+ * __pyx_unpickle__Unquoter__set_state(<_Unquoter> __pyx_result, __pyx_state)
+ * return __pyx_result
+ * cdef __pyx_unpickle__Unquoter__set_state(_Unquoter __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<<
+ * __pyx_result._qs = __pyx_state[0]; __pyx_result._qs_quoter = __pyx_state[1]; __pyx_result._quoter = __pyx_state[2]; __pyx_result._unsafe = __pyx_state[3]
+ * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'):
+ */
+
+static PyObject *__pyx_f_4yarl_10_quoting_c___pyx_unpickle__Unquoter__set_state(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) {
+ PyObject *__pyx_r = NULL;
+ __Pyx_RefNannyDeclarations
+ PyObject *__pyx_t_1 = NULL;
+ int __pyx_t_2;
+ Py_ssize_t __pyx_t_3;
+ int __pyx_t_4;
+ int __pyx_t_5;
+ PyObject *__pyx_t_6 = NULL;
+ PyObject *__pyx_t_7 = NULL;
+ PyObject *__pyx_t_8 = NULL;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannySetupContext("__pyx_unpickle__Unquoter__set_state", 0);
+
+ /* "(tree fragment)":12
+ * return __pyx_result
+ * cdef __pyx_unpickle__Unquoter__set_state(_Unquoter __pyx_result, tuple __pyx_state):
+ * __pyx_result._qs = __pyx_state[0]; __pyx_result._qs_quoter = __pyx_state[1]; __pyx_result._quoter = __pyx_state[2]; __pyx_result._unsafe = __pyx_state[3] # <<<<<<<<<<<<<<
+ * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'):
+ * __pyx_result.__dict__.update(__pyx_state[4])
+ */
+ if (unlikely(__pyx_v___pyx_state == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+ __PYX_ERR(1, 12, __pyx_L1_error)
+ }
+ __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+ __pyx_v___pyx_result->_qs = __pyx_t_2;
+ if (unlikely(__pyx_v___pyx_state == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+ __PYX_ERR(1, 12, __pyx_L1_error)
+ }
+ __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_4yarl_10_quoting_c__Quoter))))) __PYX_ERR(1, 12, __pyx_L1_error)
+ __Pyx_GIVEREF(__pyx_t_1);
+ __Pyx_GOTREF(__pyx_v___pyx_result->_qs_quoter);
+ __Pyx_DECREF(((PyObject *)__pyx_v___pyx_result->_qs_quoter));
+ __pyx_v___pyx_result->_qs_quoter = ((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)__pyx_t_1);
+ __pyx_t_1 = 0;
+ if (unlikely(__pyx_v___pyx_state == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+ __PYX_ERR(1, 12, __pyx_L1_error)
+ }
+ __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_4yarl_10_quoting_c__Quoter))))) __PYX_ERR(1, 12, __pyx_L1_error)
+ __Pyx_GIVEREF(__pyx_t_1);
+ __Pyx_GOTREF(__pyx_v___pyx_result->_quoter);
+ __Pyx_DECREF(((PyObject *)__pyx_v___pyx_result->_quoter));
+ __pyx_v___pyx_result->_quoter = ((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)__pyx_t_1);
+ __pyx_t_1 = 0;
+ if (unlikely(__pyx_v___pyx_state == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+ __PYX_ERR(1, 12, __pyx_L1_error)
+ }
+ __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ if (!(likely(PyUnicode_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_1)->tp_name), 0))) __PYX_ERR(1, 12, __pyx_L1_error)
+ __Pyx_GIVEREF(__pyx_t_1);
+ __Pyx_GOTREF(__pyx_v___pyx_result->_unsafe);
+ __Pyx_DECREF(__pyx_v___pyx_result->_unsafe);
+ __pyx_v___pyx_result->_unsafe = ((PyObject*)__pyx_t_1);
+ __pyx_t_1 = 0;
+
+ /* "(tree fragment)":13
+ * cdef __pyx_unpickle__Unquoter__set_state(_Unquoter __pyx_result, tuple __pyx_state):
+ * __pyx_result._qs = __pyx_state[0]; __pyx_result._qs_quoter = __pyx_state[1]; __pyx_result._quoter = __pyx_state[2]; __pyx_result._unsafe = __pyx_state[3]
+ * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<<
+ * __pyx_result.__dict__.update(__pyx_state[4])
+ */
+ if (unlikely(__pyx_v___pyx_state == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
+ __PYX_ERR(1, 13, __pyx_L1_error)
+ }
+ __pyx_t_3 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error)
+ __pyx_t_4 = ((__pyx_t_3 > 4) != 0);
+ if (__pyx_t_4) {
+ } else {
+ __pyx_t_2 = __pyx_t_4;
+ goto __pyx_L4_bool_binop_done;
+ }
+ __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error)
+ __pyx_t_5 = (__pyx_t_4 != 0);
+ __pyx_t_2 = __pyx_t_5;
+ __pyx_L4_bool_binop_done:;
+ if (__pyx_t_2) {
+
+ /* "(tree fragment)":14
+ * __pyx_result._qs = __pyx_state[0]; __pyx_result._qs_quoter = __pyx_state[1]; __pyx_result._quoter = __pyx_state[2]; __pyx_result._unsafe = __pyx_state[3]
+ * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'):
+ * __pyx_result.__dict__.update(__pyx_state[4]) # <<<<<<<<<<<<<<
+ */
+ __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_6);
+ __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_7);
+ __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+ if (unlikely(__pyx_v___pyx_state == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
+ __PYX_ERR(1, 14, __pyx_L1_error)
+ }
+ __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_6);
+ __pyx_t_8 = NULL;
+ if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) {
+ __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7);
+ if (likely(__pyx_t_8)) {
+ PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
+ __Pyx_INCREF(__pyx_t_8);
+ __Pyx_INCREF(function);
+ __Pyx_DECREF_SET(__pyx_t_7, function);
+ }
+ }
+ __pyx_t_1 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_8, __pyx_t_6) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6);
+ __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
+ __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+ if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+ /* "(tree fragment)":13
+ * cdef __pyx_unpickle__Unquoter__set_state(_Unquoter __pyx_result, tuple __pyx_state):
+ * __pyx_result._qs = __pyx_state[0]; __pyx_result._qs_quoter = __pyx_state[1]; __pyx_result._quoter = __pyx_state[2]; __pyx_result._unsafe = __pyx_state[3]
+ * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<<
+ * __pyx_result.__dict__.update(__pyx_state[4])
+ */
+ }
+
+ /* "(tree fragment)":11
+ * __pyx_unpickle__Unquoter__set_state(<_Unquoter> __pyx_result, __pyx_state)
+ * return __pyx_result
+ * cdef __pyx_unpickle__Unquoter__set_state(_Unquoter __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<<
+ * __pyx_result._qs = __pyx_state[0]; __pyx_result._qs_quoter = __pyx_state[1]; __pyx_result._quoter = __pyx_state[2]; __pyx_result._unsafe = __pyx_state[3]
+ * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'):
+ */
+
+ /* function exit code */
+ __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+ goto __pyx_L0;
+ __pyx_L1_error:;
+ __Pyx_XDECREF(__pyx_t_1);
+ __Pyx_XDECREF(__pyx_t_6);
+ __Pyx_XDECREF(__pyx_t_7);
+ __Pyx_XDECREF(__pyx_t_8);
+ __Pyx_AddTraceback("yarl._quoting_c.__pyx_unpickle__Unquoter__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __pyx_r = 0;
+ __pyx_L0:;
+ __Pyx_XGIVEREF(__pyx_r);
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+
+/* "carray.from_py":77
+ *
+ * @cname("__Pyx_carray_from_py_uint8_t")
+ * cdef int __Pyx_carray_from_py_uint8_t(object o, base_type *v, Py_ssize_t length) except -1: # <<<<<<<<<<<<<<
+ * cdef Py_ssize_t i = length
+ * try:
+ */
+
+static int __Pyx_carray_from_py_uint8_t(PyObject *__pyx_v_o, uint8_t *__pyx_v_v, Py_ssize_t __pyx_v_length) {
+ Py_ssize_t __pyx_v_i;
+ PyObject *__pyx_v_item = NULL;
+ int __pyx_r;
+ __Pyx_RefNannyDeclarations
+ PyObject *__pyx_t_1 = NULL;
+ PyObject *__pyx_t_2 = NULL;
+ PyObject *__pyx_t_3 = NULL;
+ Py_ssize_t __pyx_t_4;
+ int __pyx_t_5;
+ int __pyx_t_6;
+ PyObject *__pyx_t_7 = NULL;
+ Py_ssize_t __pyx_t_8;
+ PyObject *(*__pyx_t_9)(PyObject *);
+ PyObject *__pyx_t_10 = NULL;
+ uint8_t __pyx_t_11;
+ char const *__pyx_t_12;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannySetupContext("__Pyx_carray_from_py_uint8_t", 0);
+
+ /* "carray.from_py":78
+ * @cname("__Pyx_carray_from_py_uint8_t")
+ * cdef int __Pyx_carray_from_py_uint8_t(object o, base_type *v, Py_ssize_t length) except -1:
+ * cdef Py_ssize_t i = length # <<<<<<<<<<<<<<
+ * try:
+ * i = len(o)
+ */
+ __pyx_v_i = __pyx_v_length;
+
+ /* "carray.from_py":79
+ * cdef int __Pyx_carray_from_py_uint8_t(object o, base_type *v, Py_ssize_t length) except -1:
+ * cdef Py_ssize_t i = length
+ * try: # <<<<<<<<<<<<<<
+ * i = len(o)
+ * except (TypeError, OverflowError):
+ */
+ {
+ __Pyx_PyThreadState_declare
+ __Pyx_PyThreadState_assign
+ __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3);
+ __Pyx_XGOTREF(__pyx_t_1);
+ __Pyx_XGOTREF(__pyx_t_2);
+ __Pyx_XGOTREF(__pyx_t_3);
+ /*try:*/ {
+
+ /* "carray.from_py":80
+ * cdef Py_ssize_t i = length
+ * try:
+ * i = len(o) # <<<<<<<<<<<<<<
+ * except (TypeError, OverflowError):
+ * pass
+ */
+ __pyx_t_4 = PyObject_Length(__pyx_v_o); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(1, 80, __pyx_L3_error)
+ __pyx_v_i = __pyx_t_4;
+
+ /* "carray.from_py":79
+ * cdef int __Pyx_carray_from_py_uint8_t(object o, base_type *v, Py_ssize_t length) except -1:
+ * cdef Py_ssize_t i = length
+ * try: # <<<<<<<<<<<<<<
+ * i = len(o)
+ * except (TypeError, OverflowError):
+ */
+ }
+ __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
+ __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
+ __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+ goto __pyx_L8_try_end;
+ __pyx_L3_error:;
+
+ /* "carray.from_py":81
+ * try:
+ * i = len(o)
+ * except (TypeError, OverflowError): # <<<<<<<<<<<<<<
+ * pass
+ * if i == length:
+ */
+ __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError) || __Pyx_PyErr_ExceptionMatches(__pyx_builtin_OverflowError);
+ if (__pyx_t_5) {
+ __Pyx_ErrRestore(0,0,0);
+ goto __pyx_L4_exception_handled;
+ }
+ goto __pyx_L5_except_error;
+ __pyx_L5_except_error:;
+
+ /* "carray.from_py":79
+ * cdef int __Pyx_carray_from_py_uint8_t(object o, base_type *v, Py_ssize_t length) except -1:
+ * cdef Py_ssize_t i = length
+ * try: # <<<<<<<<<<<<<<
+ * i = len(o)
+ * except (TypeError, OverflowError):
+ */
+ __Pyx_XGIVEREF(__pyx_t_1);
+ __Pyx_XGIVEREF(__pyx_t_2);
+ __Pyx_XGIVEREF(__pyx_t_3);
+ __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
+ goto __pyx_L1_error;
+ __pyx_L4_exception_handled:;
+ __Pyx_XGIVEREF(__pyx_t_1);
+ __Pyx_XGIVEREF(__pyx_t_2);
+ __Pyx_XGIVEREF(__pyx_t_3);
+ __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
+ __pyx_L8_try_end:;
+ }
+
+ /* "carray.from_py":83
+ * except (TypeError, OverflowError):
+ * pass
+ * if i == length: # <<<<<<<<<<<<<<
+ * for i, item in enumerate(o):
+ * if i >= length:
+ */
+ __pyx_t_6 = ((__pyx_v_i == __pyx_v_length) != 0);
+ if (__pyx_t_6) {
+
+ /* "carray.from_py":84
+ * pass
+ * if i == length:
+ * for i, item in enumerate(o): # <<<<<<<<<<<<<<
+ * if i >= length:
+ * break
+ */
+ __pyx_t_4 = 0;
+ if (likely(PyList_CheckExact(__pyx_v_o)) || PyTuple_CheckExact(__pyx_v_o)) {
+ __pyx_t_7 = __pyx_v_o; __Pyx_INCREF(__pyx_t_7); __pyx_t_8 = 0;
+ __pyx_t_9 = NULL;
+ } else {
+ __pyx_t_8 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_v_o); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 84, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_7);
+ __pyx_t_9 = Py_TYPE(__pyx_t_7)->tp_iternext; if (unlikely(!__pyx_t_9)) __PYX_ERR(1, 84, __pyx_L1_error)
+ }
+ for (;;) {
+ if (likely(!__pyx_t_9)) {
+ if (likely(PyList_CheckExact(__pyx_t_7))) {
+ if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_7)) break;
+ #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+ __pyx_t_10 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(1, 84, __pyx_L1_error)
+ #else
+ __pyx_t_10 = PySequence_ITEM(__pyx_t_7, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 84, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_10);
+ #endif
+ } else {
+ if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
+ #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+ __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++; if (unlikely(0 < 0)) __PYX_ERR(1, 84, __pyx_L1_error)
+ #else
+ __pyx_t_10 = PySequence_ITEM(__pyx_t_7, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_10)) __PYX_ERR(1, 84, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_10);
+ #endif
+ }
+ } else {
+ __pyx_t_10 = __pyx_t_9(__pyx_t_7);
+ if (unlikely(!__pyx_t_10)) {
+ PyObject* exc_type = PyErr_Occurred();
+ if (exc_type) {
+ if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
+ else __PYX_ERR(1, 84, __pyx_L1_error)
+ }
+ break;
+ }
+ __Pyx_GOTREF(__pyx_t_10);
+ }
+ __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_10);
+ __pyx_t_10 = 0;
+ __pyx_v_i = __pyx_t_4;
+ __pyx_t_4 = (__pyx_t_4 + 1);
+
+ /* "carray.from_py":85
+ * if i == length:
+ * for i, item in enumerate(o):
+ * if i >= length: # <<<<<<<<<<<<<<
+ * break
+ * v[i] = item
+ */
+ __pyx_t_6 = ((__pyx_v_i >= __pyx_v_length) != 0);
+ if (__pyx_t_6) {
+
+ /* "carray.from_py":86
+ * for i, item in enumerate(o):
+ * if i >= length:
+ * break # <<<<<<<<<<<<<<
+ * v[i] = item
+ * else:
+ */
+ goto __pyx_L11_break;
+
+ /* "carray.from_py":85
+ * if i == length:
+ * for i, item in enumerate(o):
+ * if i >= length: # <<<<<<<<<<<<<<
+ * break
+ * v[i] = item
+ */
+ }
+
+ /* "carray.from_py":87
+ * if i >= length:
+ * break
+ * v[i] = item # <<<<<<<<<<<<<<
+ * else:
+ * i += 1 # convert index to length
+ */
+ __pyx_t_11 = __Pyx_PyInt_As_uint8_t(__pyx_v_item); if (unlikely((__pyx_t_11 == ((uint8_t)-1)) && PyErr_Occurred())) __PYX_ERR(1, 87, __pyx_L1_error)
+ (__pyx_v_v[__pyx_v_i]) = __pyx_t_11;
+
+ /* "carray.from_py":84
+ * pass
+ * if i == length:
+ * for i, item in enumerate(o): # <<<<<<<<<<<<<<
+ * if i >= length:
+ * break
+ */
+ }
+ /*else*/ {
+
+ /* "carray.from_py":89
+ * v[i] = item
+ * else:
+ * i += 1 # convert index to length # <<<<<<<<<<<<<<
+ * if i == length:
+ * return 0
+ */
+ __pyx_v_i = (__pyx_v_i + 1);
+
+ /* "carray.from_py":90
+ * else:
+ * i += 1 # convert index to length
+ * if i == length: # <<<<<<<<<<<<<<
+ * return 0
+ *
+ */
+ __pyx_t_6 = ((__pyx_v_i == __pyx_v_length) != 0);
+ if (__pyx_t_6) {
+
+ /* "carray.from_py":91
+ * i += 1 # convert index to length
+ * if i == length:
+ * return 0 # <<<<<<<<<<<<<<
+ *
+ * PyErr_Format(
+ */
+ __pyx_r = 0;
+ __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+ goto __pyx_L0;
+
+ /* "carray.from_py":90
+ * else:
+ * i += 1 # convert index to length
+ * if i == length: # <<<<<<<<<<<<<<
+ * return 0
+ *
+ */
+ }
+ }
+
+ /* "carray.from_py":84
+ * pass
+ * if i == length:
+ * for i, item in enumerate(o): # <<<<<<<<<<<<<<
+ * if i >= length:
+ * break
+ */
+ __pyx_L11_break:;
+ __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+ /* "carray.from_py":83
+ * except (TypeError, OverflowError):
+ * pass
+ * if i == length: # <<<<<<<<<<<<<<
+ * for i, item in enumerate(o):
+ * if i >= length:
+ */
+ }
+
+ /* "carray.from_py":96
+ * IndexError,
+ * ("too many values found during array assignment, expected %zd"
+ * if i >= length else # <<<<<<<<<<<<<<
+ * "not enough values found during array assignment, expected %zd, got %zd"),
+ * length, i)
+ */
+ if (((__pyx_v_i >= __pyx_v_length) != 0)) {
+ __pyx_t_12 = ((char const *)"too many values found during array assignment, expected %zd");
+ } else {
+ __pyx_t_12 = ((char const *)"not enough values found during array assignment, expected %zd, got %zd");
+ }
+
+ /* "carray.from_py":93
+ * return 0
+ *
+ * PyErr_Format( # <<<<<<<<<<<<<<
+ * IndexError,
+ * ("too many values found during array assignment, expected %zd"
+ */
+ __pyx_t_7 = PyErr_Format(__pyx_builtin_IndexError, __pyx_t_12, __pyx_v_length, __pyx_v_i); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 93, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_7);
+ __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+
+ /* "carray.from_py":77
+ *
+ * @cname("__Pyx_carray_from_py_uint8_t")
+ * cdef int __Pyx_carray_from_py_uint8_t(object o, base_type *v, Py_ssize_t length) except -1: # <<<<<<<<<<<<<<
+ * cdef Py_ssize_t i = length
+ * try:
+ */
+
+ /* function exit code */
+ __pyx_r = 0;
+ goto __pyx_L0;
+ __pyx_L1_error:;
+ __Pyx_XDECREF(__pyx_t_7);
+ __Pyx_XDECREF(__pyx_t_10);
+ __Pyx_AddTraceback("carray.from_py.__Pyx_carray_from_py_uint8_t", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __pyx_r = -1;
+ __pyx_L0:;
+ __Pyx_XDECREF(__pyx_v_item);
+ __Pyx_RefNannyFinishContext();
+ return __pyx_r;
+}
+static struct __pyx_vtabstruct_4yarl_10_quoting_c__Quoter __pyx_vtable_4yarl_10_quoting_c__Quoter;
+
+static PyObject *__pyx_tp_new_4yarl_10_quoting_c__Quoter(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+ struct __pyx_obj_4yarl_10_quoting_c__Quoter *p;
+ PyObject *o;
+ if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
+ o = (*t->tp_alloc)(t, 0);
+ } else {
+ o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+ }
+ if (unlikely(!o)) return 0;
+ p = ((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)o);
+ p->__pyx_vtab = __pyx_vtabptr_4yarl_10_quoting_c__Quoter;
+ return o;
+}
+
+static void __pyx_tp_dealloc_4yarl_10_quoting_c__Quoter(PyObject *o) {
+ #if CYTHON_USE_TP_FINALIZE
+ if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) {
+ if (PyObject_CallFinalizerFromDealloc(o)) return;
+ }
+ #endif
+ (*Py_TYPE(o)->tp_free)(o);
+}
+
+static PyMethodDef __pyx_methods_4yarl_10_quoting_c__Quoter[] = {
+ {"__reduce_cython__", (PyCFunction)__pyx_pw_4yarl_10_quoting_c_7_Quoter_5__reduce_cython__, METH_NOARGS, 0},
+ {"__setstate_cython__", (PyCFunction)__pyx_pw_4yarl_10_quoting_c_7_Quoter_7__setstate_cython__, METH_O, 0},
+ {0, 0, 0, 0}
+};
+
+static PyTypeObject __pyx_type_4yarl_10_quoting_c__Quoter = {
+ PyVarObject_HEAD_INIT(0, 0)
+ "yarl._quoting_c._Quoter", /*tp_name*/
+ sizeof(struct __pyx_obj_4yarl_10_quoting_c__Quoter), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ __pyx_tp_dealloc_4yarl_10_quoting_c__Quoter, /*tp_dealloc*/
+ #if PY_VERSION_HEX < 0x030800b4
+ 0, /*tp_print*/
+ #endif
+ #if PY_VERSION_HEX >= 0x030800b4
+ 0, /*tp_vectorcall_offset*/
+ #endif
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ #if PY_MAJOR_VERSION < 3
+ 0, /*tp_compare*/
+ #endif
+ #if PY_MAJOR_VERSION >= 3
+ 0, /*tp_as_async*/
+ #endif
+ 0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash*/
+ __pyx_pw_4yarl_10_quoting_c_7_Quoter_3__call__, /*tp_call*/
+ 0, /*tp_str*/
+ 0, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
+ 0, /*tp_doc*/
+ 0, /*tp_traverse*/
+ 0, /*tp_clear*/
+ 0, /*tp_richcompare*/
+ 0, /*tp_weaklistoffset*/
+ 0, /*tp_iter*/
+ 0, /*tp_iternext*/
+ __pyx_methods_4yarl_10_quoting_c__Quoter, /*tp_methods*/
+ 0, /*tp_members*/
+ 0, /*tp_getset*/
+ 0, /*tp_base*/
+ 0, /*tp_dict*/
+ 0, /*tp_descr_get*/
+ 0, /*tp_descr_set*/
+ 0, /*tp_dictoffset*/
+ __pyx_pw_4yarl_10_quoting_c_7_Quoter_1__init__, /*tp_init*/
+ 0, /*tp_alloc*/
+ __pyx_tp_new_4yarl_10_quoting_c__Quoter, /*tp_new*/
+ 0, /*tp_free*/
+ 0, /*tp_is_gc*/
+ 0, /*tp_bases*/
+ 0, /*tp_mro*/
+ 0, /*tp_cache*/
+ 0, /*tp_subclasses*/
+ 0, /*tp_weaklist*/
+ 0, /*tp_del*/
+ 0, /*tp_version_tag*/
+ #if PY_VERSION_HEX >= 0x030400a1
+ 0, /*tp_finalize*/
+ #endif
+ #if PY_VERSION_HEX >= 0x030800b1
+ 0, /*tp_vectorcall*/
+ #endif
+ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000
+ 0, /*tp_print*/
+ #endif
+};
+static struct __pyx_vtabstruct_4yarl_10_quoting_c__Unquoter __pyx_vtable_4yarl_10_quoting_c__Unquoter;
+
+static PyObject *__pyx_tp_new_4yarl_10_quoting_c__Unquoter(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+ struct __pyx_obj_4yarl_10_quoting_c__Unquoter *p;
+ PyObject *o;
+ if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
+ o = (*t->tp_alloc)(t, 0);
+ } else {
+ o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+ }
+ if (unlikely(!o)) return 0;
+ p = ((struct __pyx_obj_4yarl_10_quoting_c__Unquoter *)o);
+ p->__pyx_vtab = __pyx_vtabptr_4yarl_10_quoting_c__Unquoter;
+ p->_unsafe = ((PyObject*)Py_None); Py_INCREF(Py_None);
+ p->_quoter = ((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)Py_None); Py_INCREF(Py_None);
+ p->_qs_quoter = ((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)Py_None); Py_INCREF(Py_None);
+ return o;
+}
+
+static void __pyx_tp_dealloc_4yarl_10_quoting_c__Unquoter(PyObject *o) {
+ struct __pyx_obj_4yarl_10_quoting_c__Unquoter *p = (struct __pyx_obj_4yarl_10_quoting_c__Unquoter *)o;
+ #if CYTHON_USE_TP_FINALIZE
+ if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
+ if (PyObject_CallFinalizerFromDealloc(o)) return;
+ }
+ #endif
+ PyObject_GC_UnTrack(o);
+ Py_CLEAR(p->_unsafe);
+ Py_CLEAR(p->_quoter);
+ Py_CLEAR(p->_qs_quoter);
+ (*Py_TYPE(o)->tp_free)(o);
+}
+
+static int __pyx_tp_traverse_4yarl_10_quoting_c__Unquoter(PyObject *o, visitproc v, void *a) {
+ int e;
+ struct __pyx_obj_4yarl_10_quoting_c__Unquoter *p = (struct __pyx_obj_4yarl_10_quoting_c__Unquoter *)o;
+ if (p->_quoter) {
+ e = (*v)(((PyObject *)p->_quoter), a); if (e) return e;
+ }
+ if (p->_qs_quoter) {
+ e = (*v)(((PyObject *)p->_qs_quoter), a); if (e) return e;
+ }
+ return 0;
+}
+
+static int __pyx_tp_clear_4yarl_10_quoting_c__Unquoter(PyObject *o) {
+ PyObject* tmp;
+ struct __pyx_obj_4yarl_10_quoting_c__Unquoter *p = (struct __pyx_obj_4yarl_10_quoting_c__Unquoter *)o;
+ tmp = ((PyObject*)p->_quoter);
+ p->_quoter = ((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)Py_None); Py_INCREF(Py_None);
+ Py_XDECREF(tmp);
+ tmp = ((PyObject*)p->_qs_quoter);
+ p->_qs_quoter = ((struct __pyx_obj_4yarl_10_quoting_c__Quoter *)Py_None); Py_INCREF(Py_None);
+ Py_XDECREF(tmp);
+ return 0;
+}
+
+static PyMethodDef __pyx_methods_4yarl_10_quoting_c__Unquoter[] = {
+ {"__reduce_cython__", (PyCFunction)__pyx_pw_4yarl_10_quoting_c_9_Unquoter_5__reduce_cython__, METH_NOARGS, 0},
+ {"__setstate_cython__", (PyCFunction)__pyx_pw_4yarl_10_quoting_c_9_Unquoter_7__setstate_cython__, METH_O, 0},
+ {0, 0, 0, 0}
+};
+
+static PyTypeObject __pyx_type_4yarl_10_quoting_c__Unquoter = {
+ PyVarObject_HEAD_INIT(0, 0)
+ "yarl._quoting_c._Unquoter", /*tp_name*/
+ sizeof(struct __pyx_obj_4yarl_10_quoting_c__Unquoter), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ __pyx_tp_dealloc_4yarl_10_quoting_c__Unquoter, /*tp_dealloc*/
+ #if PY_VERSION_HEX < 0x030800b4
+ 0, /*tp_print*/
+ #endif
+ #if PY_VERSION_HEX >= 0x030800b4
+ 0, /*tp_vectorcall_offset*/
+ #endif
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ #if PY_MAJOR_VERSION < 3
+ 0, /*tp_compare*/
+ #endif
+ #if PY_MAJOR_VERSION >= 3
+ 0, /*tp_as_async*/
+ #endif
+ 0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash*/
+ __pyx_pw_4yarl_10_quoting_c_9_Unquoter_3__call__, /*tp_call*/
+ 0, /*tp_str*/
+ 0, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+ 0, /*tp_doc*/
+ __pyx_tp_traverse_4yarl_10_quoting_c__Unquoter, /*tp_traverse*/
+ __pyx_tp_clear_4yarl_10_quoting_c__Unquoter, /*tp_clear*/
+ 0, /*tp_richcompare*/
+ 0, /*tp_weaklistoffset*/
+ 0, /*tp_iter*/
+ 0, /*tp_iternext*/
+ __pyx_methods_4yarl_10_quoting_c__Unquoter, /*tp_methods*/
+ 0, /*tp_members*/
+ 0, /*tp_getset*/
+ 0, /*tp_base*/
+ 0, /*tp_dict*/
+ 0, /*tp_descr_get*/
+ 0, /*tp_descr_set*/
+ 0, /*tp_dictoffset*/
+ __pyx_pw_4yarl_10_quoting_c_9_Unquoter_1__init__, /*tp_init*/
+ 0, /*tp_alloc*/
+ __pyx_tp_new_4yarl_10_quoting_c__Unquoter, /*tp_new*/
+ 0, /*tp_free*/
+ 0, /*tp_is_gc*/
+ 0, /*tp_bases*/
+ 0, /*tp_mro*/
+ 0, /*tp_cache*/
+ 0, /*tp_subclasses*/
+ 0, /*tp_weaklist*/
+ 0, /*tp_del*/
+ 0, /*tp_version_tag*/
+ #if PY_VERSION_HEX >= 0x030400a1
+ 0, /*tp_finalize*/
+ #endif
+ #if PY_VERSION_HEX >= 0x030800b1
+ 0, /*tp_vectorcall*/
+ #endif
+ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000
+ 0, /*tp_print*/
+ #endif
+};
+
+static PyMethodDef __pyx_methods[] = {
+ {0, 0, 0, 0}
+};
+
+#if PY_MAJOR_VERSION >= 3
+#if CYTHON_PEP489_MULTI_PHASE_INIT
+static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/
+static int __pyx_pymod_exec__quoting_c(PyObject* module); /*proto*/
+static PyModuleDef_Slot __pyx_moduledef_slots[] = {
+ {Py_mod_create, (void*)__pyx_pymod_create},
+ {Py_mod_exec, (void*)__pyx_pymod_exec__quoting_c},
+ {0, NULL}
+};
+#endif
+
+static struct PyModuleDef __pyx_moduledef = {
+ PyModuleDef_HEAD_INIT,
+ "_quoting_c",
+ 0, /* m_doc */
+ #if CYTHON_PEP489_MULTI_PHASE_INIT
+ 0, /* m_size */
+ #else
+ -1, /* m_size */
+ #endif
+ __pyx_methods /* m_methods */,
+ #if CYTHON_PEP489_MULTI_PHASE_INIT
+ __pyx_moduledef_slots, /* m_slots */
+ #else
+ NULL, /* m_reload */
+ #endif
+ NULL, /* m_traverse */
+ NULL, /* m_clear */
+ NULL /* m_free */
+};
+#endif
+#ifndef CYTHON_SMALL_CODE
+#if defined(__clang__)
+ #define CYTHON_SMALL_CODE
+#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
+ #define CYTHON_SMALL_CODE __attribute__((cold))
+#else
+ #define CYTHON_SMALL_CODE
+#endif
+#endif
+
+static __Pyx_StringTabEntry __pyx_string_tab[] = {
+ {&__pyx_kp_u_, __pyx_k_, sizeof(__pyx_k_), 0, 1, 0, 0},
+ {&__pyx_kp_u_Argument_should_be_str, __pyx_k_Argument_should_be_str, sizeof(__pyx_k_Argument_should_be_str), 0, 1, 0, 0},
+ {&__pyx_kp_s_Incompatible_checksums_s_vs_0x27, __pyx_k_Incompatible_checksums_s_vs_0x27, sizeof(__pyx_k_Incompatible_checksums_s_vs_0x27), 0, 0, 1, 0},
+ {&__pyx_kp_s_Incompatible_checksums_s_vs_0xe9, __pyx_k_Incompatible_checksums_s_vs_0xe9, sizeof(__pyx_k_Incompatible_checksums_s_vs_0xe9), 0, 0, 1, 0},
+ {&__pyx_n_s_IndexError, __pyx_k_IndexError, sizeof(__pyx_k_IndexError), 0, 0, 1, 1},
+ {&__pyx_kp_u_Only_safe_symbols_with_ORD_128_a, __pyx_k_Only_safe_symbols_with_ORD_128_a, sizeof(__pyx_k_Only_safe_symbols_with_ORD_128_a), 0, 1, 0, 0},
+ {&__pyx_n_s_OverflowError, __pyx_k_OverflowError, sizeof(__pyx_k_OverflowError), 0, 0, 1, 1},
+ {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1},
+ {&__pyx_n_s_Quoter, __pyx_k_Quoter, sizeof(__pyx_k_Quoter), 0, 0, 1, 1},
+ {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1},
+ {&__pyx_n_s_UnicodeDecodeError, __pyx_k_UnicodeDecodeError, sizeof(__pyx_k_UnicodeDecodeError), 0, 0, 1, 1},
+ {&__pyx_n_s_Unquoter, __pyx_k_Unquoter, sizeof(__pyx_k_Unquoter), 0, 0, 1, 1},
+ {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1},
+ {&__pyx_kp_u__10, __pyx_k__10, sizeof(__pyx_k__10), 0, 1, 0, 0},
+ {&__pyx_kp_u__11, __pyx_k__11, sizeof(__pyx_k__11), 0, 1, 0, 0},
+ {&__pyx_kp_u__12, __pyx_k__12, sizeof(__pyx_k__12), 0, 1, 0, 0},
+ {&__pyx_kp_u__13, __pyx_k__13, sizeof(__pyx_k__13), 0, 1, 0, 0},
+ {&__pyx_kp_u__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 1, 0, 0},
+ {&__pyx_kp_u__5, __pyx_k__5, sizeof(__pyx_k__5), 0, 1, 0, 0},
+ {&__pyx_kp_u__6, __pyx_k__6, sizeof(__pyx_k__6), 0, 1, 0, 0},
+ {&__pyx_kp_u__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 1, 0, 0},
+ {&__pyx_kp_u__9, __pyx_k__9, sizeof(__pyx_k__9), 0, 1, 0, 0},
+ {&__pyx_n_s_ascii_letters, __pyx_k_ascii_letters, sizeof(__pyx_k_ascii_letters), 0, 0, 1, 1},
+ {&__pyx_n_s_chr, __pyx_k_chr, sizeof(__pyx_k_chr), 0, 0, 1, 1},
+ {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1},
+ {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1},
+ {&__pyx_n_s_digits, __pyx_k_digits, sizeof(__pyx_k_digits), 0, 0, 1, 1},
+ {&__pyx_n_s_enumerate, __pyx_k_enumerate, sizeof(__pyx_k_enumerate), 0, 0, 1, 1},
+ {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1},
+ {&__pyx_n_s_hex, __pyx_k_hex, sizeof(__pyx_k_hex), 0, 0, 1, 1},
+ {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1},
+ {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1},
+ {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1},
+ {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1},
+ {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1},
+ {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1},
+ {&__pyx_n_s_protected, __pyx_k_protected, sizeof(__pyx_k_protected), 0, 0, 1, 1},
+ {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1},
+ {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1},
+ {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1},
+ {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1},
+ {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1},
+ {&__pyx_n_s_pyx_unpickle__Quoter, __pyx_k_pyx_unpickle__Quoter, sizeof(__pyx_k_pyx_unpickle__Quoter), 0, 0, 1, 1},
+ {&__pyx_n_s_pyx_unpickle__Unquoter, __pyx_k_pyx_unpickle__Unquoter, sizeof(__pyx_k_pyx_unpickle__Unquoter), 0, 0, 1, 1},
+ {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1},
+ {&__pyx_n_s_qs, __pyx_k_qs, sizeof(__pyx_k_qs), 0, 0, 1, 1},
+ {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1},
+ {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1},
+ {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1},
+ {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1},
+ {&__pyx_n_s_requote, __pyx_k_requote, sizeof(__pyx_k_requote), 0, 0, 1, 1},
+ {&__pyx_n_s_safe, __pyx_k_safe, sizeof(__pyx_k_safe), 0, 0, 1, 1},
+ {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1},
+ {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1},
+ {&__pyx_n_s_string, __pyx_k_string, sizeof(__pyx_k_string), 0, 0, 1, 1},
+ {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0},
+ {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1},
+ {&__pyx_n_s_unsafe, __pyx_k_unsafe, sizeof(__pyx_k_unsafe), 0, 0, 1, 1},
+ {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1},
+ {&__pyx_n_s_upper, __pyx_k_upper, sizeof(__pyx_k_upper), 0, 0, 1, 1},
+ {&__pyx_n_s_val, __pyx_k_val, sizeof(__pyx_k_val), 0, 0, 1, 1},
+ {&__pyx_n_s_yarl__quoting_c, __pyx_k_yarl__quoting_c, sizeof(__pyx_k_yarl__quoting_c), 0, 0, 1, 1},
+ {0, 0, 0, 0, 0, 0, 0}
+};
+static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) {
+ __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 70, __pyx_L1_error)
+ __pyx_builtin_chr = __Pyx_GetBuiltinName(__pyx_n_s_chr); if (!__pyx_builtin_chr) __PYX_ERR(0, 71, __pyx_L1_error)
+ __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 194, __pyx_L1_error)
+ __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(0, 213, __pyx_L1_error)
+ __pyx_builtin_UnicodeDecodeError = __Pyx_GetBuiltinName(__pyx_n_s_UnicodeDecodeError); if (!__pyx_builtin_UnicodeDecodeError) __PYX_ERR(0, 320, __pyx_L1_error)
+ __pyx_builtin_hex = __Pyx_GetBuiltinName(__pyx_n_s_hex); if (!__pyx_builtin_hex) __PYX_ERR(0, 361, __pyx_L1_error)
+ __pyx_builtin_OverflowError = __Pyx_GetBuiltinName(__pyx_n_s_OverflowError); if (!__pyx_builtin_OverflowError) __PYX_ERR(1, 81, __pyx_L1_error)
+ __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(1, 84, __pyx_L1_error)
+ __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) __PYX_ERR(1, 94, __pyx_L1_error)
+ return 0;
+ __pyx_L1_error:;
+ return -1;
+}
+
+static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
+ __Pyx_RefNannyDeclarations
+ __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
+
+ /* "yarl/_quoting_c.pyx":194
+ * for ch in safe:
+ * if ord(ch) > 127:
+ * raise ValueError("Only safe symbols with ORD < 128 are allowed") # <<<<<<<<<<<<<<
+ * set_bit(self._safe_table, ch)
+ *
+ */
+ __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_Only_safe_symbols_with_ORD_128_a); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 194, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_tuple__2);
+ __Pyx_GIVEREF(__pyx_tuple__2);
+
+ /* "yarl/_quoting_c.pyx":213
+ * val = str(val)
+ * else:
+ * raise TypeError("Argument should be str") # <<<<<<<<<<<<<<
+ * _init_writer(&writer)
+ * try:
+ */
+ __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_u_Argument_should_be_str); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 213, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_tuple__3);
+ __Pyx_GIVEREF(__pyx_tuple__3);
+
+ /* "yarl/_quoting_c.pyx":361
+ * if ch in self._unsafe:
+ * ret.append('%')
+ * h = hex(ord(ch)).upper()[2:] # <<<<<<<<<<<<<<
+ * for ch in h:
+ * ret.append(ch)
+ */
+ __pyx_slice__8 = PySlice_New(__pyx_int_2, Py_None, Py_None); if (unlikely(!__pyx_slice__8)) __PYX_ERR(0, 361, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_slice__8);
+ __Pyx_GIVEREF(__pyx_slice__8);
+
+ /* "(tree fragment)":1
+ * def __pyx_unpickle__Quoter(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<<
+ * cdef object __pyx_PickleError
+ * cdef object __pyx_result
+ */
+ __pyx_tuple__14 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(1, 1, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_tuple__14);
+ __Pyx_GIVEREF(__pyx_tuple__14);
+ __pyx_codeobj__15 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__14, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle__Quoter, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__15)) __PYX_ERR(1, 1, __pyx_L1_error)
+ __pyx_tuple__16 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(1, 1, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_tuple__16);
+ __Pyx_GIVEREF(__pyx_tuple__16);
+ __pyx_codeobj__17 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__16, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle__Unquoter, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__17)) __PYX_ERR(1, 1, __pyx_L1_error)
+ __Pyx_RefNannyFinishContext();
+ return 0;
+ __pyx_L1_error:;
+ __Pyx_RefNannyFinishContext();
+ return -1;
+}
+
+static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) {
+ if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error);
+ __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) __PYX_ERR(0, 1, __pyx_L1_error)
+ __pyx_int_41310077 = PyInt_FromLong(41310077L); if (unlikely(!__pyx_int_41310077)) __PYX_ERR(0, 1, __pyx_L1_error)
+ __pyx_int_244432181 = PyInt_FromLong(244432181L); if (unlikely(!__pyx_int_244432181)) __PYX_ERR(0, 1, __pyx_L1_error)
+ return 0;
+ __pyx_L1_error:;
+ return -1;
+}
+
+static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/
+static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/
+static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/
+static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/
+static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/
+static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/
+static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/
+
+static int __Pyx_modinit_global_init_code(void) {
+ __Pyx_RefNannyDeclarations
+ __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0);
+ /*--- Global init code ---*/
+ __pyx_v_4yarl_10_quoting_c_GEN_DELIMS = ((PyObject*)Py_None); Py_INCREF(Py_None);
+ __pyx_v_4yarl_10_quoting_c_SUB_DELIMS_WITHOUT_QS = ((PyObject*)Py_None); Py_INCREF(Py_None);
+ __pyx_v_4yarl_10_quoting_c_SUB_DELIMS = ((PyObject*)Py_None); Py_INCREF(Py_None);
+ __pyx_v_4yarl_10_quoting_c_RESERVED = ((PyObject*)Py_None); Py_INCREF(Py_None);
+ __pyx_v_4yarl_10_quoting_c_UNRESERVED = ((PyObject*)Py_None); Py_INCREF(Py_None);
+ __pyx_v_4yarl_10_quoting_c_ALLOWED = ((PyObject*)Py_None); Py_INCREF(Py_None);
+ __pyx_v_4yarl_10_quoting_c_QS = ((PyObject*)Py_None); Py_INCREF(Py_None);
+ __Pyx_RefNannyFinishContext();
+ return 0;
+}
+
+static int __Pyx_modinit_variable_export_code(void) {
+ __Pyx_RefNannyDeclarations
+ __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0);
+ /*--- Variable export code ---*/
+ __Pyx_RefNannyFinishContext();
+ return 0;
+}
+
+static int __Pyx_modinit_function_export_code(void) {
+ __Pyx_RefNannyDeclarations
+ __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0);
+ /*--- Function export code ---*/
+ __Pyx_RefNannyFinishContext();
+ return 0;
+}
+
+static int __Pyx_modinit_type_init_code(void) {
+ __Pyx_RefNannyDeclarations
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0);
+ /*--- Type init code ---*/
+ __pyx_vtabptr_4yarl_10_quoting_c__Quoter = &__pyx_vtable_4yarl_10_quoting_c__Quoter;
+ __pyx_vtable_4yarl_10_quoting_c__Quoter._do_quote = (PyObject *(*)(struct __pyx_obj_4yarl_10_quoting_c__Quoter *, PyObject *, struct __pyx_t_4yarl_10_quoting_c_Writer *))__pyx_f_4yarl_10_quoting_c_7_Quoter__do_quote;
+ __pyx_vtable_4yarl_10_quoting_c__Quoter._write = (int (*)(struct __pyx_obj_4yarl_10_quoting_c__Quoter *, struct __pyx_t_4yarl_10_quoting_c_Writer *, Py_UCS4))__pyx_f_4yarl_10_quoting_c_7_Quoter__write;
+ if (PyType_Ready(&__pyx_type_4yarl_10_quoting_c__Quoter) < 0) __PYX_ERR(0, 169, __pyx_L1_error)
+ #if PY_VERSION_HEX < 0x030800B1
+ __pyx_type_4yarl_10_quoting_c__Quoter.tp_print = 0;
+ #endif
+ if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_4yarl_10_quoting_c__Quoter.tp_dictoffset && __pyx_type_4yarl_10_quoting_c__Quoter.tp_getattro == PyObject_GenericGetAttr)) {
+ __pyx_type_4yarl_10_quoting_c__Quoter.tp_getattro = __Pyx_PyObject_GenericGetAttr;
+ }
+ if (__Pyx_SetVtable(__pyx_type_4yarl_10_quoting_c__Quoter.tp_dict, __pyx_vtabptr_4yarl_10_quoting_c__Quoter) < 0) __PYX_ERR(0, 169, __pyx_L1_error)
+ if (PyObject_SetAttr(__pyx_m, __pyx_n_s_Quoter, (PyObject *)&__pyx_type_4yarl_10_quoting_c__Quoter) < 0) __PYX_ERR(0, 169, __pyx_L1_error)
+ if (__Pyx_setup_reduce((PyObject*)&__pyx_type_4yarl_10_quoting_c__Quoter) < 0) __PYX_ERR(0, 169, __pyx_L1_error)
+ __pyx_ptype_4yarl_10_quoting_c__Quoter = &__pyx_type_4yarl_10_quoting_c__Quoter;
+ __pyx_vtabptr_4yarl_10_quoting_c__Unquoter = &__pyx_vtable_4yarl_10_quoting_c__Unquoter;
+ __pyx_vtable_4yarl_10_quoting_c__Unquoter._do_unquote = (PyObject *(*)(struct __pyx_obj_4yarl_10_quoting_c__Unquoter *, PyObject *))__pyx_f_4yarl_10_quoting_c_9_Unquoter__do_unquote;
+ if (PyType_Ready(&__pyx_type_4yarl_10_quoting_c__Unquoter) < 0) __PYX_ERR(0, 271, __pyx_L1_error)
+ #if PY_VERSION_HEX < 0x030800B1
+ __pyx_type_4yarl_10_quoting_c__Unquoter.tp_print = 0;
+ #endif
+ if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_4yarl_10_quoting_c__Unquoter.tp_dictoffset && __pyx_type_4yarl_10_quoting_c__Unquoter.tp_getattro == PyObject_GenericGetAttr)) {
+ __pyx_type_4yarl_10_quoting_c__Unquoter.tp_getattro = __Pyx_PyObject_GenericGetAttr;
+ }
+ if (__Pyx_SetVtable(__pyx_type_4yarl_10_quoting_c__Unquoter.tp_dict, __pyx_vtabptr_4yarl_10_quoting_c__Unquoter) < 0) __PYX_ERR(0, 271, __pyx_L1_error)
+ if (PyObject_SetAttr(__pyx_m, __pyx_n_s_Unquoter, (PyObject *)&__pyx_type_4yarl_10_quoting_c__Unquoter) < 0) __PYX_ERR(0, 271, __pyx_L1_error)
+ if (__Pyx_setup_reduce((PyObject*)&__pyx_type_4yarl_10_quoting_c__Unquoter) < 0) __PYX_ERR(0, 271, __pyx_L1_error)
+ __pyx_ptype_4yarl_10_quoting_c__Unquoter = &__pyx_type_4yarl_10_quoting_c__Unquoter;
+ __Pyx_RefNannyFinishContext();
+ return 0;
+ __pyx_L1_error:;
+ __Pyx_RefNannyFinishContext();
+ return -1;
+}
+
+static int __Pyx_modinit_type_import_code(void) {
+ __Pyx_RefNannyDeclarations
+ PyObject *__pyx_t_1 = NULL;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0);
+ /*--- Type import code ---*/
+ __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type",
+ #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000
+ sizeof(PyTypeObject),
+ #else
+ sizeof(PyHeapTypeObject),
+ #endif
+ __Pyx_ImportType_CheckSize_Warn);
+ if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+ __Pyx_RefNannyFinishContext();
+ return 0;
+ __pyx_L1_error:;
+ __Pyx_XDECREF(__pyx_t_1);
+ __Pyx_RefNannyFinishContext();
+ return -1;
+}
+
+static int __Pyx_modinit_variable_import_code(void) {
+ __Pyx_RefNannyDeclarations
+ __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0);
+ /*--- Variable import code ---*/
+ __Pyx_RefNannyFinishContext();
+ return 0;
+}
+
+static int __Pyx_modinit_function_import_code(void) {
+ __Pyx_RefNannyDeclarations
+ __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0);
+ /*--- Function import code ---*/
+ __Pyx_RefNannyFinishContext();
+ return 0;
+}
+
+
+#ifndef CYTHON_NO_PYINIT_EXPORT
+#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC
+#elif PY_MAJOR_VERSION < 3
+#ifdef __cplusplus
+#define __Pyx_PyMODINIT_FUNC extern "C" void
+#else
+#define __Pyx_PyMODINIT_FUNC void
+#endif
+#else
+#ifdef __cplusplus
+#define __Pyx_PyMODINIT_FUNC extern "C" PyObject *
+#else
+#define __Pyx_PyMODINIT_FUNC PyObject *
+#endif
+#endif
+
+
+#if PY_MAJOR_VERSION < 3
+__Pyx_PyMODINIT_FUNC init_quoting_c(void) CYTHON_SMALL_CODE; /*proto*/
+__Pyx_PyMODINIT_FUNC init_quoting_c(void)
+#else
+__Pyx_PyMODINIT_FUNC PyInit__quoting_c(void) CYTHON_SMALL_CODE; /*proto*/
+__Pyx_PyMODINIT_FUNC PyInit__quoting_c(void)
+#if CYTHON_PEP489_MULTI_PHASE_INIT
+{
+ return PyModuleDef_Init(&__pyx_moduledef);
+}
+static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) {
+ #if PY_VERSION_HEX >= 0x030700A1
+ static PY_INT64_T main_interpreter_id = -1;
+ PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp);
+ if (main_interpreter_id == -1) {
+ main_interpreter_id = current_id;
+ return (unlikely(current_id == -1)) ? -1 : 0;
+ } else if (unlikely(main_interpreter_id != current_id))
+ #else
+ static PyInterpreterState *main_interpreter = NULL;
+ PyInterpreterState *current_interpreter = PyThreadState_Get()->interp;
+ if (!main_interpreter) {
+ main_interpreter = current_interpreter;
+ } else if (unlikely(main_interpreter != current_interpreter))
+ #endif
+ {
+ PyErr_SetString(
+ PyExc_ImportError,
+ "Interpreter change detected - this module can only be loaded into one interpreter per process.");
+ return -1;
+ }
+ return 0;
+}
+static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) {
+ PyObject *value = PyObject_GetAttrString(spec, from_name);
+ int result = 0;
+ if (likely(value)) {
+ if (allow_none || value != Py_None) {
+ result = PyDict_SetItemString(moddict, to_name, value);
+ }
+ Py_DECREF(value);
+ } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
+ PyErr_Clear();
+ } else {
+ result = -1;
+ }
+ return result;
+}
+static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) {
+ PyObject *module = NULL, *moddict, *modname;
+ if (__Pyx_check_single_interpreter())
+ return NULL;
+ if (__pyx_m)
+ return __Pyx_NewRef(__pyx_m);
+ modname = PyObject_GetAttrString(spec, "name");
+ if (unlikely(!modname)) goto bad;
+ module = PyModule_NewObject(modname);
+ Py_DECREF(modname);
+ if (unlikely(!module)) goto bad;
+ moddict = PyModule_GetDict(module);
+ if (unlikely(!moddict)) goto bad;
+ if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad;
+ if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad;
+ if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad;
+ if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad;
+ return module;
+bad:
+ Py_XDECREF(module);
+ return NULL;
+}
+
+
+static CYTHON_SMALL_CODE int __pyx_pymod_exec__quoting_c(PyObject *__pyx_pyinit_module)
+#endif
+#endif
+{
+ PyObject *__pyx_t_1 = NULL;
+ PyObject *__pyx_t_2 = NULL;
+ PyObject *__pyx_t_3 = NULL;
+ long __pyx_t_4;
+ int __pyx_t_5;
+ int __pyx_t_6;
+ uint64_t __pyx_t_7;
+ int __pyx_lineno = 0;
+ const char *__pyx_filename = NULL;
+ int __pyx_clineno = 0;
+ __Pyx_RefNannyDeclarations
+ #if CYTHON_PEP489_MULTI_PHASE_INIT
+ if (__pyx_m) {
+ if (__pyx_m == __pyx_pyinit_module) return 0;
+ PyErr_SetString(PyExc_RuntimeError, "Module '_quoting_c' has already been imported. Re-initialisation is not supported.");
+ return -1;
+ }
+ #elif PY_MAJOR_VERSION >= 3
+ if (__pyx_m) return __Pyx_NewRef(__pyx_m);
+ #endif
+ #if CYTHON_REFNANNY
+__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny");
+if (!__Pyx_RefNanny) {
+ PyErr_Clear();
+ __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny");
+ if (!__Pyx_RefNanny)
+ Py_FatalError("failed to import 'refnanny' module");
+}
+#endif
+ __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__quoting_c(void)", 0);
+ if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+ #ifdef __Pxy_PyFrame_Initialize_Offsets
+ __Pxy_PyFrame_Initialize_Offsets();
+ #endif
+ __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error)
+ __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error)
+ __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error)
+ #ifdef __Pyx_CyFunction_USED
+ if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+ #endif
+ #ifdef __Pyx_FusedFunction_USED
+ if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+ #endif
+ #ifdef __Pyx_Coroutine_USED
+ if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+ #endif
+ #ifdef __Pyx_Generator_USED
+ if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+ #endif
+ #ifdef __Pyx_AsyncGen_USED
+ if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+ #endif
+ #ifdef __Pyx_StopAsyncIteration_USED
+ if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+ #endif
+ /*--- Library function declarations ---*/
+ /*--- Threads initialization code ---*/
+ #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS
+ #ifdef WITH_THREAD /* Python build with threading support? */
+ PyEval_InitThreads();
+ #endif
+ #endif
+ /*--- Module creation code ---*/
+ #if CYTHON_PEP489_MULTI_PHASE_INIT
+ __pyx_m = __pyx_pyinit_module;
+ Py_INCREF(__pyx_m);
+ #else
+ #if PY_MAJOR_VERSION < 3
+ __pyx_m = Py_InitModule4("_quoting_c", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
+ #else
+ __pyx_m = PyModule_Create(&__pyx_moduledef);
+ #endif
+ if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error)
+ #endif
+ __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error)
+ Py_INCREF(__pyx_d);
+ __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error)
+ Py_INCREF(__pyx_b);
+ __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error)
+ Py_INCREF(__pyx_cython_runtime);
+ if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error);
+ /*--- Initialize various global constants etc. ---*/
+ if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+ #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
+ if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+ #endif
+ if (__pyx_module_is_main_yarl___quoting_c) {
+ if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+ }
+ #if PY_MAJOR_VERSION >= 3
+ {
+ PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error)
+ if (!PyDict_GetItemString(modules, "yarl._quoting_c")) {
+ if (unlikely(PyDict_SetItemString(modules, "yarl._quoting_c", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error)
+ }
+ }
+ #endif
+ /*--- Builtin init code ---*/
+ if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+ /*--- Constants init code ---*/
+ if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+ /*--- Global type/function init code ---*/
+ (void)__Pyx_modinit_global_init_code();
+ (void)__Pyx_modinit_variable_export_code();
+ (void)__Pyx_modinit_function_export_code();
+ if (unlikely(__Pyx_modinit_type_init_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error)
+ if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error)
+ (void)__Pyx_modinit_variable_import_code();
+ (void)__Pyx_modinit_function_import_code();
+ /*--- Execution code ---*/
+ #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
+ if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+ #endif
+
+ /* "yarl/_quoting_c.pyx":10
+ * from cpython.unicode cimport PyUnicode_DecodeASCII, PyUnicode_DecodeUTF8Stateful
+ *
+ * from string import ascii_letters, digits # <<<<<<<<<<<<<<
+ *
+ * cdef str GEN_DELIMS = ":/?#[]@"
+ */
+ __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 10, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __Pyx_INCREF(__pyx_n_s_ascii_letters);
+ __Pyx_GIVEREF(__pyx_n_s_ascii_letters);
+ PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_ascii_letters);
+ __Pyx_INCREF(__pyx_n_s_digits);
+ __Pyx_GIVEREF(__pyx_n_s_digits);
+ PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_digits);
+ __pyx_t_2 = __Pyx_Import(__pyx_n_s_string, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 10, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_2);
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+ __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_ascii_letters); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 10, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ if (PyDict_SetItem(__pyx_d, __pyx_n_s_ascii_letters, __pyx_t_1) < 0) __PYX_ERR(0, 10, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+ __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_digits); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 10, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ if (PyDict_SetItem(__pyx_d, __pyx_n_s_digits, __pyx_t_1) < 0) __PYX_ERR(0, 10, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+ /* "yarl/_quoting_c.pyx":12
+ * from string import ascii_letters, digits
+ *
+ * cdef str GEN_DELIMS = ":/?#[]@" # <<<<<<<<<<<<<<
+ * cdef str SUB_DELIMS_WITHOUT_QS = "!$'()*,"
+ * cdef str SUB_DELIMS = SUB_DELIMS_WITHOUT_QS + '+?=;'
+ */
+ __Pyx_INCREF(__pyx_kp_u__9);
+ __Pyx_XGOTREF(__pyx_v_4yarl_10_quoting_c_GEN_DELIMS);
+ __Pyx_DECREF_SET(__pyx_v_4yarl_10_quoting_c_GEN_DELIMS, __pyx_kp_u__9);
+ __Pyx_GIVEREF(__pyx_kp_u__9);
+
+ /* "yarl/_quoting_c.pyx":13
+ *
+ * cdef str GEN_DELIMS = ":/?#[]@"
+ * cdef str SUB_DELIMS_WITHOUT_QS = "!$'()*," # <<<<<<<<<<<<<<
+ * cdef str SUB_DELIMS = SUB_DELIMS_WITHOUT_QS + '+?=;'
+ * cdef str RESERVED = GEN_DELIMS + SUB_DELIMS
+ */
+ __Pyx_INCREF(__pyx_kp_u__10);
+ __Pyx_XGOTREF(__pyx_v_4yarl_10_quoting_c_SUB_DELIMS_WITHOUT_QS);
+ __Pyx_DECREF_SET(__pyx_v_4yarl_10_quoting_c_SUB_DELIMS_WITHOUT_QS, __pyx_kp_u__10);
+ __Pyx_GIVEREF(__pyx_kp_u__10);
+
+ /* "yarl/_quoting_c.pyx":14
+ * cdef str GEN_DELIMS = ":/?#[]@"
+ * cdef str SUB_DELIMS_WITHOUT_QS = "!$'()*,"
+ * cdef str SUB_DELIMS = SUB_DELIMS_WITHOUT_QS + '+?=;' # <<<<<<<<<<<<<<
+ * cdef str RESERVED = GEN_DELIMS + SUB_DELIMS
+ * cdef str UNRESERVED = ascii_letters + digits + '-._~'
+ */
+ __pyx_t_2 = __Pyx_PyUnicode_ConcatSafe(__pyx_v_4yarl_10_quoting_c_SUB_DELIMS_WITHOUT_QS, __pyx_kp_u__11); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 14, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_2);
+ __Pyx_XGOTREF(__pyx_v_4yarl_10_quoting_c_SUB_DELIMS);
+ __Pyx_DECREF_SET(__pyx_v_4yarl_10_quoting_c_SUB_DELIMS, ((PyObject*)__pyx_t_2));
+ __Pyx_GIVEREF(__pyx_t_2);
+ __pyx_t_2 = 0;
+
+ /* "yarl/_quoting_c.pyx":15
+ * cdef str SUB_DELIMS_WITHOUT_QS = "!$'()*,"
+ * cdef str SUB_DELIMS = SUB_DELIMS_WITHOUT_QS + '+?=;'
+ * cdef str RESERVED = GEN_DELIMS + SUB_DELIMS # <<<<<<<<<<<<<<
+ * cdef str UNRESERVED = ascii_letters + digits + '-._~'
+ * cdef str ALLOWED = UNRESERVED + SUB_DELIMS_WITHOUT_QS
+ */
+ __pyx_t_2 = __Pyx_PyUnicode_ConcatSafe(__pyx_v_4yarl_10_quoting_c_GEN_DELIMS, __pyx_v_4yarl_10_quoting_c_SUB_DELIMS); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 15, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_2);
+ __Pyx_XGOTREF(__pyx_v_4yarl_10_quoting_c_RESERVED);
+ __Pyx_DECREF_SET(__pyx_v_4yarl_10_quoting_c_RESERVED, ((PyObject*)__pyx_t_2));
+ __Pyx_GIVEREF(__pyx_t_2);
+ __pyx_t_2 = 0;
+
+ /* "yarl/_quoting_c.pyx":16
+ * cdef str SUB_DELIMS = SUB_DELIMS_WITHOUT_QS + '+?=;'
+ * cdef str RESERVED = GEN_DELIMS + SUB_DELIMS
+ * cdef str UNRESERVED = ascii_letters + digits + '-._~' # <<<<<<<<<<<<<<
+ * cdef str ALLOWED = UNRESERVED + SUB_DELIMS_WITHOUT_QS
+ * cdef str QS = '+&=;'
+ */
+ __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_ascii_letters); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 16, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_2);
+ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_digits); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __pyx_t_3 = PyNumber_Add(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 16, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+ __pyx_t_1 = PyNumber_Add(__pyx_t_3, __pyx_kp_u__12); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+ if (!(likely(PyUnicode_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_1)->tp_name), 0))) __PYX_ERR(0, 16, __pyx_L1_error)
+ __Pyx_XGOTREF(__pyx_v_4yarl_10_quoting_c_UNRESERVED);
+ __Pyx_DECREF_SET(__pyx_v_4yarl_10_quoting_c_UNRESERVED, ((PyObject*)__pyx_t_1));
+ __Pyx_GIVEREF(__pyx_t_1);
+ __pyx_t_1 = 0;
+
+ /* "yarl/_quoting_c.pyx":17
+ * cdef str RESERVED = GEN_DELIMS + SUB_DELIMS
+ * cdef str UNRESERVED = ascii_letters + digits + '-._~'
+ * cdef str ALLOWED = UNRESERVED + SUB_DELIMS_WITHOUT_QS # <<<<<<<<<<<<<<
+ * cdef str QS = '+&=;'
+ *
+ */
+ __pyx_t_1 = __Pyx_PyUnicode_ConcatSafe(__pyx_v_4yarl_10_quoting_c_UNRESERVED, __pyx_v_4yarl_10_quoting_c_SUB_DELIMS_WITHOUT_QS); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 17, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __Pyx_XGOTREF(__pyx_v_4yarl_10_quoting_c_ALLOWED);
+ __Pyx_DECREF_SET(__pyx_v_4yarl_10_quoting_c_ALLOWED, ((PyObject*)__pyx_t_1));
+ __Pyx_GIVEREF(__pyx_t_1);
+ __pyx_t_1 = 0;
+
+ /* "yarl/_quoting_c.pyx":18
+ * cdef str UNRESERVED = ascii_letters + digits + '-._~'
+ * cdef str ALLOWED = UNRESERVED + SUB_DELIMS_WITHOUT_QS
+ * cdef str QS = '+&=;' # <<<<<<<<<<<<<<
+ *
+ * DEF BUF_SIZE = 8 * 1024 # 8KiB
+ */
+ __Pyx_INCREF(__pyx_kp_u__13);
+ __Pyx_XGOTREF(__pyx_v_4yarl_10_quoting_c_QS);
+ __Pyx_DECREF_SET(__pyx_v_4yarl_10_quoting_c_QS, __pyx_kp_u__13);
+ __Pyx_GIVEREF(__pyx_kp_u__13);
+
+ /* "yarl/_quoting_c.pyx":67
+ *
+ *
+ * memset(ALLOWED_TABLE, 0, sizeof(ALLOWED_TABLE)) # <<<<<<<<<<<<<<
+ * memset(ALLOWED_NOTQS_TABLE, 0, sizeof(ALLOWED_NOTQS_TABLE))
+ *
+ */
+ (void)(memset(__pyx_v_4yarl_10_quoting_c_ALLOWED_TABLE, 0, (sizeof(__pyx_v_4yarl_10_quoting_c_ALLOWED_TABLE))));
+
+ /* "yarl/_quoting_c.pyx":68
+ *
+ * memset(ALLOWED_TABLE, 0, sizeof(ALLOWED_TABLE))
+ * memset(ALLOWED_NOTQS_TABLE, 0, sizeof(ALLOWED_NOTQS_TABLE)) # <<<<<<<<<<<<<<
+ *
+ * for i in range(128):
+ */
+ (void)(memset(__pyx_v_4yarl_10_quoting_c_ALLOWED_NOTQS_TABLE, 0, (sizeof(__pyx_v_4yarl_10_quoting_c_ALLOWED_NOTQS_TABLE))));
+
+ /* "yarl/_quoting_c.pyx":70
+ * memset(ALLOWED_NOTQS_TABLE, 0, sizeof(ALLOWED_NOTQS_TABLE))
+ *
+ * for i in range(128): # <<<<<<<<<<<<<<
+ * if chr(i) in ALLOWED:
+ * set_bit(ALLOWED_TABLE, i)
+ */
+ for (__pyx_t_4 = 0; __pyx_t_4 < 0x80; __pyx_t_4+=1) {
+ __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 70, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ if (PyDict_SetItem(__pyx_d, __pyx_n_s_i, __pyx_t_1) < 0) __PYX_ERR(0, 70, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+ /* "yarl/_quoting_c.pyx":71
+ *
+ * for i in range(128):
+ * if chr(i) in ALLOWED: # <<<<<<<<<<<<<<
+ * set_bit(ALLOWED_TABLE, i)
+ * set_bit(ALLOWED_NOTQS_TABLE, i)
+ */
+ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_i); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 71, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_chr, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 71, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+ if (unlikely(__pyx_v_4yarl_10_quoting_c_ALLOWED == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+ __PYX_ERR(0, 71, __pyx_L1_error)
+ }
+ __pyx_t_5 = (__Pyx_PyUnicode_ContainsTF(__pyx_t_3, __pyx_v_4yarl_10_quoting_c_ALLOWED, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 71, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+ __pyx_t_6 = (__pyx_t_5 != 0);
+ if (__pyx_t_6) {
+
+ /* "yarl/_quoting_c.pyx":72
+ * for i in range(128):
+ * if chr(i) in ALLOWED:
+ * set_bit(ALLOWED_TABLE, i) # <<<<<<<<<<<<<<
+ * set_bit(ALLOWED_NOTQS_TABLE, i)
+ * if chr(i) in QS:
+ */
+ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_i); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 72, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __pyx_t_7 = __Pyx_PyInt_As_uint64_t(__pyx_t_3); if (unlikely((__pyx_t_7 == ((uint64_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 72, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+ __pyx_f_4yarl_10_quoting_c_set_bit(__pyx_v_4yarl_10_quoting_c_ALLOWED_TABLE, __pyx_t_7);
+
+ /* "yarl/_quoting_c.pyx":73
+ * if chr(i) in ALLOWED:
+ * set_bit(ALLOWED_TABLE, i)
+ * set_bit(ALLOWED_NOTQS_TABLE, i) # <<<<<<<<<<<<<<
+ * if chr(i) in QS:
+ * set_bit(ALLOWED_NOTQS_TABLE, i)
+ */
+ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_i); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 73, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __pyx_t_7 = __Pyx_PyInt_As_uint64_t(__pyx_t_3); if (unlikely((__pyx_t_7 == ((uint64_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 73, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+ __pyx_f_4yarl_10_quoting_c_set_bit(__pyx_v_4yarl_10_quoting_c_ALLOWED_NOTQS_TABLE, __pyx_t_7);
+
+ /* "yarl/_quoting_c.pyx":71
+ *
+ * for i in range(128):
+ * if chr(i) in ALLOWED: # <<<<<<<<<<<<<<
+ * set_bit(ALLOWED_TABLE, i)
+ * set_bit(ALLOWED_NOTQS_TABLE, i)
+ */
+ }
+
+ /* "yarl/_quoting_c.pyx":74
+ * set_bit(ALLOWED_TABLE, i)
+ * set_bit(ALLOWED_NOTQS_TABLE, i)
+ * if chr(i) in QS: # <<<<<<<<<<<<<<
+ * set_bit(ALLOWED_NOTQS_TABLE, i)
+ *
+ */
+ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_i); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 74, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_3);
+ __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_chr, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 74, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+ if (unlikely(__pyx_v_4yarl_10_quoting_c_QS == Py_None)) {
+ PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+ __PYX_ERR(0, 74, __pyx_L1_error)
+ }
+ __pyx_t_6 = (__Pyx_PyUnicode_ContainsTF(__pyx_t_1, __pyx_v_4yarl_10_quoting_c_QS, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 74, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+ __pyx_t_5 = (__pyx_t_6 != 0);
+ if (__pyx_t_5) {
+
+ /* "yarl/_quoting_c.pyx":75
+ * set_bit(ALLOWED_NOTQS_TABLE, i)
+ * if chr(i) in QS:
+ * set_bit(ALLOWED_NOTQS_TABLE, i) # <<<<<<<<<<<<<<
+ *
+ * # ----------------- writer ---------------------------
+ */
+ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_i); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 75, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ __pyx_t_7 = __Pyx_PyInt_As_uint64_t(__pyx_t_1); if (unlikely((__pyx_t_7 == ((uint64_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 75, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+ __pyx_f_4yarl_10_quoting_c_set_bit(__pyx_v_4yarl_10_quoting_c_ALLOWED_NOTQS_TABLE, __pyx_t_7);
+
+ /* "yarl/_quoting_c.pyx":74
+ * set_bit(ALLOWED_TABLE, i)
+ * set_bit(ALLOWED_NOTQS_TABLE, i)
+ * if chr(i) in QS: # <<<<<<<<<<<<<<
+ * set_bit(ALLOWED_NOTQS_TABLE, i)
+ *
+ */
+ }
+ }
+
+ /* "(tree fragment)":1
+ * def __pyx_unpickle__Quoter(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<<
+ * cdef object __pyx_PickleError
+ * cdef object __pyx_result
+ */
+ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_4yarl_10_quoting_c_1__pyx_unpickle__Quoter, NULL, __pyx_n_s_yarl__quoting_c); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle__Quoter, __pyx_t_1) < 0) __PYX_ERR(1, 1, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+ /* "(tree fragment)":11
+ * __pyx_unpickle__Quoter__set_state(<_Quoter> __pyx_result, __pyx_state)
+ * return __pyx_result
+ * cdef __pyx_unpickle__Quoter__set_state(_Quoter __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<<
+ * __pyx_result._protected_table = __pyx_state[0]; __pyx_result._qs = __pyx_state[1]; __pyx_result._requote = __pyx_state[2]; __pyx_result._safe_table = __pyx_state[3]
+ * if len(__pyx_state) > 4 and hasattr(__pyx_result, '__dict__'):
+ */
+ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_4yarl_10_quoting_c_3__pyx_unpickle__Unquoter, NULL, __pyx_n_s_yarl__quoting_c); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle__Unquoter, __pyx_t_1) < 0) __PYX_ERR(1, 1, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+ /* "yarl/_quoting_c.pyx":1
+ * # cython: language_level=3 # <<<<<<<<<<<<<<
+ *
+ * from libc.stdint cimport uint8_t, uint64_t
+ */
+ __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error)
+ __Pyx_GOTREF(__pyx_t_1);
+ if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+ /* "carray.from_py":77
+ *
+ * @cname("__Pyx_carray_from_py_uint8_t")
+ * cdef int __Pyx_carray_from_py_uint8_t(object o, base_type *v, Py_ssize_t length) except -1: # <<<<<<<<<<<<<<
+ * cdef Py_ssize_t i = length
+ * try:
+ */
+
+ /*--- Wrapped vars code ---*/
+
+ goto __pyx_L0;
+ __pyx_L1_error:;
+ __Pyx_XDECREF(__pyx_t_1);
+ __Pyx_XDECREF(__pyx_t_2);
+ __Pyx_XDECREF(__pyx_t_3);
+ if (__pyx_m) {
+ if (__pyx_d) {
+ __Pyx_AddTraceback("init yarl._quoting_c", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ }
+ Py_CLEAR(__pyx_m);
+ } else if (!PyErr_Occurred()) {
+ PyErr_SetString(PyExc_ImportError, "init yarl._quoting_c");
+ }
+ __pyx_L0:;
+ __Pyx_RefNannyFinishContext();
+ #if CYTHON_PEP489_MULTI_PHASE_INIT
+ return (__pyx_m != NULL) ? 0 : -1;
+ #elif PY_MAJOR_VERSION >= 3
+ return __pyx_m;
+ #else
+ return;
+ #endif
+}
+
+/* --- Runtime support code --- */
+/* Refnanny */
+#if CYTHON_REFNANNY
+static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
+ PyObject *m = NULL, *p = NULL;
+ void *r = NULL;
+ m = PyImport_ImportModule(modname);
+ if (!m) goto end;
+ p = PyObject_GetAttrString(m, "RefNannyAPI");
+ if (!p) goto end;
+ r = PyLong_AsVoidPtr(p);
+end:
+ Py_XDECREF(p);
+ Py_XDECREF(m);
+ return (__Pyx_RefNannyAPIStruct *)r;
+}
+#endif
+
+/* PyObjectGetAttrStr */
+#if CYTHON_USE_TYPE_SLOTS
+static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) {
+ PyTypeObject* tp = Py_TYPE(obj);
+ if (likely(tp->tp_getattro))
+ return tp->tp_getattro(obj, attr_name);
+#if PY_MAJOR_VERSION < 3
+ if (likely(tp->tp_getattr))
+ return tp->tp_getattr(obj, PyString_AS_STRING(attr_name));
+#endif
+ return PyObject_GetAttr(obj, attr_name);
+}
+#endif
+
+/* GetBuiltinName */
+static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
+ PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name);
+ if (unlikely(!result)) {
+ PyErr_Format(PyExc_NameError,
+#if PY_MAJOR_VERSION >= 3
+ "name '%U' is not defined", name);
+#else
+ "name '%.200s' is not defined", PyString_AS_STRING(name));
+#endif
+ }
+ return result;
+}
+
+/* PyErrFetchRestore */
+#if CYTHON_FAST_THREAD_STATE
+static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) {
+ PyObject *tmp_type, *tmp_value, *tmp_tb;
+ tmp_type = tstate->curexc_type;
+ tmp_value = tstate->curexc_value;
+ tmp_tb = tstate->curexc_traceback;
+ tstate->curexc_type = type;
+ tstate->curexc_value = value;
+ tstate->curexc_traceback = tb;
+ Py_XDECREF(tmp_type);
+ Py_XDECREF(tmp_value);
+ Py_XDECREF(tmp_tb);
+}
+static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
+ *type = tstate->curexc_type;
+ *value = tstate->curexc_value;
+ *tb = tstate->curexc_traceback;
+ tstate->curexc_type = 0;
+ tstate->curexc_value = 0;
+ tstate->curexc_traceback = 0;
+}
+#endif
+
+/* WriteUnraisableException */
+static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
+ CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename,
+ int full_traceback, CYTHON_UNUSED int nogil) {
+ PyObject *old_exc, *old_val, *old_tb;
+ PyObject *ctx;
+ __Pyx_PyThreadState_declare
+#ifdef WITH_THREAD
+ PyGILState_STATE state;
+ if (nogil)
+ state = PyGILState_Ensure();
+#ifdef _MSC_VER
+ else state = (PyGILState_STATE)-1;
+#endif
+#endif
+ __Pyx_PyThreadState_assign
+ __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);
+ if (full_traceback) {
+ Py_XINCREF(old_exc);
+ Py_XINCREF(old_val);
+ Py_XINCREF(old_tb);
+ __Pyx_ErrRestore(old_exc, old_val, old_tb);
+ PyErr_PrintEx(1);
+ }
+ #if PY_MAJOR_VERSION < 3
+ ctx = PyString_FromString(name);
+ #else
+ ctx = PyUnicode_FromString(name);
+ #endif
+ __Pyx_ErrRestore(old_exc, old_val, old_tb);
+ if (!ctx) {
+ PyErr_WriteUnraisable(Py_None);
+ } else {
+ PyErr_WriteUnraisable(ctx);
+ Py_DECREF(ctx);
+ }
+#ifdef WITH_THREAD
+ if (nogil)
+ PyGILState_Release(state);
+#endif
+}
+
+/* RaiseDoubleKeywords */
+static void __Pyx_RaiseDoubleKeywordsError(
+ const char* func_name,
+ PyObject* kw_name)
+{
+ PyErr_Format(PyExc_TypeError,
+ #if PY_MAJOR_VERSION >= 3
+ "%s() got multiple values for keyword argument '%U'", func_name, kw_name);
+ #else
+ "%s() got multiple values for keyword argument '%s'", func_name,
+ PyString_AsString(kw_name));
+ #endif
+}
+
+/* ParseKeywords */
+static int __Pyx_ParseOptionalKeywords(
+ PyObject *kwds,
+ PyObject **argnames[],
+ PyObject *kwds2,
+ PyObject *values[],
+ Py_ssize_t num_pos_args,
+ const char* function_name)
+{
+ PyObject *key = 0, *value = 0;
+ Py_ssize_t pos = 0;
+ PyObject*** name;
+ PyObject*** first_kw_arg = argnames + num_pos_args;
+ while (PyDict_Next(kwds, &pos, &key, &value)) {
+ name = first_kw_arg;
+ while (*name && (**name != key)) name++;
+ if (*name) {
+ values[name-argnames] = value;
+ continue;
+ }
+ name = first_kw_arg;
+ #if PY_MAJOR_VERSION < 3
+ if (likely(PyString_Check(key))) {
+ while (*name) {
+ if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key))
+ && _PyString_Eq(**name, key)) {
+ values[name-argnames] = value;
+ break;
+ }
+ name++;
+ }
+ if (*name) continue;
+ else {
+ PyObject*** argname = argnames;
+ while (argname != first_kw_arg) {
+ if ((**argname == key) || (
+ (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key))
+ && _PyString_Eq(**argname, key))) {
+ goto arg_passed_twice;
+ }
+ argname++;
+ }
+ }
+ } else
+ #endif
+ if (likely(PyUnicode_Check(key))) {
+ while (*name) {
+ int cmp = (**name == key) ? 0 :
+ #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
+ (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 :
+ #endif
+ PyUnicode_Compare(**name, key);
+ if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
+ if (cmp == 0) {
+ values[name-argnames] = value;
+ break;
+ }
+ name++;
+ }
+ if (*name) continue;
+ else {
+ PyObject*** argname = argnames;
+ while (argname != first_kw_arg) {
+ int cmp = (**argname == key) ? 0 :
+ #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
+ (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 :
+ #endif
+ PyUnicode_Compare(**argname, key);
+ if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
+ if (cmp == 0) goto arg_passed_twice;
+ argname++;
+ }
+ }
+ } else
+ goto invalid_keyword_type;
+ if (kwds2) {
+ if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
+ } else {
+ goto invalid_keyword;
+ }
+ }
+ return 0;
+arg_passed_twice:
+ __Pyx_RaiseDoubleKeywordsError(function_name, key);
+ goto bad;
+invalid_keyword_type:
+ PyErr_Format(PyExc_TypeError,
+ "%.200s() keywords must be strings", function_name);
+ goto bad;
+invalid_keyword:
+ PyErr_Format(PyExc_TypeError,
+ #if PY_MAJOR_VERSION < 3
+ "%.200s() got an unexpected keyword argument '%.200s'",
+ function_name, PyString_AsString(key));
+ #else
+ "%s() got an unexpected keyword argument '%U'",
+ function_name, key);
+ #endif
+bad:
+ return -1;
+}
+
+/* RaiseArgTupleInvalid */
+static void __Pyx_RaiseArgtupleInvalid(
+ const char* func_name,
+ int exact,
+ Py_ssize_t num_min,
+ Py_ssize_t num_max,
+ Py_ssize_t num_found)
+{
+ Py_ssize_t num_expected;
+ const char *more_or_less;
+ if (num_found < num_min) {
+ num_expected = num_min;
+ more_or_less = "at least";
+ } else {
+ num_expected = num_max;
+ more_or_less = "at most";
+ }
+ if (exact) {
+ more_or_less = "exactly";
+ }
+ PyErr_Format(PyExc_TypeError,
+ "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)",
+ func_name, more_or_less, num_expected,
+ (num_expected == 1) ? "" : "s", num_found);
+}
+
+/* ArgTypeTest */
+static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact)
+{
+ if (unlikely(!type)) {
+ PyErr_SetString(PyExc_SystemError, "Missing type object");
+ return 0;
+ }
+ else if (exact) {
+ #if PY_MAJOR_VERSION == 2
+ if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1;
+ #endif
+ }
+ else {
+ if (likely(__Pyx_TypeCheck(obj, type))) return 1;
+ }
+ PyErr_Format(PyExc_TypeError,
+ "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)",
+ name, type->tp_name, Py_TYPE(obj)->tp_name);
+ return 0;
+}
+
+/* unicode_iter */
+static CYTHON_INLINE int __Pyx_init_unicode_iteration(
+ PyObject* ustring, Py_ssize_t *length, void** data, int *kind) {
+#if CYTHON_PEP393_ENABLED
+ if (unlikely(__Pyx_PyUnicode_READY(ustring) < 0)) return -1;
+ *kind = PyUnicode_KIND(ustring);
+ *length = PyUnicode_GET_LENGTH(ustring);
+ *data = PyUnicode_DATA(ustring);
+#else
+ *kind = 0;
+ *length = PyUnicode_GET_SIZE(ustring);
+ *data = (void*)PyUnicode_AS_UNICODE(ustring);
+#endif
+ return 0;
+}
+
+/* PyObjectCall */
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) {
+ PyObject *result;
+ ternaryfunc call = func->ob_type->tp_call;
+ if (unlikely(!call))
+ return PyObject_Call(func, arg, kw);
+ if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
+ return NULL;
+ result = (*call)(func, arg, kw);
+ Py_LeaveRecursiveCall();
+ if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
+ PyErr_SetString(
+ PyExc_SystemError,
+ "NULL result without error in PyObject_Call");
+ }
+ return result;
+}
+#endif
+
+/* RaiseException */
+#if PY_MAJOR_VERSION < 3
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
+ CYTHON_UNUSED PyObject *cause) {
+ __Pyx_PyThreadState_declare
+ Py_XINCREF(type);
+ if (!value || value == Py_None)
+ value = NULL;
+ else
+ Py_INCREF(value);
+ if (!tb || tb == Py_None)
+ tb = NULL;
+ else {
+ Py_INCREF(tb);
+ if (!PyTraceBack_Check(tb)) {
+ PyErr_SetString(PyExc_TypeError,
+ "raise: arg 3 must be a traceback or None");
+ goto raise_error;
+ }
+ }
+ if (PyType_Check(type)) {
+#if CYTHON_COMPILING_IN_PYPY
+ if (!value) {
+ Py_INCREF(Py_None);
+ value = Py_None;
+ }
+#endif
+ PyErr_NormalizeException(&type, &value, &tb);
+ } else {
+ if (value) {
+ PyErr_SetString(PyExc_TypeError,
+ "instance exception may not have a separate value");
+ goto raise_error;
+ }
+ value = type;
+ type = (PyObject*) Py_TYPE(type);
+ Py_INCREF(type);
+ if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {
+ PyErr_SetString(PyExc_TypeError,
+ "raise: exception class must be a subclass of BaseException");
+ goto raise_error;
+ }
+ }
+ __Pyx_PyThreadState_assign
+ __Pyx_ErrRestore(type, value, tb);
+ return;
+raise_error:
+ Py_XDECREF(value);
+ Py_XDECREF(type);
+ Py_XDECREF(tb);
+ return;
+}
+#else
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
+ PyObject* owned_instance = NULL;
+ if (tb == Py_None) {
+ tb = 0;
+ } else if (tb && !PyTraceBack_Check(tb)) {
+ PyErr_SetString(PyExc_TypeError,
+ "raise: arg 3 must be a traceback or None");
+ goto bad;
+ }
+ if (value == Py_None)
+ value = 0;
+ if (PyExceptionInstance_Check(type)) {
+ if (value) {
+ PyErr_SetString(PyExc_TypeError,
+ "instance exception may not have a separate value");
+ goto bad;
+ }
+ value = type;
+ type = (PyObject*) Py_TYPE(value);
+ } else if (PyExceptionClass_Check(type)) {
+ PyObject *instance_class = NULL;
+ if (value && PyExceptionInstance_Check(value)) {
+ instance_class = (PyObject*) Py_TYPE(value);
+ if (instance_class != type) {
+ int is_subclass = PyObject_IsSubclass(instance_class, type);
+ if (!is_subclass) {
+ instance_class = NULL;
+ } else if (unlikely(is_subclass == -1)) {
+ goto bad;
+ } else {
+ type = instance_class;
+ }
+ }
+ }
+ if (!instance_class) {
+ PyObject *args;
+ if (!value)
+ args = PyTuple_New(0);
+ else if (PyTuple_Check(value)) {
+ Py_INCREF(value);
+ args = value;
+ } else
+ args = PyTuple_Pack(1, value);
+ if (!args)
+ goto bad;
+ owned_instance = PyObject_Call(type, args, NULL);
+ Py_DECREF(args);
+ if (!owned_instance)
+ goto bad;
+ value = owned_instance;
+ if (!PyExceptionInstance_Check(value)) {
+ PyErr_Format(PyExc_TypeError,
+ "calling %R should have returned an instance of "
+ "BaseException, not %R",
+ type, Py_TYPE(value));
+ goto bad;
+ }
+ }
+ } else {
+ PyErr_SetString(PyExc_TypeError,
+ "raise: exception class must be a subclass of BaseException");
+ goto bad;
+ }
+ if (cause) {
+ PyObject *fixed_cause;
+ if (cause == Py_None) {
+ fixed_cause = NULL;
+ } else if (PyExceptionClass_Check(cause)) {
+ fixed_cause = PyObject_CallObject(cause, NULL);
+ if (fixed_cause == NULL)
+ goto bad;
+ } else if (PyExceptionInstance_Check(cause)) {
+ fixed_cause = cause;
+ Py_INCREF(fixed_cause);
+ } else {
+ PyErr_SetString(PyExc_TypeError,
+ "exception causes must derive from "
+ "BaseException");
+ goto bad;
+ }
+ PyException_SetCause(value, fixed_cause);
+ }
+ PyErr_SetObject(type, value);
+ if (tb) {
+#if CYTHON_COMPILING_IN_PYPY
+ PyObject *tmp_type, *tmp_value, *tmp_tb;
+ PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb);
+ Py_INCREF(tb);
+ PyErr_Restore(tmp_type, tmp_value, tb);
+ Py_XDECREF(tmp_tb);
+#else
+ PyThreadState *tstate = __Pyx_PyThreadState_Current;
+ PyObject* tmp_tb = tstate->curexc_traceback;
+ if (tb != tmp_tb) {
+ Py_INCREF(tb);
+ tstate->curexc_traceback = tb;
+ Py_XDECREF(tmp_tb);
+ }
+#endif
+ }
+bad:
+ Py_XDECREF(owned_instance);
+ return;
+}
+#endif
+
+/* PyCFunctionFastCall */
+#if CYTHON_FAST_PYCCALL
+static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) {
+ PyCFunctionObject *func = (PyCFunctionObject*)func_obj;
+ PyCFunction meth = PyCFunction_GET_FUNCTION(func);
+ PyObject *self = PyCFunction_GET_SELF(func);
+ int flags = PyCFunction_GET_FLAGS(func);
+ assert(PyCFunction_Check(func));
+ assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS)));
+ assert(nargs >= 0);
+ assert(nargs == 0 || args != NULL);
+ /* _PyCFunction_FastCallDict() must not be called with an exception set,
+ because it may clear it (directly or indirectly) and so the
+ caller loses its exception */
+ assert(!PyErr_Occurred());
+ if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) {
+ return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL);
+ } else {
+ return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs);
+ }
+}
+#endif
+
+/* PyFunctionFastCall */
+#if CYTHON_FAST_PYCALL
+static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na,
+ PyObject *globals) {
+ PyFrameObject *f;
+ PyThreadState *tstate = __Pyx_PyThreadState_Current;
+ PyObject **fastlocals;
+ Py_ssize_t i;
+ PyObject *result;
+ assert(globals != NULL);
+ /* XXX Perhaps we should create a specialized
+ PyFrame_New() that doesn't take locals, but does
+ take builtins without sanity checking them.
+ */
+ assert(tstate != NULL);
+ f = PyFrame_New(tstate, co, globals, NULL);
+ if (f == NULL) {
+ return NULL;
+ }
+ fastlocals = __Pyx_PyFrame_GetLocalsplus(f);
+ for (i = 0; i < na; i++) {
+ Py_INCREF(*args);
+ fastlocals[i] = *args++;
+ }
+ result = PyEval_EvalFrameEx(f,0);
+ ++tstate->recursion_depth;
+ Py_DECREF(f);
+ --tstate->recursion_depth;
+ return result;
+}
+#if 1 || PY_VERSION_HEX < 0x030600B1
+static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) {
+ PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
+ PyObject *globals = PyFunction_GET_GLOBALS(func);
+ PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
+ PyObject *closure;
+#if PY_MAJOR_VERSION >= 3
+ PyObject *kwdefs;
+#endif
+ PyObject *kwtuple, **k;
+ PyObject **d;
+ Py_ssize_t nd;
+ Py_ssize_t nk;
+ PyObject *result;
+ assert(kwargs == NULL || PyDict_Check(kwargs));
+ nk = kwargs ? PyDict_Size(kwargs) : 0;
+ if (Py_EnterRecursiveCall((char*)" while calling a Python object")) {
+ return NULL;
+ }
+ if (
+#if PY_MAJOR_VERSION >= 3
+ co->co_kwonlyargcount == 0 &&
+#endif
+ likely(kwargs == NULL || nk == 0) &&
+ co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
+ if (argdefs == NULL && co->co_argcount == nargs) {
+ result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals);
+ goto done;
+ }
+ else if (nargs == 0 && argdefs != NULL
+ && co->co_argcount == Py_SIZE(argdefs)) {
+ /* function called with no arguments, but all parameters have
+ a default value: use default values as arguments .*/
+ args = &PyTuple_GET_ITEM(argdefs, 0);
+ result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals);
+ goto done;
+ }
+ }
+ if (kwargs != NULL) {
+ Py_ssize_t pos, i;
+ kwtuple = PyTuple_New(2 * nk);
+ if (kwtuple == NULL) {
+ result = NULL;
+ goto done;
+ }
+ k = &PyTuple_GET_ITEM(kwtuple, 0);
+ pos = i = 0;
+ while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) {
+ Py_INCREF(k[i]);
+ Py_INCREF(k[i+1]);
+ i += 2;
+ }
+ nk = i / 2;
+ }
+ else {
+ kwtuple = NULL;
+ k = NULL;
+ }
+ closure = PyFunction_GET_CLOSURE(func);
+#if PY_MAJOR_VERSION >= 3
+ kwdefs = PyFunction_GET_KW_DEFAULTS(func);
+#endif
+ if (argdefs != NULL) {
+ d = &PyTuple_GET_ITEM(argdefs, 0);
+ nd = Py_SIZE(argdefs);
+ }
+ else {
+ d = NULL;
+ nd = 0;
+ }
+#if PY_MAJOR_VERSION >= 3
+ result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL,
+ args, (int)nargs,
+ k, (int)nk,
+ d, (int)nd, kwdefs, closure);
+#else
+ result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL,
+ args, (int)nargs,
+ k, (int)nk,
+ d, (int)nd, closure);
+#endif
+ Py_XDECREF(kwtuple);
+done:
+ Py_LeaveRecursiveCall();
+ return result;
+}
+#endif
+#endif
+
+/* PyObjectCallMethO */
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) {
+ PyObject *self, *result;
+ PyCFunction cfunc;
+ cfunc = PyCFunction_GET_FUNCTION(func);
+ self = PyCFunction_GET_SELF(func);
+ if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
+ return NULL;
+ result = cfunc(self, arg);
+ Py_LeaveRecursiveCall();
+ if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
+ PyErr_SetString(
+ PyExc_SystemError,
+ "NULL result without error in PyObject_Call");
+ }
+ return result;
+}
+#endif
+
+/* PyObjectCallOneArg */
+#if CYTHON_COMPILING_IN_CPYTHON
+static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) {
+ PyObject *result;
+ PyObject *args = PyTuple_New(1);
+ if (unlikely(!args)) return NULL;
+ Py_INCREF(arg);
+ PyTuple_SET_ITEM(args, 0, arg);
+ result = __Pyx_PyObject_Call(func, args, NULL);
+ Py_DECREF(args);
+ return result;
+}
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
+#if CYTHON_FAST_PYCALL
+ if (PyFunction_Check(func)) {
+ return __Pyx_PyFunction_FastCall(func, &arg, 1);
+ }
+#endif
+ if (likely(PyCFunction_Check(func))) {
+ if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) {
+ return __Pyx_PyObject_CallMethO(func, arg);
+#if CYTHON_FAST_PYCCALL
+ } else if (PyCFunction_GET_FLAGS(func) & METH_FASTCALL) {
+ return __Pyx_PyCFunction_FastCall(func, &arg, 1);
+#endif
+ }
+ }
+ return __Pyx__PyObject_CallOneArg(func, arg);
+}
+#else
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
+ PyObject *result;
+ PyObject *args = PyTuple_Pack(1, arg);
+ if (unlikely(!args)) return NULL;
+ result = __Pyx_PyObject_Call(func, args, NULL);
+ Py_DECREF(args);
+ return result;
+}
+#endif
+
+/* GetException */
+#if CYTHON_FAST_THREAD_STATE
+static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb)
+#else
+static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
+#endif
+{
+ PyObject *local_type, *local_value, *local_tb;
+#if CYTHON_FAST_THREAD_STATE
+ PyObject *tmp_type, *tmp_value, *tmp_tb;
+ local_type = tstate->curexc_type;
+ local_value = tstate->curexc_value;
+ local_tb = tstate->curexc_traceback;
+ tstate->curexc_type = 0;
+ tstate->curexc_value = 0;
+ tstate->curexc_traceback = 0;
+#else
+ PyErr_Fetch(&local_type, &local_value, &local_tb);
+#endif
+ PyErr_NormalizeException(&local_type, &local_value, &local_tb);
+#if CYTHON_FAST_THREAD_STATE
+ if (unlikely(tstate->curexc_type))
+#else
+ if (unlikely(PyErr_Occurred()))
+#endif
+ goto bad;
+ #if PY_MAJOR_VERSION >= 3
+ if (local_tb) {
+ if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0))
+ goto bad;
+ }
+ #endif
+ Py_XINCREF(local_tb);
+ Py_XINCREF(local_type);
+ Py_XINCREF(local_value);
+ *type = local_type;
+ *value = local_value;
+ *tb = local_tb;
+#if CYTHON_FAST_THREAD_STATE
+ #if CYTHON_USE_EXC_INFO_STACK
+ {
+ _PyErr_StackItem *exc_info = tstate->exc_info;
+ tmp_type = exc_info->exc_type;
+ tmp_value = exc_info->exc_value;
+ tmp_tb = exc_info->exc_traceback;
+ exc_info->exc_type = local_type;
+ exc_info->exc_value = local_value;
+ exc_info->exc_traceback = local_tb;
+ }
+ #else
+ tmp_type = tstate->exc_type;
+ tmp_value = tstate->exc_value;
+ tmp_tb = tstate->exc_traceback;
+ tstate->exc_type = local_type;
+ tstate->exc_value = local_value;
+ tstate->exc_traceback = local_tb;
+ #endif
+ Py_XDECREF(tmp_type);
+ Py_XDECREF(tmp_value);
+ Py_XDECREF(tmp_tb);
+#else
+ PyErr_SetExcInfo(local_type, local_value, local_tb);
+#endif
+ return 0;
+bad:
+ *type = 0;
+ *value = 0;
+ *tb = 0;
+ Py_XDECREF(local_type);
+ Py_XDECREF(local_value);
+ Py_XDECREF(local_tb);
+ return -1;
+}
+
+/* SwapException */
+#if CYTHON_FAST_THREAD_STATE
+static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
+ PyObject *tmp_type, *tmp_value, *tmp_tb;
+ #if CYTHON_USE_EXC_INFO_STACK
+ _PyErr_StackItem *exc_info = tstate->exc_info;
+ tmp_type = exc_info->exc_type;
+ tmp_value = exc_info->exc_value;
+ tmp_tb = exc_info->exc_traceback;
+ exc_info->exc_type = *type;
+ exc_info->exc_value = *value;
+ exc_info->exc_traceback = *tb;
+ #else
+ tmp_type = tstate->exc_type;
+ tmp_value = tstate->exc_value;
+ tmp_tb = tstate->exc_traceback;
+ tstate->exc_type = *type;
+ tstate->exc_value = *value;
+ tstate->exc_traceback = *tb;
+ #endif
+ *type = tmp_type;
+ *value = tmp_value;
+ *tb = tmp_tb;
+}
+#else
+static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) {
+ PyObject *tmp_type, *tmp_value, *tmp_tb;
+ PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb);
+ PyErr_SetExcInfo(*type, *value, *tb);
+ *type = tmp_type;
+ *value = tmp_value;
+ *tb = tmp_tb;
+}
+#endif
+
+/* GetTopmostException */
+#if CYTHON_USE_EXC_INFO_STACK
+static _PyErr_StackItem *
+__Pyx_PyErr_GetTopmostException(PyThreadState *tstate)
+{
+ _PyErr_StackItem *exc_info = tstate->exc_info;
+ while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) &&
+ exc_info->previous_item != NULL)
+ {
+ exc_info = exc_info->previous_item;
+ }
+ return exc_info;
+}
+#endif
+
+/* SaveResetException */
+#if CYTHON_FAST_THREAD_STATE
+static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
+ #if CYTHON_USE_EXC_INFO_STACK
+ _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate);
+ *type = exc_info->exc_type;
+ *value = exc_info->exc_value;
+ *tb = exc_info->exc_traceback;
+ #else
+ *type = tstate->exc_type;
+ *value = tstate->exc_value;
+ *tb = tstate->exc_traceback;
+ #endif
+ Py_XINCREF(*type);
+ Py_XINCREF(*value);
+ Py_XINCREF(*tb);
+}
+static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) {
+ PyObject *tmp_type, *tmp_value, *tmp_tb;
+ #if CYTHON_USE_EXC_INFO_STACK
+ _PyErr_StackItem *exc_info = tstate->exc_info;
+ tmp_type = exc_info->exc_type;
+ tmp_value = exc_info->exc_value;
+ tmp_tb = exc_info->exc_traceback;
+ exc_info->exc_type = type;
+ exc_info->exc_value = value;
+ exc_info->exc_traceback = tb;
+ #else
+ tmp_type = tstate->exc_type;
+ tmp_value = tstate->exc_value;
+ tmp_tb = tstate->exc_traceback;
+ tstate->exc_type = type;
+ tstate->exc_value = value;
+ tstate->exc_traceback = tb;
+ #endif
+ Py_XDECREF(tmp_type);
+ Py_XDECREF(tmp_value);
+ Py_XDECREF(tmp_tb);
+}
+#endif
+
+/* GetItemIntUnicode */
+static CYTHON_INLINE Py_UCS4 __Pyx_GetItemInt_Unicode_Fast(PyObject* ustring, Py_ssize_t i,
+ int wraparound, int boundscheck) {
+ Py_ssize_t length;
+ if (unlikely(__Pyx_PyUnicode_READY(ustring) < 0)) return (Py_UCS4)-1;
+ if (wraparound | boundscheck) {
+ length = __Pyx_PyUnicode_GET_LENGTH(ustring);
+ if (wraparound & unlikely(i < 0)) i += length;
+ if ((!boundscheck) || likely(__Pyx_is_valid_index(i, length))) {
+ return __Pyx_PyUnicode_READ_CHAR(ustring, i);
+ } else {
+ PyErr_SetString(PyExc_IndexError, "string index out of range");
+ return (Py_UCS4)-1;
+ }
+ } else {
+ return __Pyx_PyUnicode_READ_CHAR(ustring, i);
+ }
+}
+
+/* ReRaiseException */
+static CYTHON_INLINE void __Pyx_ReraiseException(void) {
+ PyObject *type = NULL, *value = NULL, *tb = NULL;
+#if CYTHON_FAST_THREAD_STATE
+ PyThreadState *tstate = PyThreadState_GET();
+ #if CYTHON_USE_EXC_INFO_STACK
+ _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate);
+ type = exc_info->exc_type;
+ value = exc_info->exc_value;
+ tb = exc_info->exc_traceback;
+ #else
+ type = tstate->exc_type;
+ value = tstate->exc_value;
+ tb = tstate->exc_traceback;
+ #endif
+#else
+ PyErr_GetExcInfo(&type, &value, &tb);
+#endif
+ if (!type || type == Py_None) {
+#if !CYTHON_FAST_THREAD_STATE
+ Py_XDECREF(type);
+ Py_XDECREF(value);
+ Py_XDECREF(tb);
+#endif
+ PyErr_SetString(PyExc_RuntimeError,
+ "No active exception to reraise");
+ } else {
+#if CYTHON_FAST_THREAD_STATE
+ Py_INCREF(type);
+ Py_XINCREF(value);
+ Py_XINCREF(tb);
+#endif
+ PyErr_Restore(type, value, tb);
+ }
+}
+
+/* PyErrExceptionMatches */
+#if CYTHON_FAST_THREAD_STATE
+static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) {
+ Py_ssize_t i, n;
+ n = PyTuple_GET_SIZE(tuple);
+#if PY_MAJOR_VERSION >= 3
+ for (i=0; i<n; i++) {
+ if (exc_type == PyTuple_GET_ITEM(tuple, i)) return 1;
+ }
+#endif
+ for (i=0; i<n; i++) {
+ if (__Pyx_PyErr_GivenExceptionMatches(exc_type, PyTuple_GET_ITEM(tuple, i))) return 1;
+ }
+ return 0;
+}
+static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err) {
+ PyObject *exc_type = tstate->curexc_type;
+ if (exc_type == err) return 1;
+ if (unlikely(!exc_type)) return 0;
+ if (unlikely(PyTuple_Check(err)))
+ return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err);
+ return __Pyx_PyErr_GivenExceptionMatches(exc_type, err);
+}
+#endif
+
+/* GetAttr */
+static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) {
+#if CYTHON_USE_TYPE_SLOTS
+#if PY_MAJOR_VERSION >= 3
+ if (likely(PyUnicode_Check(n)))
+#else
+ if (likely(PyString_Check(n)))
+#endif
+ return __Pyx_PyObject_GetAttrStr(o, n);
+#endif
+ return PyObject_GetAttr(o, n);
+}
+
+/* GetAttr3 */
+static PyObject *__Pyx_GetAttr3Default(PyObject *d) {
+ __Pyx_PyThreadState_declare
+ __Pyx_PyThreadState_assign
+ if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError)))
+ return NULL;
+ __Pyx_PyErr_Clear();
+ Py_INCREF(d);
+ return d;
+}
+static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) {
+ PyObject *r = __Pyx_GetAttr(o, n);
+ return (likely(r)) ? r : __Pyx_GetAttr3Default(d);
+}
+
+/* PyDictVersioning */
+#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS
+static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) {
+ PyObject *dict = Py_TYPE(obj)->tp_dict;
+ return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0;
+}
+static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) {
+ PyObject **dictptr = NULL;
+ Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset;
+ if (offset) {
+#if CYTHON_COMPILING_IN_CPYTHON
+ dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj);
+#else
+ dictptr = _PyObject_GetDictPtr(obj);
+#endif
+ }
+ return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0;
+}
+static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) {
+ PyObject *dict = Py_TYPE(obj)->tp_dict;
+ if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict)))
+ return 0;
+ return obj_dict_version == __Pyx_get_object_dict_version(obj);
+}
+#endif
+
+/* GetModuleGlobalName */
+#if CYTHON_USE_DICT_VERSIONS
+static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value)
+#else
+static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name)
+#endif
+{
+ PyObject *result;
+#if !CYTHON_AVOID_BORROWED_REFS
+#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1
+ result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash);
+ __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version)
+ if (likely(result)) {
+ return __Pyx_NewRef(result);
+ } else if (unlikely(PyErr_Occurred())) {
+ return NULL;
+ }
+#else
+ result = PyDict_GetItem(__pyx_d, name);
+ __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version)
+ if (likely(result)) {
+ return __Pyx_NewRef(result);
+ }
+#endif
+#else
+ result = PyObject_GetItem(__pyx_d, name);
+ __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version)
+ if (likely(result)) {
+ return __Pyx_NewRef(result);
+ }
+ PyErr_Clear();
+#endif
+ return __Pyx_GetBuiltinName(name);
+}
+
+/* PyObjectCallNoArg */
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) {
+#if CYTHON_FAST_PYCALL
+ if (PyFunction_Check(func)) {
+ return __Pyx_PyFunction_FastCall(func, NULL, 0);
+ }
+#endif
+#ifdef __Pyx_CyFunction_USED
+ if (likely(PyCFunction_Check(func) || __Pyx_CyFunction_Check(func)))
+#else
+ if (likely(PyCFunction_Check(func)))
+#endif
+ {
+ if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) {
+ return __Pyx_PyObject_CallMethO(func, NULL);
+ }
+ }
+ return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL);
+}
+#endif
+
+/* PyUnicode_Substring */
+static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring(
+ PyObject* text, Py_ssize_t start, Py_ssize_t stop) {
+ Py_ssize_t length;
+ if (unlikely(__Pyx_PyUnicode_READY(text) == -1)) return NULL;
+ length = __Pyx_PyUnicode_GET_LENGTH(text);
+ if (start < 0) {
+ start += length;
+ if (start < 0)
+ start = 0;
+ }
+ if (stop < 0)
+ stop += length;
+ else if (stop > length)
+ stop = length;
+ if (stop <= start)
+ return __Pyx_NewRef(__pyx_empty_unicode);
+#if CYTHON_PEP393_ENABLED
+ return PyUnicode_FromKindAndData(PyUnicode_KIND(text),
+ PyUnicode_1BYTE_DATA(text) + start*PyUnicode_KIND(text), stop-start);
+#else
+ return PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(text)+start, stop-start);
+#endif
+}
+
+/* PyObjectCall2Args */
+static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) {
+ PyObject *args, *result = NULL;
+ #if CYTHON_FAST_PYCALL
+ if (PyFunction_Check(function)) {
+ PyObject *args[2] = {arg1, arg2};
+ return __Pyx_PyFunction_FastCall(function, args, 2);
+ }
+ #endif
+ #if CYTHON_FAST_PYCCALL
+ if (__Pyx_PyFastCFunction_Check(function)) {
+ PyObject *args[2] = {arg1, arg2};
+ return __Pyx_PyCFunction_FastCall(function, args, 2);
+ }
+ #endif
+ args = PyTuple_New(2);
+ if (unlikely(!args)) goto done;
+ Py_INCREF(arg1);
+ PyTuple_SET_ITEM(args, 0, arg1);
+ Py_INCREF(arg2);
+ PyTuple_SET_ITEM(args, 1, arg2);
+ Py_INCREF(function);
+ result = __Pyx_PyObject_Call(function, args, NULL);
+ Py_DECREF(args);
+ Py_DECREF(function);
+done:
+ return result;
+}
+
+/* SliceObject */
+static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(PyObject* obj,
+ Py_ssize_t cstart, Py_ssize_t cstop,
+ PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice,
+ int has_cstart, int has_cstop, CYTHON_UNUSED int wraparound) {
+#if CYTHON_USE_TYPE_SLOTS
+ PyMappingMethods* mp;
+#if PY_MAJOR_VERSION < 3
+ PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence;
+ if (likely(ms && ms->sq_slice)) {
+ if (!has_cstart) {
+ if (_py_start && (*_py_start != Py_None)) {
+ cstart = __Pyx_PyIndex_AsSsize_t(*_py_start);
+ if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad;
+ } else
+ cstart = 0;
+ }
+ if (!has_cstop) {
+ if (_py_stop && (*_py_stop != Py_None)) {
+ cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop);
+ if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad;
+ } else
+ cstop = PY_SSIZE_T_MAX;
+ }
+ if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) {
+ Py_ssize_t l = ms->sq_length(obj);
+ if (likely(l >= 0)) {
+ if (cstop < 0) {
+ cstop += l;
+ if (cstop < 0) cstop = 0;
+ }
+ if (cstart < 0) {
+ cstart += l;
+ if (cstart < 0) cstart = 0;
+ }
+ } else {
+ if (!PyErr_ExceptionMatches(PyExc_OverflowError))
+ goto bad;
+ PyErr_Clear();
+ }
+ }
+ return ms->sq_slice(obj, cstart, cstop);
+ }
+#endif
+ mp = Py_TYPE(obj)->tp_as_mapping;
+ if (likely(mp && mp->mp_subscript))
+#endif
+ {
+ PyObject* result;
+ PyObject *py_slice, *py_start, *py_stop;
+ if (_py_slice) {
+ py_slice = *_py_slice;
+ } else {
+ PyObject* owned_start = NULL;
+ PyObject* owned_stop = NULL;
+ if (_py_start) {
+ py_start = *_py_start;
+ } else {
+ if (has_cstart) {
+ owned_start = py_start = PyInt_FromSsize_t(cstart);
+ if (unlikely(!py_start)) goto bad;
+ } else
+ py_start = Py_None;
+ }
+ if (_py_stop) {
+ py_stop = *_py_stop;
+ } else {
+ if (has_cstop) {
+ owned_stop = py_stop = PyInt_FromSsize_t(cstop);
+ if (unlikely(!py_stop)) {
+ Py_XDECREF(owned_start);
+ goto bad;
+ }
+ } else
+ py_stop = Py_None;
+ }
+ py_slice = PySlice_New(py_start, py_stop, Py_None);
+ Py_XDECREF(owned_start);
+ Py_XDECREF(owned_stop);
+ if (unlikely(!py_slice)) goto bad;
+ }
+#if CYTHON_USE_TYPE_SLOTS
+ result = mp->mp_subscript(obj, py_slice);
+#else
+ result = PyObject_GetItem(obj, py_slice);
+#endif
+ if (!_py_slice) {
+ Py_DECREF(py_slice);
+ }
+ return result;
+ }
+ PyErr_Format(PyExc_TypeError,
+ "'%.200s' object is unsliceable", Py_TYPE(obj)->tp_name);
+bad:
+ return NULL;
+}
+
+/* Import */
+static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) {
+ PyObject *empty_list = 0;
+ PyObject *module = 0;
+ PyObject *global_dict = 0;
+ PyObject *empty_dict = 0;
+ PyObject *list;
+ #if PY_MAJOR_VERSION < 3
+ PyObject *py_import;
+ py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import);
+ if (!py_import)
+ goto bad;
+ #endif
+ if (from_list)
+ list = from_list;
+ else {
+ empty_list = PyList_New(0);
+ if (!empty_list)
+ goto bad;
+ list = empty_list;
+ }
+ global_dict = PyModule_GetDict(__pyx_m);
+ if (!global_dict)
+ goto bad;
+ empty_dict = PyDict_New();
+ if (!empty_dict)
+ goto bad;
+ {
+ #if PY_MAJOR_VERSION >= 3
+ if (level == -1) {
+ if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) {
+ module = PyImport_ImportModuleLevelObject(
+ name, global_dict, empty_dict, list, 1);
+ if (!module) {
+ if (!PyErr_ExceptionMatches(PyExc_ImportError))
+ goto bad;
+ PyErr_Clear();
+ }
+ }
+ level = 0;
+ }
+ #endif
+ if (!module) {
+ #if PY_MAJOR_VERSION < 3
+ PyObject *py_level = PyInt_FromLong(level);
+ if (!py_level)
+ goto bad;
+ module = PyObject_CallFunctionObjArgs(py_import,
+ name, global_dict, empty_dict, list, py_level, (PyObject *)NULL);
+ Py_DECREF(py_level);
+ #else
+ module = PyImport_ImportModuleLevelObject(
+ name, global_dict, empty_dict, list, level);
+ #endif
+ }
+ }
+bad:
+ #if PY_MAJOR_VERSION < 3
+ Py_XDECREF(py_import);
+ #endif
+ Py_XDECREF(empty_list);
+ Py_XDECREF(empty_dict);
+ return module;
+}
+
+/* ImportFrom */
+static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) {
+ PyObject* value = __Pyx_PyObject_GetAttrStr(module, name);
+ if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) {
+ PyErr_Format(PyExc_ImportError,
+ #if PY_MAJOR_VERSION < 3
+ "cannot import name %.230s", PyString_AS_STRING(name));
+ #else
+ "cannot import name %S", name);
+ #endif
+ }
+ return value;
+}
+
+/* GetItemInt */
+static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
+ PyObject *r;
+ if (!j) return NULL;
+ r = PyObject_GetItem(o, j);
+ Py_DECREF(j);
+ return r;
+}
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
+ CYTHON_NCP_UNUSED int wraparound,
+ CYTHON_NCP_UNUSED int boundscheck) {
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+ Py_ssize_t wrapped_i = i;
+ if (wraparound & unlikely(i < 0)) {
+ wrapped_i += PyList_GET_SIZE(o);
+ }
+ if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) {
+ PyObject *r = PyList_GET_ITEM(o, wrapped_i);
+ Py_INCREF(r);
+ return r;
+ }
+ return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+#else
+ return PySequence_GetItem(o, i);
+#endif
+}
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
+ CYTHON_NCP_UNUSED int wraparound,
+ CYTHON_NCP_UNUSED int boundscheck) {
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+ Py_ssize_t wrapped_i = i;
+ if (wraparound & unlikely(i < 0)) {
+ wrapped_i += PyTuple_GET_SIZE(o);
+ }
+ if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) {
+ PyObject *r = PyTuple_GET_ITEM(o, wrapped_i);
+ Py_INCREF(r);
+ return r;
+ }
+ return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+#else
+ return PySequence_GetItem(o, i);
+#endif
+}
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list,
+ CYTHON_NCP_UNUSED int wraparound,
+ CYTHON_NCP_UNUSED int boundscheck) {
+#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS
+ if (is_list || PyList_CheckExact(o)) {
+ Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
+ if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) {
+ PyObject *r = PyList_GET_ITEM(o, n);
+ Py_INCREF(r);
+ return r;
+ }
+ }
+ else if (PyTuple_CheckExact(o)) {
+ Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);
+ if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) {
+ PyObject *r = PyTuple_GET_ITEM(o, n);
+ Py_INCREF(r);
+ return r;
+ }
+ } else {
+ PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
+ if (likely(m && m->sq_item)) {
+ if (wraparound && unlikely(i < 0) && likely(m->sq_length)) {
+ Py_ssize_t l = m->sq_length(o);
+ if (likely(l >= 0)) {
+ i += l;
+ } else {
+ if (!PyErr_ExceptionMatches(PyExc_OverflowError))
+ return NULL;
+ PyErr_Clear();
+ }
+ }
+ return m->sq_item(o, i);
+ }
+ }
+#else
+ if (is_list || PySequence_Check(o)) {
+ return PySequence_GetItem(o, i);
+ }
+#endif
+ return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+}
+
+/* HasAttr */
+static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) {
+ PyObject *r;
+ if (unlikely(!__Pyx_PyBaseString_Check(n))) {
+ PyErr_SetString(PyExc_TypeError,
+ "hasattr(): attribute name must be string");
+ return -1;
+ }
+ r = __Pyx_GetAttr(o, n);
+ if (unlikely(!r)) {
+ PyErr_Clear();
+ return 0;
+ } else {
+ Py_DECREF(r);
+ return 1;
+ }
+}
+
+/* ExtTypeTest */
+static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
+ if (unlikely(!type)) {
+ PyErr_SetString(PyExc_SystemError, "Missing type object");
+ return 0;
+ }
+ if (likely(__Pyx_TypeCheck(obj, type)))
+ return 1;
+ PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s",
+ Py_TYPE(obj)->tp_name, type->tp_name);
+ return 0;
+}
+
+/* PyObject_GenericGetAttrNoDict */
+#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000
+static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) {
+ PyErr_Format(PyExc_AttributeError,
+#if PY_MAJOR_VERSION >= 3
+ "'%.50s' object has no attribute '%U'",
+ tp->tp_name, attr_name);
+#else
+ "'%.50s' object has no attribute '%.400s'",
+ tp->tp_name, PyString_AS_STRING(attr_name));
+#endif
+ return NULL;
+}
+static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) {
+ PyObject *descr;
+ PyTypeObject *tp = Py_TYPE(obj);
+ if (unlikely(!PyString_Check(attr_name))) {
+ return PyObject_GenericGetAttr(obj, attr_name);
+ }
+ assert(!tp->tp_dictoffset);
+ descr = _PyType_Lookup(tp, attr_name);
+ if (unlikely(!descr)) {
+ return __Pyx_RaiseGenericGetAttributeError(tp, attr_name);
+ }
+ Py_INCREF(descr);
+ #if PY_MAJOR_VERSION < 3
+ if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS)))
+ #endif
+ {
+ descrgetfunc f = Py_TYPE(descr)->tp_descr_get;
+ if (unlikely(f)) {
+ PyObject *res = f(descr, obj, (PyObject *)tp);
+ Py_DECREF(descr);
+ return res;
+ }
+ }
+ return descr;
+}
+#endif
+
+/* PyObject_GenericGetAttr */
+#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000
+static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) {
+ if (unlikely(Py_TYPE(obj)->tp_dictoffset)) {
+ return PyObject_GenericGetAttr(obj, attr_name);
+ }
+ return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name);
+}
+#endif
+
+/* SetVTable */
+static int __Pyx_SetVtable(PyObject *dict, void *vtable) {
+#if PY_VERSION_HEX >= 0x02070000
+ PyObject *ob = PyCapsule_New(vtable, 0, 0);
+#else
+ PyObject *ob = PyCObject_FromVoidPtr(vtable, 0);
+#endif
+ if (!ob)
+ goto bad;
+ if (PyDict_SetItem(dict, __pyx_n_s_pyx_vtable, ob) < 0)
+ goto bad;
+ Py_DECREF(ob);
+ return 0;
+bad:
+ Py_XDECREF(ob);
+ return -1;
+}
+
+/* PyObjectGetAttrStrNoError */
+static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) {
+ __Pyx_PyThreadState_declare
+ __Pyx_PyThreadState_assign
+ if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError)))
+ __Pyx_PyErr_Clear();
+}
+static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) {
+ PyObject *result;
+#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1
+ PyTypeObject* tp = Py_TYPE(obj);
+ if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) {
+ return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1);
+ }
+#endif
+ result = __Pyx_PyObject_GetAttrStr(obj, attr_name);
+ if (unlikely(!result)) {
+ __Pyx_PyObject_GetAttrStr_ClearAttributeError();
+ }
+ return result;
+}
+
+/* SetupReduce */
+static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) {
+ int ret;
+ PyObject *name_attr;
+ name_attr = __Pyx_PyObject_GetAttrStr(meth, __pyx_n_s_name);
+ if (likely(name_attr)) {
+ ret = PyObject_RichCompareBool(name_attr, name, Py_EQ);
+ } else {
+ ret = -1;
+ }
+ if (unlikely(ret < 0)) {
+ PyErr_Clear();
+ ret = 0;
+ }
+ Py_XDECREF(name_attr);
+ return ret;
+}
+static int __Pyx_setup_reduce(PyObject* type_obj) {
+ int ret = 0;
+ PyObject *object_reduce = NULL;
+ PyObject *object_reduce_ex = NULL;
+ PyObject *reduce = NULL;
+ PyObject *reduce_ex = NULL;
+ PyObject *reduce_cython = NULL;
+ PyObject *setstate = NULL;
+ PyObject *setstate_cython = NULL;
+#if CYTHON_USE_PYTYPE_LOOKUP
+ if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD;
+#else
+ if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD;
+#endif
+#if CYTHON_USE_PYTYPE_LOOKUP
+ object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD;
+#else
+ object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD;
+#endif
+ reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD;
+ if (reduce_ex == object_reduce_ex) {
+#if CYTHON_USE_PYTYPE_LOOKUP
+ object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD;
+#else
+ object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD;
+#endif
+ reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD;
+ if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) {
+ reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython);
+ if (likely(reduce_cython)) {
+ ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD;
+ ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD;
+ } else if (reduce == object_reduce || PyErr_Occurred()) {
+ goto __PYX_BAD;
+ }
+ setstate = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate);
+ if (!setstate) PyErr_Clear();
+ if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) {
+ setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython);
+ if (likely(setstate_cython)) {
+ ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD;
+ ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD;
+ } else if (!setstate || PyErr_Occurred()) {
+ goto __PYX_BAD;
+ }
+ }
+ PyType_Modified((PyTypeObject*)type_obj);
+ }
+ }
+ goto __PYX_GOOD;
+__PYX_BAD:
+ if (!PyErr_Occurred())
+ PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for %s", ((PyTypeObject*)type_obj)->tp_name);
+ ret = -1;
+__PYX_GOOD:
+#if !CYTHON_USE_PYTYPE_LOOKUP
+ Py_XDECREF(object_reduce);
+ Py_XDECREF(object_reduce_ex);
+#endif
+ Py_XDECREF(reduce);
+ Py_XDECREF(reduce_ex);
+ Py_XDECREF(reduce_cython);
+ Py_XDECREF(setstate);
+ Py_XDECREF(setstate_cython);
+ return ret;
+}
+
+/* TypeImport */
+#ifndef __PYX_HAVE_RT_ImportType
+#define __PYX_HAVE_RT_ImportType
+static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name, const char *class_name,
+ size_t size, enum __Pyx_ImportType_CheckSize check_size)
+{
+ PyObject *result = 0;
+ char warning[200];
+ Py_ssize_t basicsize;
+#ifdef Py_LIMITED_API
+ PyObject *py_basicsize;
+#endif
+ result = PyObject_GetAttrString(module, class_name);
+ if (!result)
+ goto bad;
+ if (!PyType_Check(result)) {
+ PyErr_Format(PyExc_TypeError,
+ "%.200s.%.200s is not a type object",
+ module_name, class_name);
+ goto bad;
+ }
+#ifndef Py_LIMITED_API
+ basicsize = ((PyTypeObject *)result)->tp_basicsize;
+#else
+ py_basicsize = PyObject_GetAttrString(result, "__basicsize__");
+ if (!py_basicsize)
+ goto bad;
+ basicsize = PyLong_AsSsize_t(py_basicsize);
+ Py_DECREF(py_basicsize);
+ py_basicsize = 0;
+ if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred())
+ goto bad;
+#endif
+ if ((size_t)basicsize < size) {
+ PyErr_Format(PyExc_ValueError,
+ "%.200s.%.200s size changed, may indicate binary incompatibility. "
+ "Expected %zd from C header, got %zd from PyObject",
+ module_name, class_name, size, basicsize);
+ goto bad;
+ }
+ if (check_size == __Pyx_ImportType_CheckSize_Error && (size_t)basicsize != size) {
+ PyErr_Format(PyExc_ValueError,
+ "%.200s.%.200s size changed, may indicate binary incompatibility. "
+ "Expected %zd from C header, got %zd from PyObject",
+ module_name, class_name, size, basicsize);
+ goto bad;
+ }
+ else if (check_size == __Pyx_ImportType_CheckSize_Warn && (size_t)basicsize > size) {
+ PyOS_snprintf(warning, sizeof(warning),
+ "%s.%s size changed, may indicate binary incompatibility. "
+ "Expected %zd from C header, got %zd from PyObject",
+ module_name, class_name, size, basicsize);
+ if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad;
+ }
+ return (PyTypeObject *)result;
+bad:
+ Py_XDECREF(result);
+ return NULL;
+}
+#endif
+
+/* CLineInTraceback */
+#ifndef CYTHON_CLINE_IN_TRACEBACK
+static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) {
+ PyObject *use_cline;
+ PyObject *ptype, *pvalue, *ptraceback;
+#if CYTHON_COMPILING_IN_CPYTHON
+ PyObject **cython_runtime_dict;
+#endif
+ if (unlikely(!__pyx_cython_runtime)) {
+ return c_line;
+ }
+ __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback);
+#if CYTHON_COMPILING_IN_CPYTHON
+ cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime);
+ if (likely(cython_runtime_dict)) {
+ __PYX_PY_DICT_LOOKUP_IF_MODIFIED(
+ use_cline, *cython_runtime_dict,
+ __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback))
+ } else
+#endif
+ {
+ PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback);
+ if (use_cline_obj) {
+ use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True;
+ Py_DECREF(use_cline_obj);
+ } else {
+ PyErr_Clear();
+ use_cline = NULL;
+ }
+ }
+ if (!use_cline) {
+ c_line = 0;
+ PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False);
+ }
+ else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) {
+ c_line = 0;
+ }
+ __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback);
+ return c_line;
+}
+#endif
+
+/* CodeObjectCache */
+static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {
+ int start = 0, mid = 0, end = count - 1;
+ if (end >= 0 && code_line > entries[end].code_line) {
+ return count;
+ }
+ while (start < end) {
+ mid = start + (end - start) / 2;
+ if (code_line < entries[mid].code_line) {
+ end = mid;
+ } else if (code_line > entries[mid].code_line) {
+ start = mid + 1;
+ } else {
+ return mid;
+ }
+ }
+ if (code_line <= entries[mid].code_line) {
+ return mid;
+ } else {
+ return mid + 1;
+ }
+}
+static PyCodeObject *__pyx_find_code_object(int code_line) {
+ PyCodeObject* code_object;
+ int pos;
+ if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {
+ return NULL;
+ }
+ pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
+ if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {
+ return NULL;
+ }
+ code_object = __pyx_code_cache.entries[pos].code_object;
+ Py_INCREF(code_object);
+ return code_object;
+}
+static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
+ int pos, i;
+ __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;
+ if (unlikely(!code_line)) {
+ return;
+ }
+ if (unlikely(!entries)) {
+ entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));
+ if (likely(entries)) {
+ __pyx_code_cache.entries = entries;
+ __pyx_code_cache.max_count = 64;
+ __pyx_code_cache.count = 1;
+ entries[0].code_line = code_line;
+ entries[0].code_object = code_object;
+ Py_INCREF(code_object);
+ }
+ return;
+ }
+ pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
+ if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {
+ PyCodeObject* tmp = entries[pos].code_object;
+ entries[pos].code_object = code_object;
+ Py_DECREF(tmp);
+ return;
+ }
+ if (__pyx_code_cache.count == __pyx_code_cache.max_count) {
+ int new_max = __pyx_code_cache.max_count + 64;
+ entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(
+ __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry));
+ if (unlikely(!entries)) {
+ return;
+ }
+ __pyx_code_cache.entries = entries;
+ __pyx_code_cache.max_count = new_max;
+ }
+ for (i=__pyx_code_cache.count; i>pos; i--) {
+ entries[i] = entries[i-1];
+ }
+ entries[pos].code_line = code_line;
+ entries[pos].code_object = code_object;
+ __pyx_code_cache.count++;
+ Py_INCREF(code_object);
+}
+
+/* AddTraceback */
+#include "compile.h"
+#include "frameobject.h"
+#include "traceback.h"
+static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
+ const char *funcname, int c_line,
+ int py_line, const char *filename) {
+ PyCodeObject *py_code = 0;
+ PyObject *py_srcfile = 0;
+ PyObject *py_funcname = 0;
+ #if PY_MAJOR_VERSION < 3
+ py_srcfile = PyString_FromString(filename);
+ #else
+ py_srcfile = PyUnicode_FromString(filename);
+ #endif
+ if (!py_srcfile) goto bad;
+ if (c_line) {
+ #if PY_MAJOR_VERSION < 3
+ py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
+ #else
+ py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
+ #endif
+ }
+ else {
+ #if PY_MAJOR_VERSION < 3
+ py_funcname = PyString_FromString(funcname);
+ #else
+ py_funcname = PyUnicode_FromString(funcname);
+ #endif
+ }
+ if (!py_funcname) goto bad;
+ py_code = __Pyx_PyCode_New(
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ __pyx_empty_bytes, /*PyObject *code,*/
+ __pyx_empty_tuple, /*PyObject *consts,*/
+ __pyx_empty_tuple, /*PyObject *names,*/
+ __pyx_empty_tuple, /*PyObject *varnames,*/
+ __pyx_empty_tuple, /*PyObject *freevars,*/
+ __pyx_empty_tuple, /*PyObject *cellvars,*/
+ py_srcfile, /*PyObject *filename,*/
+ py_funcname, /*PyObject *name,*/
+ py_line,
+ __pyx_empty_bytes /*PyObject *lnotab*/
+ );
+ Py_DECREF(py_srcfile);
+ Py_DECREF(py_funcname);
+ return py_code;
+bad:
+ Py_XDECREF(py_srcfile);
+ Py_XDECREF(py_funcname);
+ return NULL;
+}
+static void __Pyx_AddTraceback(const char *funcname, int c_line,
+ int py_line, const char *filename) {
+ PyCodeObject *py_code = 0;
+ PyFrameObject *py_frame = 0;
+ PyThreadState *tstate = __Pyx_PyThreadState_Current;
+ if (c_line) {
+ c_line = __Pyx_CLineForTraceback(tstate, c_line);
+ }
+ py_code = __pyx_find_code_object(c_line ? -c_line : py_line);
+ if (!py_code) {
+ py_code = __Pyx_CreateCodeObjectForTraceback(
+ funcname, c_line, py_line, filename);
+ if (!py_code) goto bad;
+ __pyx_insert_code_object(c_line ? -c_line : py_line, py_code);
+ }
+ py_frame = PyFrame_New(
+ tstate, /*PyThreadState *tstate,*/
+ py_code, /*PyCodeObject *code,*/
+ __pyx_d, /*PyObject *globals,*/
+ 0 /*PyObject *locals*/
+ );
+ if (!py_frame) goto bad;
+ __Pyx_PyFrame_SetLineNumber(py_frame, py_line);
+ PyTraceBack_Here(py_frame);
+bad:
+ Py_XDECREF(py_code);
+ Py_XDECREF(py_frame);
+}
+
+/* CIntFromPyVerify */
+#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\
+ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0)
+#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\
+ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1)
+#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\
+ {\
+ func_type value = func_value;\
+ if (sizeof(target_type) < sizeof(func_type)) {\
+ if (unlikely(value != (func_type) (target_type) value)) {\
+ func_type zero = 0;\
+ if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\
+ return (target_type) -1;\
+ if (is_unsigned && unlikely(value < zero))\
+ goto raise_neg_overflow;\
+ else\
+ goto raise_overflow;\
+ }\
+ }\
+ return (target_type) value;\
+ }
+
+/* CIntToPy */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) {
+ const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0;
+ const int is_unsigned = neg_one > const_zero;
+ if (is_unsigned) {
+ if (sizeof(int) < sizeof(long)) {
+ return PyInt_FromLong((long) value);
+ } else if (sizeof(int) <= sizeof(unsigned long)) {
+ return PyLong_FromUnsignedLong((unsigned long) value);
+#ifdef HAVE_LONG_LONG
+ } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) {
+ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+#endif
+ }
+ } else {
+ if (sizeof(int) <= sizeof(long)) {
+ return PyInt_FromLong((long) value);
+#ifdef HAVE_LONG_LONG
+ } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) {
+ return PyLong_FromLongLong((PY_LONG_LONG) value);
+#endif
+ }
+ }
+ {
+ int one = 1; int little = (int)*(unsigned char *)&one;
+ unsigned char *bytes = (unsigned char *)&value;
+ return _PyLong_FromByteArray(bytes, sizeof(int),
+ little, !is_unsigned);
+ }
+}
+
+/* CIntToPy */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) {
+ const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0;
+ const int is_unsigned = neg_one > const_zero;
+ if (is_unsigned) {
+ if (sizeof(long) < sizeof(long)) {
+ return PyInt_FromLong((long) value);
+ } else if (sizeof(long) <= sizeof(unsigned long)) {
+ return PyLong_FromUnsignedLong((unsigned long) value);
+#ifdef HAVE_LONG_LONG
+ } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) {
+ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
+#endif
+ }
+ } else {
+ if (sizeof(long) <= sizeof(long)) {
+ return PyInt_FromLong((long) value);
+#ifdef HAVE_LONG_LONG
+ } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) {
+ return PyLong_FromLongLong((PY_LONG_LONG) value);
+#endif
+ }
+ }
+ {
+ int one = 1; int little = (int)*(unsigned char *)&one;
+ unsigned char *bytes = (unsigned char *)&value;
+ return _PyLong_FromByteArray(bytes, sizeof(long),
+ little, !is_unsigned);
+ }
+}
+
+/* PyUCS4InUnicode */
+#if PY_VERSION_HEX < 0x03090000
+#if Py_UNICODE_SIZE == 2
+static int __Pyx_PyUnicodeBufferContainsUCS4_SP(Py_UNICODE* buffer, Py_ssize_t length, Py_UCS4 character) {
+ Py_UNICODE high_val, low_val;
+ Py_UNICODE* pos;
+ high_val = (Py_UNICODE) (0xD800 | (((character - 0x10000) >> 10) & ((1<<10)-1)));
+ low_val = (Py_UNICODE) (0xDC00 | ( (character - 0x10000) & ((1<<10)-1)));
+ for (pos=buffer; pos < buffer+length-1; pos++) {
+ if (unlikely((high_val == pos[0]) & (low_val == pos[1]))) return 1;
+ }
+ return 0;
+}
+#endif
+static int __Pyx_PyUnicodeBufferContainsUCS4_BMP(Py_UNICODE* buffer, Py_ssize_t length, Py_UCS4 character) {
+ Py_UNICODE uchar;
+ Py_UNICODE* pos;
+ uchar = (Py_UNICODE) character;
+ for (pos=buffer; pos < buffer+length; pos++) {
+ if (unlikely(uchar == pos[0])) return 1;
+ }
+ return 0;
+}
+#endif
+static CYTHON_INLINE int __Pyx_UnicodeContainsUCS4(PyObject* unicode, Py_UCS4 character) {
+#if CYTHON_PEP393_ENABLED
+ const int kind = PyUnicode_KIND(unicode);
+ if (likely(kind != PyUnicode_WCHAR_KIND)) {
+ Py_ssize_t i;
+ const void* udata = PyUnicode_DATA(unicode);
+ const Py_ssize_t length = PyUnicode_GET_LENGTH(unicode);
+ for (i=0; i < length; i++) {
+ if (unlikely(character == PyUnicode_READ(kind, udata, i))) return 1;
+ }
+ return 0;
+ }
+#elif PY_VERSION_HEX >= 0x03090000
+ #error Cannot use "UChar in Unicode" in Python 3.9 without PEP-393 unicode strings.
+#endif
+#if PY_VERSION_HEX < 0x03090000
+#if Py_UNICODE_SIZE == 2
+ if (unlikely(character > 65535)) {
+ return __Pyx_PyUnicodeBufferContainsUCS4_SP(
+ PyUnicode_AS_UNICODE(unicode),
+ PyUnicode_GET_SIZE(unicode),
+ character);
+ } else
+#endif
+ {
+ return __Pyx_PyUnicodeBufferContainsUCS4_BMP(
+ PyUnicode_AS_UNICODE(unicode),
+ PyUnicode_GET_SIZE(unicode),
+ character);
+ }
+#endif
+}
+
+/* UnicodeAsUCS4 */
+static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject* x) {
+ Py_ssize_t length;
+ #if CYTHON_PEP393_ENABLED
+ length = PyUnicode_GET_LENGTH(x);
+ if (likely(length == 1)) {
+ return PyUnicode_READ_CHAR(x, 0);
+ }
+ #else
+ length = PyUnicode_GET_SIZE(x);
+ if (likely(length == 1)) {
+ return PyUnicode_AS_UNICODE(x)[0];
+ }
+ #if Py_UNICODE_SIZE == 2
+ else if (PyUnicode_GET_SIZE(x) == 2) {
+ Py_UCS4 high_val = PyUnicode_AS_UNICODE(x)[0];
+ if (high_val >= 0xD800 && high_val <= 0xDBFF) {
+ Py_UCS4 low_val = PyUnicode_AS_UNICODE(x)[1];
+ if (low_val >= 0xDC00 && low_val <= 0xDFFF) {
+ return 0x10000 + (((high_val & ((1<<10)-1)) << 10) | (low_val & ((1<<10)-1)));
+ }
+ }
+ }
+ #endif
+ #endif
+ PyErr_Format(PyExc_ValueError,
+ "only single character unicode strings can be converted to Py_UCS4, "
+ "got length %" CYTHON_FORMAT_SSIZE_T "d", length);
+ return (Py_UCS4)-1;
+}
+
+/* CIntFromPy */
+static CYTHON_INLINE uint8_t __Pyx_PyInt_As_uint8_t(PyObject *x) {
+ const uint8_t neg_one = (uint8_t) ((uint8_t) 0 - (uint8_t) 1), const_zero = (uint8_t) 0;
+ const int is_unsigned = neg_one > const_zero;
+#if PY_MAJOR_VERSION < 3
+ if (likely(PyInt_Check(x))) {
+ if (sizeof(uint8_t) < sizeof(long)) {
+ __PYX_VERIFY_RETURN_INT(uint8_t, long, PyInt_AS_LONG(x))
+ } else {
+ long val = PyInt_AS_LONG(x);
+ if (is_unsigned && unlikely(val < 0)) {
+ goto raise_neg_overflow;
+ }
+ return (uint8_t) val;
+ }
+ } else
+#endif
+ if (likely(PyLong_Check(x))) {
+ if (is_unsigned) {
+#if CYTHON_USE_PYLONG_INTERNALS
+ const digit* digits = ((PyLongObject*)x)->ob_digit;
+ switch (Py_SIZE(x)) {
+ case 0: return (uint8_t) 0;
+ case 1: __PYX_VERIFY_RETURN_INT(uint8_t, digit, digits[0])
+ case 2:
+ if (8 * sizeof(uint8_t) > 1 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(uint8_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(uint8_t) >= 2 * PyLong_SHIFT) {
+ return (uint8_t) (((((uint8_t)digits[1]) << PyLong_SHIFT) | (uint8_t)digits[0]));
+ }
+ }
+ break;
+ case 3:
+ if (8 * sizeof(uint8_t) > 2 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(uint8_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(uint8_t) >= 3 * PyLong_SHIFT) {
+ return (uint8_t) (((((((uint8_t)digits[2]) << PyLong_SHIFT) | (uint8_t)digits[1]) << PyLong_SHIFT) | (uint8_t)digits[0]));
+ }
+ }
+ break;
+ case 4:
+ if (8 * sizeof(uint8_t) > 3 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(uint8_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(uint8_t) >= 4 * PyLong_SHIFT) {
+ return (uint8_t) (((((((((uint8_t)digits[3]) << PyLong_SHIFT) | (uint8_t)digits[2]) << PyLong_SHIFT) | (uint8_t)digits[1]) << PyLong_SHIFT) | (uint8_t)digits[0]));
+ }
+ }
+ break;
+ }
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON
+ if (unlikely(Py_SIZE(x) < 0)) {
+ goto raise_neg_overflow;
+ }
+#else
+ {
+ int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+ if (unlikely(result < 0))
+ return (uint8_t) -1;
+ if (unlikely(result == 1))
+ goto raise_neg_overflow;
+ }
+#endif
+ if (sizeof(uint8_t) <= sizeof(unsigned long)) {
+ __PYX_VERIFY_RETURN_INT_EXC(uint8_t, unsigned long, PyLong_AsUnsignedLong(x))
+#ifdef HAVE_LONG_LONG
+ } else if (sizeof(uint8_t) <= sizeof(unsigned PY_LONG_LONG)) {
+ __PYX_VERIFY_RETURN_INT_EXC(uint8_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
+#endif
+ }
+ } else {
+#if CYTHON_USE_PYLONG_INTERNALS
+ const digit* digits = ((PyLongObject*)x)->ob_digit;
+ switch (Py_SIZE(x)) {
+ case 0: return (uint8_t) 0;
+ case -1: __PYX_VERIFY_RETURN_INT(uint8_t, sdigit, (sdigit) (-(sdigit)digits[0]))
+ case 1: __PYX_VERIFY_RETURN_INT(uint8_t, digit, +digits[0])
+ case -2:
+ if (8 * sizeof(uint8_t) - 1 > 1 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(uint8_t, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(uint8_t) - 1 > 2 * PyLong_SHIFT) {
+ return (uint8_t) (((uint8_t)-1)*(((((uint8_t)digits[1]) << PyLong_SHIFT) | (uint8_t)digits[0])));
+ }
+ }
+ break;
+ case 2:
+ if (8 * sizeof(uint8_t) > 1 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(uint8_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(uint8_t) - 1 > 2 * PyLong_SHIFT) {
+ return (uint8_t) ((((((uint8_t)digits[1]) << PyLong_SHIFT) | (uint8_t)digits[0])));
+ }
+ }
+ break;
+ case -3:
+ if (8 * sizeof(uint8_t) - 1 > 2 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(uint8_t, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(uint8_t) - 1 > 3 * PyLong_SHIFT) {
+ return (uint8_t) (((uint8_t)-1)*(((((((uint8_t)digits[2]) << PyLong_SHIFT) | (uint8_t)digits[1]) << PyLong_SHIFT) | (uint8_t)digits[0])));
+ }
+ }
+ break;
+ case 3:
+ if (8 * sizeof(uint8_t) > 2 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(uint8_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(uint8_t) - 1 > 3 * PyLong_SHIFT) {
+ return (uint8_t) ((((((((uint8_t)digits[2]) << PyLong_SHIFT) | (uint8_t)digits[1]) << PyLong_SHIFT) | (uint8_t)digits[0])));
+ }
+ }
+ break;
+ case -4:
+ if (8 * sizeof(uint8_t) - 1 > 3 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(uint8_t, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(uint8_t) - 1 > 4 * PyLong_SHIFT) {
+ return (uint8_t) (((uint8_t)-1)*(((((((((uint8_t)digits[3]) << PyLong_SHIFT) | (uint8_t)digits[2]) << PyLong_SHIFT) | (uint8_t)digits[1]) << PyLong_SHIFT) | (uint8_t)digits[0])));
+ }
+ }
+ break;
+ case 4:
+ if (8 * sizeof(uint8_t) > 3 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(uint8_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(uint8_t) - 1 > 4 * PyLong_SHIFT) {
+ return (uint8_t) ((((((((((uint8_t)digits[3]) << PyLong_SHIFT) | (uint8_t)digits[2]) << PyLong_SHIFT) | (uint8_t)digits[1]) << PyLong_SHIFT) | (uint8_t)digits[0])));
+ }
+ }
+ break;
+ }
+#endif
+ if (sizeof(uint8_t) <= sizeof(long)) {
+ __PYX_VERIFY_RETURN_INT_EXC(uint8_t, long, PyLong_AsLong(x))
+#ifdef HAVE_LONG_LONG
+ } else if (sizeof(uint8_t) <= sizeof(PY_LONG_LONG)) {
+ __PYX_VERIFY_RETURN_INT_EXC(uint8_t, PY_LONG_LONG, PyLong_AsLongLong(x))
+#endif
+ }
+ }
+ {
+#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
+ PyErr_SetString(PyExc_RuntimeError,
+ "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
+#else
+ uint8_t val;
+ PyObject *v = __Pyx_PyNumber_IntOrLong(x);
+ #if PY_MAJOR_VERSION < 3
+ if (likely(v) && !PyLong_Check(v)) {
+ PyObject *tmp = v;
+ v = PyNumber_Long(tmp);
+ Py_DECREF(tmp);
+ }
+ #endif
+ if (likely(v)) {
+ int one = 1; int is_little = (int)*(unsigned char *)&one;
+ unsigned char *bytes = (unsigned char *)&val;
+ int ret = _PyLong_AsByteArray((PyLongObject *)v,
+ bytes, sizeof(val),
+ is_little, !is_unsigned);
+ Py_DECREF(v);
+ if (likely(!ret))
+ return val;
+ }
+#endif
+ return (uint8_t) -1;
+ }
+ } else {
+ uint8_t val;
+ PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
+ if (!tmp) return (uint8_t) -1;
+ val = __Pyx_PyInt_As_uint8_t(tmp);
+ Py_DECREF(tmp);
+ return val;
+ }
+raise_overflow:
+ PyErr_SetString(PyExc_OverflowError,
+ "value too large to convert to uint8_t");
+ return (uint8_t) -1;
+raise_neg_overflow:
+ PyErr_SetString(PyExc_OverflowError,
+ "can't convert negative value to uint8_t");
+ return (uint8_t) -1;
+}
+
+/* CIntFromPy */
+static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *x) {
+ const uint64_t neg_one = (uint64_t) ((uint64_t) 0 - (uint64_t) 1), const_zero = (uint64_t) 0;
+ const int is_unsigned = neg_one > const_zero;
+#if PY_MAJOR_VERSION < 3
+ if (likely(PyInt_Check(x))) {
+ if (sizeof(uint64_t) < sizeof(long)) {
+ __PYX_VERIFY_RETURN_INT(uint64_t, long, PyInt_AS_LONG(x))
+ } else {
+ long val = PyInt_AS_LONG(x);
+ if (is_unsigned && unlikely(val < 0)) {
+ goto raise_neg_overflow;
+ }
+ return (uint64_t) val;
+ }
+ } else
+#endif
+ if (likely(PyLong_Check(x))) {
+ if (is_unsigned) {
+#if CYTHON_USE_PYLONG_INTERNALS
+ const digit* digits = ((PyLongObject*)x)->ob_digit;
+ switch (Py_SIZE(x)) {
+ case 0: return (uint64_t) 0;
+ case 1: __PYX_VERIFY_RETURN_INT(uint64_t, digit, digits[0])
+ case 2:
+ if (8 * sizeof(uint64_t) > 1 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(uint64_t) >= 2 * PyLong_SHIFT) {
+ return (uint64_t) (((((uint64_t)digits[1]) << PyLong_SHIFT) | (uint64_t)digits[0]));
+ }
+ }
+ break;
+ case 3:
+ if (8 * sizeof(uint64_t) > 2 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(uint64_t) >= 3 * PyLong_SHIFT) {
+ return (uint64_t) (((((((uint64_t)digits[2]) << PyLong_SHIFT) | (uint64_t)digits[1]) << PyLong_SHIFT) | (uint64_t)digits[0]));
+ }
+ }
+ break;
+ case 4:
+ if (8 * sizeof(uint64_t) > 3 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(uint64_t) >= 4 * PyLong_SHIFT) {
+ return (uint64_t) (((((((((uint64_t)digits[3]) << PyLong_SHIFT) | (uint64_t)digits[2]) << PyLong_SHIFT) | (uint64_t)digits[1]) << PyLong_SHIFT) | (uint64_t)digits[0]));
+ }
+ }
+ break;
+ }
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON
+ if (unlikely(Py_SIZE(x) < 0)) {
+ goto raise_neg_overflow;
+ }
+#else
+ {
+ int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+ if (unlikely(result < 0))
+ return (uint64_t) -1;
+ if (unlikely(result == 1))
+ goto raise_neg_overflow;
+ }
+#endif
+ if (sizeof(uint64_t) <= sizeof(unsigned long)) {
+ __PYX_VERIFY_RETURN_INT_EXC(uint64_t, unsigned long, PyLong_AsUnsignedLong(x))
+#ifdef HAVE_LONG_LONG
+ } else if (sizeof(uint64_t) <= sizeof(unsigned PY_LONG_LONG)) {
+ __PYX_VERIFY_RETURN_INT_EXC(uint64_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
+#endif
+ }
+ } else {
+#if CYTHON_USE_PYLONG_INTERNALS
+ const digit* digits = ((PyLongObject*)x)->ob_digit;
+ switch (Py_SIZE(x)) {
+ case 0: return (uint64_t) 0;
+ case -1: __PYX_VERIFY_RETURN_INT(uint64_t, sdigit, (sdigit) (-(sdigit)digits[0]))
+ case 1: __PYX_VERIFY_RETURN_INT(uint64_t, digit, +digits[0])
+ case -2:
+ if (8 * sizeof(uint64_t) - 1 > 1 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(uint64_t, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(uint64_t) - 1 > 2 * PyLong_SHIFT) {
+ return (uint64_t) (((uint64_t)-1)*(((((uint64_t)digits[1]) << PyLong_SHIFT) | (uint64_t)digits[0])));
+ }
+ }
+ break;
+ case 2:
+ if (8 * sizeof(uint64_t) > 1 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(uint64_t) - 1 > 2 * PyLong_SHIFT) {
+ return (uint64_t) ((((((uint64_t)digits[1]) << PyLong_SHIFT) | (uint64_t)digits[0])));
+ }
+ }
+ break;
+ case -3:
+ if (8 * sizeof(uint64_t) - 1 > 2 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(uint64_t, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(uint64_t) - 1 > 3 * PyLong_SHIFT) {
+ return (uint64_t) (((uint64_t)-1)*(((((((uint64_t)digits[2]) << PyLong_SHIFT) | (uint64_t)digits[1]) << PyLong_SHIFT) | (uint64_t)digits[0])));
+ }
+ }
+ break;
+ case 3:
+ if (8 * sizeof(uint64_t) > 2 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(uint64_t) - 1 > 3 * PyLong_SHIFT) {
+ return (uint64_t) ((((((((uint64_t)digits[2]) << PyLong_SHIFT) | (uint64_t)digits[1]) << PyLong_SHIFT) | (uint64_t)digits[0])));
+ }
+ }
+ break;
+ case -4:
+ if (8 * sizeof(uint64_t) - 1 > 3 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(uint64_t, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(uint64_t) - 1 > 4 * PyLong_SHIFT) {
+ return (uint64_t) (((uint64_t)-1)*(((((((((uint64_t)digits[3]) << PyLong_SHIFT) | (uint64_t)digits[2]) << PyLong_SHIFT) | (uint64_t)digits[1]) << PyLong_SHIFT) | (uint64_t)digits[0])));
+ }
+ }
+ break;
+ case 4:
+ if (8 * sizeof(uint64_t) > 3 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(uint64_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(uint64_t) - 1 > 4 * PyLong_SHIFT) {
+ return (uint64_t) ((((((((((uint64_t)digits[3]) << PyLong_SHIFT) | (uint64_t)digits[2]) << PyLong_SHIFT) | (uint64_t)digits[1]) << PyLong_SHIFT) | (uint64_t)digits[0])));
+ }
+ }
+ break;
+ }
+#endif
+ if (sizeof(uint64_t) <= sizeof(long)) {
+ __PYX_VERIFY_RETURN_INT_EXC(uint64_t, long, PyLong_AsLong(x))
+#ifdef HAVE_LONG_LONG
+ } else if (sizeof(uint64_t) <= sizeof(PY_LONG_LONG)) {
+ __PYX_VERIFY_RETURN_INT_EXC(uint64_t, PY_LONG_LONG, PyLong_AsLongLong(x))
+#endif
+ }
+ }
+ {
+#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
+ PyErr_SetString(PyExc_RuntimeError,
+ "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
+#else
+ uint64_t val;
+ PyObject *v = __Pyx_PyNumber_IntOrLong(x);
+ #if PY_MAJOR_VERSION < 3
+ if (likely(v) && !PyLong_Check(v)) {
+ PyObject *tmp = v;
+ v = PyNumber_Long(tmp);
+ Py_DECREF(tmp);
+ }
+ #endif
+ if (likely(v)) {
+ int one = 1; int is_little = (int)*(unsigned char *)&one;
+ unsigned char *bytes = (unsigned char *)&val;
+ int ret = _PyLong_AsByteArray((PyLongObject *)v,
+ bytes, sizeof(val),
+ is_little, !is_unsigned);
+ Py_DECREF(v);
+ if (likely(!ret))
+ return val;
+ }
+#endif
+ return (uint64_t) -1;
+ }
+ } else {
+ uint64_t val;
+ PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
+ if (!tmp) return (uint64_t) -1;
+ val = __Pyx_PyInt_As_uint64_t(tmp);
+ Py_DECREF(tmp);
+ return val;
+ }
+raise_overflow:
+ PyErr_SetString(PyExc_OverflowError,
+ "value too large to convert to uint64_t");
+ return (uint64_t) -1;
+raise_neg_overflow:
+ PyErr_SetString(PyExc_OverflowError,
+ "can't convert negative value to uint64_t");
+ return (uint64_t) -1;
+}
+
+/* CIntFromPy */
+static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) {
+ const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0;
+ const int is_unsigned = neg_one > const_zero;
+#if PY_MAJOR_VERSION < 3
+ if (likely(PyInt_Check(x))) {
+ if (sizeof(long) < sizeof(long)) {
+ __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x))
+ } else {
+ long val = PyInt_AS_LONG(x);
+ if (is_unsigned && unlikely(val < 0)) {
+ goto raise_neg_overflow;
+ }
+ return (long) val;
+ }
+ } else
+#endif
+ if (likely(PyLong_Check(x))) {
+ if (is_unsigned) {
+#if CYTHON_USE_PYLONG_INTERNALS
+ const digit* digits = ((PyLongObject*)x)->ob_digit;
+ switch (Py_SIZE(x)) {
+ case 0: return (long) 0;
+ case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0])
+ case 2:
+ if (8 * sizeof(long) > 1 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) {
+ return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]));
+ }
+ }
+ break;
+ case 3:
+ if (8 * sizeof(long) > 2 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) {
+ return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]));
+ }
+ }
+ break;
+ case 4:
+ if (8 * sizeof(long) > 3 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) {
+ return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]));
+ }
+ }
+ break;
+ }
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON
+ if (unlikely(Py_SIZE(x) < 0)) {
+ goto raise_neg_overflow;
+ }
+#else
+ {
+ int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+ if (unlikely(result < 0))
+ return (long) -1;
+ if (unlikely(result == 1))
+ goto raise_neg_overflow;
+ }
+#endif
+ if (sizeof(long) <= sizeof(unsigned long)) {
+ __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x))
+#ifdef HAVE_LONG_LONG
+ } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) {
+ __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
+#endif
+ }
+ } else {
+#if CYTHON_USE_PYLONG_INTERNALS
+ const digit* digits = ((PyLongObject*)x)->ob_digit;
+ switch (Py_SIZE(x)) {
+ case 0: return (long) 0;
+ case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0]))
+ case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0])
+ case -2:
+ if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
+ return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
+ }
+ }
+ break;
+ case 2:
+ if (8 * sizeof(long) > 1 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
+ return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
+ }
+ }
+ break;
+ case -3:
+ if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
+ return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
+ }
+ }
+ break;
+ case 3:
+ if (8 * sizeof(long) > 2 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
+ return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
+ }
+ }
+ break;
+ case -4:
+ if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
+ return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
+ }
+ }
+ break;
+ case 4:
+ if (8 * sizeof(long) > 3 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
+ return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
+ }
+ }
+ break;
+ }
+#endif
+ if (sizeof(long) <= sizeof(long)) {
+ __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x))
+#ifdef HAVE_LONG_LONG
+ } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) {
+ __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x))
+#endif
+ }
+ }
+ {
+#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
+ PyErr_SetString(PyExc_RuntimeError,
+ "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
+#else
+ long val;
+ PyObject *v = __Pyx_PyNumber_IntOrLong(x);
+ #if PY_MAJOR_VERSION < 3
+ if (likely(v) && !PyLong_Check(v)) {
+ PyObject *tmp = v;
+ v = PyNumber_Long(tmp);
+ Py_DECREF(tmp);
+ }
+ #endif
+ if (likely(v)) {
+ int one = 1; int is_little = (int)*(unsigned char *)&one;
+ unsigned char *bytes = (unsigned char *)&val;
+ int ret = _PyLong_AsByteArray((PyLongObject *)v,
+ bytes, sizeof(val),
+ is_little, !is_unsigned);
+ Py_DECREF(v);
+ if (likely(!ret))
+ return val;
+ }
+#endif
+ return (long) -1;
+ }
+ } else {
+ long val;
+ PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
+ if (!tmp) return (long) -1;
+ val = __Pyx_PyInt_As_long(tmp);
+ Py_DECREF(tmp);
+ return val;
+ }
+raise_overflow:
+ PyErr_SetString(PyExc_OverflowError,
+ "value too large to convert to long");
+ return (long) -1;
+raise_neg_overflow:
+ PyErr_SetString(PyExc_OverflowError,
+ "can't convert negative value to long");
+ return (long) -1;
+}
+
+/* ObjectAsUCS4 */
+static Py_UCS4 __Pyx__PyObject_AsPy_UCS4_raise_error(long ival) {
+ if (ival < 0) {
+ if (!PyErr_Occurred())
+ PyErr_SetString(PyExc_OverflowError,
+ "cannot convert negative value to Py_UCS4");
+ } else {
+ PyErr_SetString(PyExc_OverflowError,
+ "value too large to convert to Py_UCS4");
+ }
+ return (Py_UCS4)-1;
+}
+static Py_UCS4 __Pyx__PyObject_AsPy_UCS4(PyObject* x) {
+ long ival;
+ ival = __Pyx_PyInt_As_long(x);
+ if (unlikely(!__Pyx_is_valid_index(ival, 1114111 + 1))) {
+ return __Pyx__PyObject_AsPy_UCS4_raise_error(ival);
+ }
+ return (Py_UCS4)ival;
+}
+
+/* CIntFromPy */
+static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) {
+ const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0;
+ const int is_unsigned = neg_one > const_zero;
+#if PY_MAJOR_VERSION < 3
+ if (likely(PyInt_Check(x))) {
+ if (sizeof(int) < sizeof(long)) {
+ __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x))
+ } else {
+ long val = PyInt_AS_LONG(x);
+ if (is_unsigned && unlikely(val < 0)) {
+ goto raise_neg_overflow;
+ }
+ return (int) val;
+ }
+ } else
+#endif
+ if (likely(PyLong_Check(x))) {
+ if (is_unsigned) {
+#if CYTHON_USE_PYLONG_INTERNALS
+ const digit* digits = ((PyLongObject*)x)->ob_digit;
+ switch (Py_SIZE(x)) {
+ case 0: return (int) 0;
+ case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0])
+ case 2:
+ if (8 * sizeof(int) > 1 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) {
+ return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]));
+ }
+ }
+ break;
+ case 3:
+ if (8 * sizeof(int) > 2 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) {
+ return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]));
+ }
+ }
+ break;
+ case 4:
+ if (8 * sizeof(int) > 3 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) {
+ return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]));
+ }
+ }
+ break;
+ }
+#endif
+#if CYTHON_COMPILING_IN_CPYTHON
+ if (unlikely(Py_SIZE(x) < 0)) {
+ goto raise_neg_overflow;
+ }
+#else
+ {
+ int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+ if (unlikely(result < 0))
+ return (int) -1;
+ if (unlikely(result == 1))
+ goto raise_neg_overflow;
+ }
+#endif
+ if (sizeof(int) <= sizeof(unsigned long)) {
+ __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x))
+#ifdef HAVE_LONG_LONG
+ } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) {
+ __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
+#endif
+ }
+ } else {
+#if CYTHON_USE_PYLONG_INTERNALS
+ const digit* digits = ((PyLongObject*)x)->ob_digit;
+ switch (Py_SIZE(x)) {
+ case 0: return (int) 0;
+ case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0]))
+ case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0])
+ case -2:
+ if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
+ return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
+ }
+ }
+ break;
+ case 2:
+ if (8 * sizeof(int) > 1 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
+ return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
+ }
+ }
+ break;
+ case -3:
+ if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
+ return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
+ }
+ }
+ break;
+ case 3:
+ if (8 * sizeof(int) > 2 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
+ return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
+ }
+ }
+ break;
+ case -4:
+ if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) {
+ return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
+ }
+ }
+ break;
+ case 4:
+ if (8 * sizeof(int) > 3 * PyLong_SHIFT) {
+ if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+ __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
+ } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) {
+ return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
+ }
+ }
+ break;
+ }
+#endif
+ if (sizeof(int) <= sizeof(long)) {
+ __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x))
+#ifdef HAVE_LONG_LONG
+ } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) {
+ __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x))
+#endif
+ }
+ }
+ {
+#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
+ PyErr_SetString(PyExc_RuntimeError,
+ "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
+#else
+ int val;
+ PyObject *v = __Pyx_PyNumber_IntOrLong(x);
+ #if PY_MAJOR_VERSION < 3
+ if (likely(v) && !PyLong_Check(v)) {
+ PyObject *tmp = v;
+ v = PyNumber_Long(tmp);
+ Py_DECREF(tmp);
+ }
+ #endif
+ if (likely(v)) {
+ int one = 1; int is_little = (int)*(unsigned char *)&one;
+ unsigned char *bytes = (unsigned char *)&val;
+ int ret = _PyLong_AsByteArray((PyLongObject *)v,
+ bytes, sizeof(val),
+ is_little, !is_unsigned);
+ Py_DECREF(v);
+ if (likely(!ret))
+ return val;
+ }
+#endif
+ return (int) -1;
+ }
+ } else {
+ int val;
+ PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
+ if (!tmp) return (int) -1;
+ val = __Pyx_PyInt_As_int(tmp);
+ Py_DECREF(tmp);
+ return val;
+ }
+raise_overflow:
+ PyErr_SetString(PyExc_OverflowError,
+ "value too large to convert to int");
+ return (int) -1;
+raise_neg_overflow:
+ PyErr_SetString(PyExc_OverflowError,
+ "can't convert negative value to int");
+ return (int) -1;
+}
+
+/* FastTypeChecks */
+#if CYTHON_COMPILING_IN_CPYTHON
+static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) {
+ while (a) {
+ a = a->tp_base;
+ if (a == b)
+ return 1;
+ }
+ return b == &PyBaseObject_Type;
+}
+static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) {
+ PyObject *mro;
+ if (a == b) return 1;
+ mro = a->tp_mro;
+ if (likely(mro)) {
+ Py_ssize_t i, n;
+ n = PyTuple_GET_SIZE(mro);
+ for (i = 0; i < n; i++) {
+ if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b)
+ return 1;
+ }
+ return 0;
+ }
+ return __Pyx_InBases(a, b);
+}
+#if PY_MAJOR_VERSION == 2
+static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) {
+ PyObject *exception, *value, *tb;
+ int res;
+ __Pyx_PyThreadState_declare
+ __Pyx_PyThreadState_assign
+ __Pyx_ErrFetch(&exception, &value, &tb);
+ res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0;
+ if (unlikely(res == -1)) {
+ PyErr_WriteUnraisable(err);
+ res = 0;
+ }
+ if (!res) {
+ res = PyObject_IsSubclass(err, exc_type2);
+ if (unlikely(res == -1)) {
+ PyErr_WriteUnraisable(err);
+ res = 0;
+ }
+ }
+ __Pyx_ErrRestore(exception, value, tb);
+ return res;
+}
+#else
+static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) {
+ int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0;
+ if (!res) {
+ res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2);
+ }
+ return res;
+}
+#endif
+static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) {
+ Py_ssize_t i, n;
+ assert(PyExceptionClass_Check(exc_type));
+ n = PyTuple_GET_SIZE(tuple);
+#if PY_MAJOR_VERSION >= 3
+ for (i=0; i<n; i++) {
+ if (exc_type == PyTuple_GET_ITEM(tuple, i)) return 1;
+ }
+#endif
+ for (i=0; i<n; i++) {
+ PyObject *t = PyTuple_GET_ITEM(tuple, i);
+ #if PY_MAJOR_VERSION < 3
+ if (likely(exc_type == t)) return 1;
+ #endif
+ if (likely(PyExceptionClass_Check(t))) {
+ if (__Pyx_inner_PyErr_GivenExceptionMatches2(exc_type, NULL, t)) return 1;
+ } else {
+ }
+ }
+ return 0;
+}
+static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject* exc_type) {
+ if (likely(err == exc_type)) return 1;
+ if (likely(PyExceptionClass_Check(err))) {
+ if (likely(PyExceptionClass_Check(exc_type))) {
+ return __Pyx_inner_PyErr_GivenExceptionMatches2(err, NULL, exc_type);
+ } else if (likely(PyTuple_Check(exc_type))) {
+ return __Pyx_PyErr_GivenExceptionMatchesTuple(err, exc_type);
+ } else {
+ }
+ }
+ return PyErr_GivenExceptionMatches(err, exc_type);
+}
+static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *exc_type1, PyObject *exc_type2) {
+ assert(PyExceptionClass_Check(exc_type1));
+ assert(PyExceptionClass_Check(exc_type2));
+ if (likely(err == exc_type1 || err == exc_type2)) return 1;
+ if (likely(PyExceptionClass_Check(err))) {
+ return __Pyx_inner_PyErr_GivenExceptionMatches2(err, exc_type1, exc_type2);
+ }
+ return (PyErr_GivenExceptionMatches(err, exc_type1) || PyErr_GivenExceptionMatches(err, exc_type2));
+}
+#endif
+
+/* CheckBinaryVersion */
+static int __Pyx_check_binary_version(void) {
+ char ctversion[4], rtversion[4];
+ PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION);
+ PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion());
+ if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) {
+ char message[200];
+ PyOS_snprintf(message, sizeof(message),
+ "compiletime version %s of module '%.100s' "
+ "does not match runtime version %s",
+ ctversion, __Pyx_MODULE_NAME, rtversion);
+ return PyErr_WarnEx(NULL, message, 1);
+ }
+ return 0;
+}
+
+/* InitStrings */
+static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
+ while (t->p) {
+ #if PY_MAJOR_VERSION < 3
+ if (t->is_unicode) {
+ *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL);
+ } else if (t->intern) {
+ *t->p = PyString_InternFromString(t->s);
+ } else {
+ *t->p = PyString_FromStringAndSize(t->s, t->n - 1);
+ }
+ #else
+ if (t->is_unicode | t->is_str) {
+ if (t->intern) {
+ *t->p = PyUnicode_InternFromString(t->s);
+ } else if (t->encoding) {
+ *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL);
+ } else {
+ *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);
+ }
+ } else {
+ *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1);
+ }
+ #endif
+ if (!*t->p)
+ return -1;
+ if (PyObject_Hash(*t->p) == -1)
+ return -1;
+ ++t;
+ }
+ return 0;
+}
+
+static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) {
+ return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str));
+}
+static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) {
+ Py_ssize_t ignore;
+ return __Pyx_PyObject_AsStringAndSize(o, &ignore);
+}
+#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT
+#if !CYTHON_PEP393_ENABLED
+static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) {
+ char* defenc_c;
+ PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL);
+ if (!defenc) return NULL;
+ defenc_c = PyBytes_AS_STRING(defenc);
+#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
+ {
+ char* end = defenc_c + PyBytes_GET_SIZE(defenc);
+ char* c;
+ for (c = defenc_c; c < end; c++) {
+ if ((unsigned char) (*c) >= 128) {
+ PyUnicode_AsASCIIString(o);
+ return NULL;
+ }
+ }
+ }
+#endif
+ *length = PyBytes_GET_SIZE(defenc);
+ return defenc_c;
+}
+#else
+static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) {
+ if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL;
+#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
+ if (likely(PyUnicode_IS_ASCII(o))) {
+ *length = PyUnicode_GET_LENGTH(o);
+ return PyUnicode_AsUTF8(o);
+ } else {
+ PyUnicode_AsASCIIString(o);
+ return NULL;
+ }
+#else
+ return PyUnicode_AsUTF8AndSize(o, length);
+#endif
+}
+#endif
+#endif
+static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) {
+#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT
+ if (
+#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
+ __Pyx_sys_getdefaultencoding_not_ascii &&
+#endif
+ PyUnicode_Check(o)) {
+ return __Pyx_PyUnicode_AsStringAndSize(o, length);
+ } else
+#endif
+#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE))
+ if (PyByteArray_Check(o)) {
+ *length = PyByteArray_GET_SIZE(o);
+ return PyByteArray_AS_STRING(o);
+ } else
+#endif
+ {
+ char* result;
+ int r = PyBytes_AsStringAndSize(o, &result, length);
+ if (unlikely(r < 0)) {
+ return NULL;
+ } else {
+ return result;
+ }
+ }
+}
+static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
+ int is_true = x == Py_True;
+ if (is_true | (x == Py_False) | (x == Py_None)) return is_true;
+ else return PyObject_IsTrue(x);
+}
+static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) {
+ int retval;
+ if (unlikely(!x)) return -1;
+ retval = __Pyx_PyObject_IsTrue(x);
+ Py_DECREF(x);
+ return retval;
+}
+static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) {
+#if PY_MAJOR_VERSION >= 3
+ if (PyLong_Check(result)) {
+ if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
+ "__int__ returned non-int (type %.200s). "
+ "The ability to return an instance of a strict subclass of int "
+ "is deprecated, and may be removed in a future version of Python.",
+ Py_TYPE(result)->tp_name)) {
+ Py_DECREF(result);
+ return NULL;
+ }
+ return result;
+ }
+#endif
+ PyErr_Format(PyExc_TypeError,
+ "__%.4s__ returned non-%.4s (type %.200s)",
+ type_name, type_name, Py_TYPE(result)->tp_name);
+ Py_DECREF(result);
+ return NULL;
+}
+static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) {
+#if CYTHON_USE_TYPE_SLOTS
+ PyNumberMethods *m;
+#endif
+ const char *name = NULL;
+ PyObject *res = NULL;
+#if PY_MAJOR_VERSION < 3
+ if (likely(PyInt_Check(x) || PyLong_Check(x)))
+#else
+ if (likely(PyLong_Check(x)))
+#endif
+ return __Pyx_NewRef(x);
+#if CYTHON_USE_TYPE_SLOTS
+ m = Py_TYPE(x)->tp_as_number;
+ #if PY_MAJOR_VERSION < 3
+ if (m && m->nb_int) {
+ name = "int";
+ res = m->nb_int(x);
+ }
+ else if (m && m->nb_long) {
+ name = "long";
+ res = m->nb_long(x);
+ }
+ #else
+ if (likely(m && m->nb_int)) {
+ name = "int";
+ res = m->nb_int(x);
+ }
+ #endif
+#else
+ if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) {
+ res = PyNumber_Int(x);
+ }
+#endif
+ if (likely(res)) {
+#if PY_MAJOR_VERSION < 3
+ if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) {
+#else
+ if (unlikely(!PyLong_CheckExact(res))) {
+#endif
+ return __Pyx_PyNumber_IntOrLongWrongResultType(res, name);
+ }
+ }
+ else if (!PyErr_Occurred()) {
+ PyErr_SetString(PyExc_TypeError,
+ "an integer is required");
+ }
+ return res;
+}
+static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
+ Py_ssize_t ival;
+ PyObject *x;
+#if PY_MAJOR_VERSION < 3
+ if (likely(PyInt_CheckExact(b))) {
+ if (sizeof(Py_ssize_t) >= sizeof(long))
+ return PyInt_AS_LONG(b);
+ else
+ return PyInt_AsSsize_t(b);
+ }
+#endif
+ if (likely(PyLong_CheckExact(b))) {
+ #if CYTHON_USE_PYLONG_INTERNALS
+ const digit* digits = ((PyLongObject*)b)->ob_digit;
+ const Py_ssize_t size = Py_SIZE(b);
+ if (likely(__Pyx_sst_abs(size) <= 1)) {
+ ival = likely(size) ? digits[0] : 0;
+ if (size == -1) ival = -ival;
+ return ival;
+ } else {
+ switch (size) {
+ case 2:
+ if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) {
+ return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+ }
+ break;
+ case -2:
+ if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) {
+ return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+ }
+ break;
+ case 3:
+ if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) {
+ return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+ }
+ break;
+ case -3:
+ if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) {
+ return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+ }
+ break;
+ case 4:
+ if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) {
+ return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+ }
+ break;
+ case -4:
+ if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) {
+ return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
+ }
+ break;
+ }
+ }
+ #endif
+ return PyLong_AsSsize_t(b);
+ }
+ x = PyNumber_Index(b);
+ if (!x) return -1;
+ ival = PyInt_AsSsize_t(x);
+ Py_DECREF(x);
+ return ival;
+}
+static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) {
+ return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False);
+}
+static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
+ return PyInt_FromSize_t(ival);
+}
+
+
+#endif /* Py_PYTHON_H */
diff --git a/third_party/python/yarl/yarl/_quoting_c.pyi b/third_party/python/yarl/yarl/_quoting_c.pyi
new file mode 100644
index 0000000000..1c8fc24ec7
--- /dev/null
+++ b/third_party/python/yarl/yarl/_quoting_c.pyi
@@ -0,0 +1,16 @@
+from typing import Optional
+
+class _Quoter:
+ def __init__(
+ self,
+ *,
+ safe: str = ...,
+ protected: str = ...,
+ qs: bool = ...,
+ requote: bool = ...
+ ) -> None: ...
+ def __call__(self, val: Optional[str] = ...) -> Optional[str]: ...
+
+class _Unquoter:
+ def __init__(self, *, unsafe: str = ..., qs: bool = ...) -> None: ...
+ def __call__(self, val: Optional[str] = ...) -> Optional[str]: ...
diff --git a/third_party/python/yarl/yarl/_quoting_c.pyx b/third_party/python/yarl/yarl/_quoting_c.pyx
new file mode 100644
index 0000000000..1b8bea2518
--- /dev/null
+++ b/third_party/python/yarl/yarl/_quoting_c.pyx
@@ -0,0 +1,371 @@
+# cython: language_level=3
+
+from libc.stdint cimport uint8_t, uint64_t
+from libc.string cimport memcpy, memset
+
+from cpython.exc cimport PyErr_NoMemory
+from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free
+from cpython.unicode cimport PyUnicode_DecodeASCII, PyUnicode_DecodeUTF8Stateful
+
+from string import ascii_letters, digits
+
+cdef str GEN_DELIMS = ":/?#[]@"
+cdef str SUB_DELIMS_WITHOUT_QS = "!$'()*,"
+cdef str SUB_DELIMS = SUB_DELIMS_WITHOUT_QS + '+?=;'
+cdef str RESERVED = GEN_DELIMS + SUB_DELIMS
+cdef str UNRESERVED = ascii_letters + digits + '-._~'
+cdef str ALLOWED = UNRESERVED + SUB_DELIMS_WITHOUT_QS
+cdef str QS = '+&=;'
+
+DEF BUF_SIZE = 8 * 1024 # 8KiB
+cdef char BUFFER[BUF_SIZE]
+
+cdef inline Py_UCS4 _to_hex(uint8_t v):
+ if v < 10:
+ return <Py_UCS4>(v+0x30) # ord('0') == 0x30
+ else:
+ return <Py_UCS4>(v+0x41-10) # ord('A') == 0x41
+
+
+cdef inline int _from_hex(Py_UCS4 v):
+ if '0' <= v <= '9':
+ return <int>(v) - 0x30 # ord('0') == 0x30
+ elif 'A' <= v <= 'F':
+ return <int>(v) - 0x41 + 10 # ord('A') == 0x41
+ elif 'a' <= v <= 'f':
+ return <int>(v) - 0x61 + 10 # ord('a') == 0x61
+ else:
+ return -1
+
+
+cdef inline int _is_lower_hex(Py_UCS4 v):
+ return 'a' <= v <= 'f'
+
+
+cdef inline Py_UCS4 _restore_ch(Py_UCS4 d1, Py_UCS4 d2):
+ cdef int digit1 = _from_hex(d1)
+ if digit1 < 0:
+ return <Py_UCS4>-1
+ cdef int digit2 = _from_hex(d2)
+ if digit2 < 0:
+ return <Py_UCS4>-1
+ return <Py_UCS4>(digit1 << 4 | digit2)
+
+
+cdef uint8_t ALLOWED_TABLE[16]
+cdef uint8_t ALLOWED_NOTQS_TABLE[16]
+
+
+cdef inline bint bit_at(uint8_t array[], uint64_t ch):
+ return array[ch >> 3] & (1 << (ch & 7))
+
+
+cdef inline void set_bit(uint8_t array[], uint64_t ch):
+ array[ch >> 3] |= (1 << (ch & 7))
+
+
+memset(ALLOWED_TABLE, 0, sizeof(ALLOWED_TABLE))
+memset(ALLOWED_NOTQS_TABLE, 0, sizeof(ALLOWED_NOTQS_TABLE))
+
+for i in range(128):
+ if chr(i) in ALLOWED:
+ set_bit(ALLOWED_TABLE, i)
+ set_bit(ALLOWED_NOTQS_TABLE, i)
+ if chr(i) in QS:
+ set_bit(ALLOWED_NOTQS_TABLE, i)
+
+# ----------------- writer ---------------------------
+
+cdef struct Writer:
+ char *buf
+ Py_ssize_t size
+ Py_ssize_t pos
+ bint changed
+
+
+cdef inline void _init_writer(Writer* writer):
+ writer.buf = &BUFFER[0]
+ writer.size = BUF_SIZE
+ writer.pos = 0
+ writer.changed = 0
+
+
+cdef inline void _release_writer(Writer* writer):
+ if writer.buf != BUFFER:
+ PyMem_Free(writer.buf)
+
+
+cdef inline int _write_char(Writer* writer, Py_UCS4 ch, bint changed):
+ cdef char * buf
+ cdef Py_ssize_t size
+
+ if writer.pos == writer.size:
+ # reallocate
+ size = writer.size + BUF_SIZE
+ if writer.buf == BUFFER:
+ buf = <char*>PyMem_Malloc(size)
+ if buf == NULL:
+ PyErr_NoMemory()
+ return -1
+ memcpy(buf, writer.buf, writer.size)
+ else:
+ buf = <char*>PyMem_Realloc(writer.buf, size)
+ if buf == NULL:
+ PyErr_NoMemory()
+ return -1
+ writer.buf = buf
+ writer.size = size
+ writer.buf[writer.pos] = <char>ch
+ writer.pos += 1
+ writer.changed |= changed
+ return 0
+
+
+cdef inline int _write_pct(Writer* writer, uint8_t ch, bint changed):
+ if _write_char(writer, '%', changed) < 0:
+ return -1
+ if _write_char(writer, _to_hex(<uint8_t>ch >> 4), changed) < 0:
+ return -1
+ return _write_char(writer, _to_hex(<uint8_t>ch & 0x0f), changed)
+
+
+cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol):
+ cdef uint64_t utf = <uint64_t> symbol
+
+ if utf < 0x80:
+ return _write_pct(writer, <uint8_t>utf, True)
+ elif utf < 0x800:
+ if _write_pct(writer, <uint8_t>(0xc0 | (utf >> 6)), True) < 0:
+ return -1
+ return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True)
+ elif 0xD800 <= utf <= 0xDFFF:
+ # surogate pair, ignored
+ return 0
+ elif utf < 0x10000:
+ if _write_pct(writer, <uint8_t>(0xe0 | (utf >> 12)), True) < 0:
+ return -1
+ if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 6) & 0x3f)),
+ True) < 0:
+ return -1
+ return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True)
+ elif utf > 0x10FFFF:
+ # symbol is too large
+ return 0
+ else:
+ if _write_pct(writer, <uint8_t>(0xf0 | (utf >> 18)), True) < 0:
+ return -1
+ if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 12) & 0x3f)),
+ True) < 0:
+ return -1
+ if _write_pct(writer, <uint8_t>(0x80 | ((utf >> 6) & 0x3f)),
+ True) < 0:
+ return -1
+ return _write_pct(writer, <uint8_t>(0x80 | (utf & 0x3f)), True)
+
+
+# --------------------- end writer --------------------------
+
+
+cdef class _Quoter:
+ cdef bint _qs
+ cdef bint _requote
+
+ cdef uint8_t _safe_table[16]
+ cdef uint8_t _protected_table[16]
+
+ def __init__(
+ self, *, str safe='', str protected='', bint qs=False, bint requote=True,
+ ):
+ cdef Py_UCS4 ch
+
+ self._qs = qs
+ self._requote = requote
+
+ if not self._qs:
+ memcpy(self._safe_table,
+ ALLOWED_NOTQS_TABLE,
+ sizeof(self._safe_table))
+ else:
+ memcpy(self._safe_table,
+ ALLOWED_TABLE,
+ sizeof(self._safe_table))
+ for ch in safe:
+ if ord(ch) > 127:
+ raise ValueError("Only safe symbols with ORD < 128 are allowed")
+ set_bit(self._safe_table, ch)
+
+ memset(self._protected_table, 0, sizeof(self._protected_table))
+ for ch in protected:
+ if ord(ch) > 127:
+ raise ValueError("Only safe symbols with ORD < 128 are allowed")
+ set_bit(self._safe_table, ch)
+ set_bit(self._protected_table, ch)
+
+ def __call__(self, val):
+ cdef Writer writer
+ if val is None:
+ return None
+ if type(val) is not str:
+ if isinstance(val, str):
+ # derived from str
+ val = str(val)
+ else:
+ raise TypeError("Argument should be str")
+ _init_writer(&writer)
+ try:
+ return self._do_quote(<str>val, &writer)
+ finally:
+ _release_writer(&writer)
+
+ cdef str _do_quote(self, str val, Writer *writer):
+ cdef Py_UCS4 ch
+ cdef int changed
+ cdef int idx = 0
+ cdef int length = len(val)
+
+ while idx < length:
+ ch = val[idx]
+ idx += 1
+ if ch == '%' and self._requote and idx <= length - 2:
+ ch = _restore_ch(val[idx], val[idx + 1])
+ if ch != <Py_UCS4>-1:
+ idx += 2
+ if ch < 128:
+ if bit_at(self._protected_table, ch):
+ if _write_pct(writer, ch, True) < 0:
+ raise
+ continue
+
+ if bit_at(self._safe_table, ch):
+ if _write_char(writer, ch, True) < 0:
+ raise
+ continue
+
+ changed = (_is_lower_hex(val[idx - 2]) or
+ _is_lower_hex(val[idx - 1]))
+ if _write_pct(writer, ch, changed) < 0:
+ raise
+ continue
+ else:
+ ch = '%'
+
+ if self._write(writer, ch) < 0:
+ raise
+
+ if not writer.changed:
+ return val
+ else:
+ return PyUnicode_DecodeASCII(writer.buf, writer.pos, "strict")
+
+ cdef inline int _write(self, Writer *writer, Py_UCS4 ch):
+ if self._qs:
+ if ch == ' ':
+ return _write_char(writer, '+', True)
+
+ if ch < 128 and bit_at(self._safe_table, ch):
+ return _write_char(writer, ch, False)
+
+ return _write_utf8(writer, ch)
+
+
+cdef class _Unquoter:
+ cdef str _unsafe
+ cdef bint _qs
+ cdef _Quoter _quoter
+ cdef _Quoter _qs_quoter
+
+ def __init__(self, *, unsafe='', qs=False):
+ self._unsafe = unsafe
+ self._qs = qs
+ self._quoter = _Quoter()
+ self._qs_quoter = _Quoter(qs=True)
+
+ def __call__(self, val):
+ if val is None:
+ return None
+ if type(val) is not str:
+ if isinstance(val, str):
+ # derived from str
+ val = str(val)
+ else:
+ raise TypeError("Argument should be str")
+ return self._do_unquote(<str>val)
+
+ cdef str _do_unquote(self, str val):
+ if len(val) == 0:
+ return val
+ cdef list ret = []
+ cdef char buffer[4]
+ cdef Py_ssize_t buflen = 0
+ cdef Py_ssize_t consumed
+ cdef str unquoted
+ cdef Py_UCS4 ch = 0
+ cdef Py_ssize_t idx = 0
+ cdef Py_ssize_t length = len(val)
+ cdef Py_ssize_t start_pct
+
+ while idx < length:
+ ch = val[idx]
+ idx += 1
+ if ch == '%' and idx <= length - 2:
+ ch = _restore_ch(val[idx], val[idx + 1])
+ if ch != <Py_UCS4>-1:
+ idx += 2
+ assert buflen < 4
+ buffer[buflen] = ch
+ buflen += 1
+ try:
+ unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen,
+ NULL, &consumed)
+ except UnicodeDecodeError:
+ start_pct = idx - buflen * 3
+ buffer[0] = ch
+ buflen = 1
+ ret.append(val[start_pct : idx - 3])
+ try:
+ unquoted = PyUnicode_DecodeUTF8Stateful(buffer, buflen,
+ NULL, &consumed)
+ except UnicodeDecodeError:
+ buflen = 0
+ ret.append(val[idx - 3 : idx])
+ continue
+ if not unquoted:
+ assert consumed == 0
+ continue
+ assert consumed == buflen
+ buflen = 0
+ if self._qs and unquoted in '+=&;':
+ ret.append(self._qs_quoter(unquoted))
+ elif unquoted in self._unsafe:
+ ret.append(self._quoter(unquoted))
+ else:
+ ret.append(unquoted)
+ continue
+ else:
+ ch = '%'
+
+ if buflen:
+ start_pct = idx - 1 - buflen * 3
+ ret.append(val[start_pct : idx - 1])
+ buflen = 0
+
+ if ch == '+':
+ if not self._qs or ch in self._unsafe:
+ ret.append('+')
+ else:
+ ret.append(' ')
+ continue
+
+ if ch in self._unsafe:
+ ret.append('%')
+ h = hex(ord(ch)).upper()[2:]
+ for ch in h:
+ ret.append(ch)
+ continue
+
+ ret.append(ch)
+
+ if buflen:
+ ret.append(val[length - buflen * 3 : length])
+
+ return ''.join(ret)
diff --git a/third_party/python/yarl/yarl/_quoting_py.py b/third_party/python/yarl/yarl/_quoting_py.py
new file mode 100644
index 0000000000..d6f33e15bd
--- /dev/null
+++ b/third_party/python/yarl/yarl/_quoting_py.py
@@ -0,0 +1,198 @@
+import codecs
+import re
+from string import ascii_letters, ascii_lowercase, digits
+from typing import Optional, cast
+
+
+BASCII_LOWERCASE = ascii_lowercase.encode("ascii")
+BPCT_ALLOWED = {"%{:02X}".format(i).encode("ascii") for i in range(256)}
+GEN_DELIMS = ":/?#[]@"
+SUB_DELIMS_WITHOUT_QS = "!$'()*,"
+SUB_DELIMS = SUB_DELIMS_WITHOUT_QS + "+&=;"
+RESERVED = GEN_DELIMS + SUB_DELIMS
+UNRESERVED = ascii_letters + digits + "-._~"
+ALLOWED = UNRESERVED + SUB_DELIMS_WITHOUT_QS
+
+
+_IS_HEX = re.compile(b"[A-Z0-9][A-Z0-9]")
+_IS_HEX_STR = re.compile("[A-Fa-f0-9][A-Fa-f0-9]")
+
+utf8_decoder = codecs.getincrementaldecoder("utf-8")
+
+
+class _Quoter:
+ def __init__(
+ self,
+ *,
+ safe: str = "",
+ protected: str = "",
+ qs: bool = False,
+ requote: bool = True
+ ) -> None:
+ self._safe = safe
+ self._protected = protected
+ self._qs = qs
+ self._requote = requote
+
+ def __call__(self, val: Optional[str]) -> Optional[str]:
+ if val is None:
+ return None
+ if not isinstance(val, str):
+ raise TypeError("Argument should be str")
+ if not val:
+ return ""
+ bval = cast(str, val).encode("utf8", errors="ignore")
+ ret = bytearray()
+ pct = bytearray()
+ safe = self._safe
+ safe += ALLOWED
+ if not self._qs:
+ safe += "+&=;"
+ safe += self._protected
+ bsafe = safe.encode("ascii")
+ idx = 0
+ while idx < len(bval):
+ ch = bval[idx]
+ idx += 1
+
+ if pct:
+ if ch in BASCII_LOWERCASE:
+ ch = ch - 32 # convert to uppercase
+ pct.append(ch)
+ if len(pct) == 3: # pragma: no branch # peephole optimizer
+ buf = pct[1:]
+ if not _IS_HEX.match(buf):
+ ret.extend(b"%25")
+ pct.clear()
+ idx -= 2
+ continue
+ try:
+ unquoted = chr(int(pct[1:].decode("ascii"), base=16))
+ except ValueError:
+ ret.extend(b"%25")
+ pct.clear()
+ idx -= 2
+ continue
+
+ if unquoted in self._protected:
+ ret.extend(pct)
+ elif unquoted in safe:
+ ret.append(ord(unquoted))
+ else:
+ ret.extend(pct)
+ pct.clear()
+
+ # special case, if we have only one char after "%"
+ elif len(pct) == 2 and idx == len(bval):
+ ret.extend(b"%25")
+ pct.clear()
+ idx -= 1
+
+ continue
+
+ elif ch == ord("%") and self._requote:
+ pct.clear()
+ pct.append(ch)
+
+ # special case if "%" is last char
+ if idx == len(bval):
+ ret.extend(b"%25")
+
+ continue
+
+ if self._qs:
+ if ch == ord(" "):
+ ret.append(ord("+"))
+ continue
+ if ch in bsafe:
+ ret.append(ch)
+ continue
+
+ ret.extend(("%{:02X}".format(ch)).encode("ascii"))
+
+ ret2 = ret.decode("ascii")
+ if ret2 == val:
+ return val
+ return ret2
+
+
+class _Unquoter:
+ def __init__(self, *, unsafe: str = "", qs: bool = False) -> None:
+ self._unsafe = unsafe
+ self._qs = qs
+ self._quoter = _Quoter()
+ self._qs_quoter = _Quoter(qs=True)
+
+ def __call__(self, val: Optional[str]) -> Optional[str]:
+ if val is None:
+ return None
+ if not isinstance(val, str):
+ raise TypeError("Argument should be str")
+ if not val:
+ return ""
+ decoder = cast(codecs.BufferedIncrementalDecoder, utf8_decoder())
+ ret = []
+ idx = 0
+ while idx < len(val):
+ ch = val[idx]
+ idx += 1
+ if ch == "%" and idx <= len(val) - 2:
+ pct = val[idx : idx + 2]
+ if _IS_HEX_STR.fullmatch(pct):
+ b = bytes([int(pct, base=16)])
+ idx += 2
+ try:
+ unquoted = decoder.decode(b)
+ except UnicodeDecodeError:
+ start_pct = idx - 3 - len(decoder.buffer) * 3
+ ret.append(val[start_pct : idx - 3])
+ decoder.reset()
+ try:
+ unquoted = decoder.decode(b)
+ except UnicodeDecodeError:
+ ret.append(val[idx - 3 : idx])
+ continue
+ if not unquoted:
+ continue
+ if self._qs and unquoted in "+=&;":
+ to_add = self._qs_quoter(unquoted)
+ if to_add is None: # pragma: no cover
+ raise RuntimeError("Cannot quote None")
+ ret.append(to_add)
+ elif unquoted in self._unsafe:
+ to_add = self._quoter(unquoted)
+ if to_add is None: # pragma: no cover
+ raise RuntimeError("Cannot quote None")
+ ret.append(to_add)
+ else:
+ ret.append(unquoted)
+ continue
+
+ if decoder.buffer:
+ start_pct = idx - 1 - len(decoder.buffer) * 3
+ ret.append(val[start_pct : idx - 1])
+ decoder.reset()
+
+ if ch == "+":
+ if not self._qs or ch in self._unsafe:
+ ret.append("+")
+ else:
+ ret.append(" ")
+ continue
+
+ if ch in self._unsafe:
+ ret.append("%")
+ h = hex(ord(ch)).upper()[2:]
+ for ch in h:
+ ret.append(ch)
+ continue
+
+ ret.append(ch)
+
+ if decoder.buffer:
+ ret.append(val[-len(decoder.buffer) * 3 :])
+
+ ret2 = "".join(ret)
+ if ret2 == val:
+ return val
+ return ret2
diff --git a/third_party/python/yarl/yarl/_url.py b/third_party/python/yarl/yarl/_url.py
new file mode 100644
index 0000000000..99c424514a
--- /dev/null
+++ b/third_party/python/yarl/yarl/_url.py
@@ -0,0 +1,1144 @@
+import functools
+import sys
+import warnings
+from collections.abc import Mapping, Sequence
+from ipaddress import ip_address
+from urllib.parse import SplitResult, parse_qsl, urljoin, urlsplit, urlunsplit, quote
+
+from multidict import MultiDict, MultiDictProxy
+import idna
+
+import math
+
+
+from ._quoting import _Quoter, _Unquoter
+
+
+DEFAULT_PORTS = {"http": 80, "https": 443, "ws": 80, "wss": 443}
+
+sentinel = object()
+
+
+def rewrite_module(obj: object) -> object:
+ obj.__module__ = "yarl"
+ return obj
+
+
+class cached_property:
+ """Use as a class method decorator. It operates almost exactly like
+ the Python `@property` decorator, but it puts the result of the
+ method it decorates into the instance dict after the first call,
+ effectively replacing the function it decorates with an instance
+ variable. It is, in Python parlance, a data descriptor.
+
+ """
+
+ def __init__(self, wrapped):
+ self.wrapped = wrapped
+ try:
+ self.__doc__ = wrapped.__doc__
+ except AttributeError: # pragma: no cover
+ self.__doc__ = ""
+ self.name = wrapped.__name__
+
+ def __get__(self, inst, owner, _sentinel=sentinel):
+ if inst is None:
+ return self
+ val = inst._cache.get(self.name, _sentinel)
+ if val is not _sentinel:
+ return val
+ val = self.wrapped(inst)
+ inst._cache[self.name] = val
+ return val
+
+ def __set__(self, inst, value):
+ raise AttributeError("cached property is read-only")
+
+
+@rewrite_module
+class URL:
+ # Don't derive from str
+ # follow pathlib.Path design
+ # probably URL will not suffer from pathlib problems:
+ # it's intended for libraries like aiohttp,
+ # not to be passed into standard library functions like os.open etc.
+
+ # URL grammar (RFC 3986)
+ # pct-encoded = "%" HEXDIG HEXDIG
+ # reserved = gen-delims / sub-delims
+ # gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
+ # sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
+ # / "*" / "+" / "," / ";" / "="
+ # unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
+ # URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
+ # hier-part = "//" authority path-abempty
+ # / path-absolute
+ # / path-rootless
+ # / path-empty
+ # scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
+ # authority = [ userinfo "@" ] host [ ":" port ]
+ # userinfo = *( unreserved / pct-encoded / sub-delims / ":" )
+ # host = IP-literal / IPv4address / reg-name
+ # IP-literal = "[" ( IPv6address / IPvFuture ) "]"
+ # IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )
+ # IPv6address = 6( h16 ":" ) ls32
+ # / "::" 5( h16 ":" ) ls32
+ # / [ h16 ] "::" 4( h16 ":" ) ls32
+ # / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
+ # / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
+ # / [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32
+ # / [ *4( h16 ":" ) h16 ] "::" ls32
+ # / [ *5( h16 ":" ) h16 ] "::" h16
+ # / [ *6( h16 ":" ) h16 ] "::"
+ # ls32 = ( h16 ":" h16 ) / IPv4address
+ # ; least-significant 32 bits of address
+ # h16 = 1*4HEXDIG
+ # ; 16 bits of address represented in hexadecimal
+ # IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
+ # dec-octet = DIGIT ; 0-9
+ # / %x31-39 DIGIT ; 10-99
+ # / "1" 2DIGIT ; 100-199
+ # / "2" %x30-34 DIGIT ; 200-249
+ # / "25" %x30-35 ; 250-255
+ # reg-name = *( unreserved / pct-encoded / sub-delims )
+ # port = *DIGIT
+ # path = path-abempty ; begins with "/" or is empty
+ # / path-absolute ; begins with "/" but not "//"
+ # / path-noscheme ; begins with a non-colon segment
+ # / path-rootless ; begins with a segment
+ # / path-empty ; zero characters
+ # path-abempty = *( "/" segment )
+ # path-absolute = "/" [ segment-nz *( "/" segment ) ]
+ # path-noscheme = segment-nz-nc *( "/" segment )
+ # path-rootless = segment-nz *( "/" segment )
+ # path-empty = 0<pchar>
+ # segment = *pchar
+ # segment-nz = 1*pchar
+ # segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
+ # ; non-zero-length segment without any colon ":"
+ # pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
+ # query = *( pchar / "/" / "?" )
+ # fragment = *( pchar / "/" / "?" )
+ # URI-reference = URI / relative-ref
+ # relative-ref = relative-part [ "?" query ] [ "#" fragment ]
+ # relative-part = "//" authority path-abempty
+ # / path-absolute
+ # / path-noscheme
+ # / path-empty
+ # absolute-URI = scheme ":" hier-part [ "?" query ]
+ __slots__ = ("_cache", "_val")
+
+ _QUOTER = _Quoter(requote=False)
+ _REQUOTER = _Quoter()
+ _PATH_QUOTER = _Quoter(safe="@:", protected="/+", requote=False)
+ _PATH_REQUOTER = _Quoter(safe="@:", protected="/+")
+ _QUERY_QUOTER = _Quoter(safe="?/:@", protected="=+&;", qs=True, requote=False)
+ _QUERY_REQUOTER = _Quoter(safe="?/:@", protected="=+&;", qs=True)
+ _QUERY_PART_QUOTER = _Quoter(safe="?/:@", qs=True, requote=False)
+ _FRAGMENT_QUOTER = _Quoter(safe="?/:@", requote=False)
+ _FRAGMENT_REQUOTER = _Quoter(safe="?/:@")
+
+ _UNQUOTER = _Unquoter()
+ _PATH_UNQUOTER = _Unquoter(unsafe="+")
+ _QS_UNQUOTER = _Unquoter(qs=True)
+
+ def __new__(cls, val="", *, encoded=False, strict=None):
+ if strict is not None: # pragma: no cover
+ warnings.warn("strict parameter is ignored")
+ if type(val) is cls:
+ return val
+ if type(val) is str:
+ val = urlsplit(val)
+ elif type(val) is SplitResult:
+ if not encoded:
+ raise ValueError("Cannot apply decoding to SplitResult")
+ elif isinstance(val, str):
+ val = urlsplit(str(val))
+ else:
+ raise TypeError("Constructor parameter should be str")
+
+ if not encoded:
+ if not val[1]: # netloc
+ netloc = ""
+ host = ""
+ else:
+ host = val.hostname
+ if host is None:
+ raise ValueError("Invalid URL: host is required for absolute urls")
+
+ try:
+ port = val.port
+ except ValueError as e:
+ raise ValueError(
+ "Invalid URL: port can't be converted to integer"
+ ) from e
+
+ netloc = cls._make_netloc(
+ val.username, val.password, host, port, encode=True, requote=True
+ )
+ path = cls._PATH_REQUOTER(val[2])
+ if netloc:
+ path = cls._normalize_path(path)
+
+ cls._validate_authority_uri_abs_path(host=host, path=path)
+ query = cls._QUERY_REQUOTER(val[3])
+ fragment = cls._FRAGMENT_REQUOTER(val[4])
+ val = SplitResult(val[0], netloc, path, query, fragment)
+
+ self = object.__new__(cls)
+ self._val = val
+ self._cache = {}
+ return self
+
+ @classmethod
+ def build(
+ cls,
+ *,
+ scheme="",
+ authority="",
+ user=None,
+ password=None,
+ host="",
+ port=None,
+ path="",
+ query=None,
+ query_string="",
+ fragment="",
+ encoded=False
+ ):
+ """Creates and returns a new URL"""
+
+ if authority and (user or password or host or port):
+ raise ValueError(
+ 'Can\'t mix "authority" with "user", "password", "host" or "port".'
+ )
+ if port and not host:
+ raise ValueError('Can\'t build URL with "port" but without "host".')
+ if query and query_string:
+ raise ValueError('Only one of "query" or "query_string" should be passed')
+ if (
+ scheme is None
+ or authority is None
+ or path is None
+ or query_string is None
+ or fragment is None
+ ):
+ raise TypeError(
+ 'NoneType is illegal for "scheme", "authority", "path", '
+ '"query_string", and "fragment" args, use empty string instead.'
+ )
+
+ if authority:
+ if encoded:
+ netloc = authority
+ else:
+ tmp = SplitResult("", authority, "", "", "")
+ netloc = cls._make_netloc(
+ tmp.username, tmp.password, tmp.hostname, tmp.port, encode=True
+ )
+ elif not user and not password and not host and not port:
+ netloc = ""
+ else:
+ netloc = cls._make_netloc(
+ user, password, host, port, encode=not encoded, encode_host=not encoded
+ )
+ if not encoded:
+ path = cls._PATH_QUOTER(path)
+ if netloc:
+ path = cls._normalize_path(path)
+
+ cls._validate_authority_uri_abs_path(host=host, path=path)
+ query_string = cls._QUERY_QUOTER(query_string)
+ fragment = cls._FRAGMENT_QUOTER(fragment)
+
+ url = cls(
+ SplitResult(scheme, netloc, path, query_string, fragment), encoded=True
+ )
+
+ if query:
+ return url.with_query(query)
+ else:
+ return url
+
+ def __init_subclass__(cls):
+ raise TypeError("Inheritance a class {!r} from URL is forbidden".format(cls))
+
+ def __str__(self):
+ val = self._val
+ if not val.path and self.is_absolute() and (val.query or val.fragment):
+ val = val._replace(path="/")
+ return urlunsplit(val)
+
+ def __repr__(self):
+ return "{}('{}')".format(self.__class__.__name__, str(self))
+
+ def __eq__(self, other):
+ if not type(other) is URL:
+ return NotImplemented
+
+ val1 = self._val
+ if not val1.path and self.is_absolute():
+ val1 = val1._replace(path="/")
+
+ val2 = other._val
+ if not val2.path and other.is_absolute():
+ val2 = val2._replace(path="/")
+
+ return val1 == val2
+
+ def __hash__(self):
+ ret = self._cache.get("hash")
+ if ret is None:
+ val = self._val
+ if not val.path and self.is_absolute():
+ val = val._replace(path="/")
+ ret = self._cache["hash"] = hash(val)
+ return ret
+
+ def __le__(self, other):
+ if not type(other) is URL:
+ return NotImplemented
+ return self._val <= other._val
+
+ def __lt__(self, other):
+ if not type(other) is URL:
+ return NotImplemented
+ return self._val < other._val
+
+ def __ge__(self, other):
+ if not type(other) is URL:
+ return NotImplemented
+ return self._val >= other._val
+
+ def __gt__(self, other):
+ if not type(other) is URL:
+ return NotImplemented
+ return self._val > other._val
+
+ def __truediv__(self, name):
+ name = self._PATH_QUOTER(name)
+ if name.startswith("/"):
+ raise ValueError(
+ "Appending path {!r} starting from slash is forbidden".format(name)
+ )
+ path = self._val.path
+ if path == "/":
+ new_path = "/" + name
+ elif not path and not self.is_absolute():
+ new_path = name
+ else:
+ parts = path.rstrip("/").split("/")
+ parts.append(name)
+ new_path = "/".join(parts)
+ if self.is_absolute():
+ new_path = self._normalize_path(new_path)
+ return URL(
+ self._val._replace(path=new_path, query="", fragment=""), encoded=True
+ )
+
+ def __mod__(self, query):
+ return self.update_query(query)
+
+ def __bool__(self) -> bool:
+ return bool(
+ self._val.netloc or self._val.path or self._val.query or self._val.fragment
+ )
+
+ def __getstate__(self):
+ return (self._val,)
+
+ def __setstate__(self, state):
+ if state[0] is None and isinstance(state[1], dict):
+ # default style pickle
+ self._val = state[1]["_val"]
+ else:
+ self._val, *unused = state
+ self._cache = {}
+
+ def is_absolute(self):
+ """A check for absolute URLs.
+
+ Return True for absolute ones (having scheme or starting
+ with //), False otherwise.
+
+ """
+ return self.raw_host is not None
+
+ def is_default_port(self):
+ """A check for default port.
+
+ Return True if port is default for specified scheme,
+ e.g. 'http://python.org' or 'http://python.org:80', False
+ otherwise.
+
+ """
+ if self.port is None:
+ return False
+ default = DEFAULT_PORTS.get(self.scheme)
+ if default is None:
+ return False
+ return self.port == default
+
+ def origin(self):
+ """Return an URL with scheme, host and port parts only.
+
+ user, password, path, query and fragment are removed.
+
+ """
+ # TODO: add a keyword-only option for keeping user/pass maybe?
+ if not self.is_absolute():
+ raise ValueError("URL should be absolute")
+ if not self._val.scheme:
+ raise ValueError("URL should have scheme")
+ v = self._val
+ netloc = self._make_netloc(None, None, v.hostname, v.port)
+ val = v._replace(netloc=netloc, path="", query="", fragment="")
+ return URL(val, encoded=True)
+
+ def relative(self):
+ """Return a relative part of the URL.
+
+ scheme, user, password, host and port are removed.
+
+ """
+ if not self.is_absolute():
+ raise ValueError("URL should be absolute")
+ val = self._val._replace(scheme="", netloc="")
+ return URL(val, encoded=True)
+
+ @property
+ def scheme(self):
+ """Scheme for absolute URLs.
+
+ Empty string for relative URLs or URLs starting with //
+
+ """
+ return self._val.scheme
+
+ @property
+ def raw_authority(self):
+ """Encoded authority part of URL.
+
+ Empty string for relative URLs.
+
+ """
+ return self._val.netloc
+
+ @cached_property
+ def authority(self):
+ """Decoded authority part of URL.
+
+ Empty string for relative URLs.
+
+ """
+ return self._make_netloc(
+ self.user, self.password, self.host, self.port, encode_host=False
+ )
+
+ @property
+ def raw_user(self):
+ """Encoded user part of URL.
+
+ None if user is missing.
+
+ """
+ # not .username
+ ret = self._val.username
+ if not ret:
+ return None
+ return ret
+
+ @cached_property
+ def user(self):
+ """Decoded user part of URL.
+
+ None if user is missing.
+
+ """
+ return self._UNQUOTER(self.raw_user)
+
+ @property
+ def raw_password(self):
+ """Encoded password part of URL.
+
+ None if password is missing.
+
+ """
+ return self._val.password
+
+ @cached_property
+ def password(self):
+ """Decoded password part of URL.
+
+ None if password is missing.
+
+ """
+ return self._UNQUOTER(self.raw_password)
+
+ @property
+ def raw_host(self):
+ """Encoded host part of URL.
+
+ None for relative URLs.
+
+ """
+ # Use host instead of hostname for sake of shortness
+ # May add .hostname prop later
+ return self._val.hostname
+
+ @cached_property
+ def host(self):
+ """Decoded host part of URL.
+
+ None for relative URLs.
+
+ """
+ raw = self.raw_host
+ if raw is None:
+ return None
+ if "%" in raw:
+ # Hack for scoped IPv6 addresses like
+ # fe80::2%Проверка
+ # presence of '%' sign means only IPv6 address, so idna is useless.
+ return raw
+ return _idna_decode(raw)
+
+ @property
+ def port(self):
+ """Port part of URL, with scheme-based fallback.
+
+ None for relative URLs or URLs without explicit port and
+ scheme without default port substitution.
+
+ """
+ return self._val.port or DEFAULT_PORTS.get(self._val.scheme)
+
+ @property
+ def explicit_port(self):
+ """Port part of URL, without scheme-based fallback.
+
+ None for relative URLs or URLs without explicit port.
+
+ """
+ return self._val.port
+
+ @property
+ def raw_path(self):
+ """Encoded path of URL.
+
+ / for absolute URLs without path part.
+
+ """
+ ret = self._val.path
+ if not ret and self.is_absolute():
+ ret = "/"
+ return ret
+
+ @cached_property
+ def path(self):
+ """Decoded path of URL.
+
+ / for absolute URLs without path part.
+
+ """
+ return self._PATH_UNQUOTER(self.raw_path)
+
+ @cached_property
+ def query(self):
+ """A MultiDictProxy representing parsed query parameters in decoded
+ representation.
+
+ Empty value if URL has no query part.
+
+ """
+ ret = MultiDict(parse_qsl(self.raw_query_string, keep_blank_values=True))
+ return MultiDictProxy(ret)
+
+ @property
+ def raw_query_string(self):
+ """Encoded query part of URL.
+
+ Empty string if query is missing.
+
+ """
+ return self._val.query
+
+ @cached_property
+ def query_string(self):
+ """Decoded query part of URL.
+
+ Empty string if query is missing.
+
+ """
+ return self._QS_UNQUOTER(self.raw_query_string)
+
+ @cached_property
+ def path_qs(self):
+ """Decoded path of URL with query."""
+ if not self.query_string:
+ return self.path
+ return "{}?{}".format(self.path, self.query_string)
+
+ @cached_property
+ def raw_path_qs(self):
+ """Encoded path of URL with query."""
+ if not self.raw_query_string:
+ return self.raw_path
+ return "{}?{}".format(self.raw_path, self.raw_query_string)
+
+ @property
+ def raw_fragment(self):
+ """Encoded fragment part of URL.
+
+ Empty string if fragment is missing.
+
+ """
+ return self._val.fragment
+
+ @cached_property
+ def fragment(self):
+ """Decoded fragment part of URL.
+
+ Empty string if fragment is missing.
+
+ """
+ return self._UNQUOTER(self.raw_fragment)
+
+ @cached_property
+ def raw_parts(self):
+ """A tuple containing encoded *path* parts.
+
+ ('/',) for absolute URLs if *path* is missing.
+
+ """
+ path = self._val.path
+ if self.is_absolute():
+ if not path:
+ parts = ["/"]
+ else:
+ parts = ["/"] + path[1:].split("/")
+ else:
+ if path.startswith("/"):
+ parts = ["/"] + path[1:].split("/")
+ else:
+ parts = path.split("/")
+ return tuple(parts)
+
+ @cached_property
+ def parts(self):
+ """A tuple containing decoded *path* parts.
+
+ ('/',) for absolute URLs if *path* is missing.
+
+ """
+ return tuple(self._UNQUOTER(part) for part in self.raw_parts)
+
+ @cached_property
+ def parent(self):
+ """A new URL with last part of path removed and cleaned up query and
+ fragment.
+
+ """
+ path = self.raw_path
+ if not path or path == "/":
+ if self.raw_fragment or self.raw_query_string:
+ return URL(self._val._replace(query="", fragment=""), encoded=True)
+ return self
+ parts = path.split("/")
+ val = self._val._replace(path="/".join(parts[:-1]), query="", fragment="")
+ return URL(val, encoded=True)
+
+ @cached_property
+ def raw_name(self):
+ """The last part of raw_parts."""
+ parts = self.raw_parts
+ if self.is_absolute():
+ parts = parts[1:]
+ if not parts:
+ return ""
+ else:
+ return parts[-1]
+ else:
+ return parts[-1]
+
+ @cached_property
+ def name(self):
+ """The last part of parts."""
+ return self._UNQUOTER(self.raw_name)
+
+ @staticmethod
+ def _validate_authority_uri_abs_path(host, path):
+ """Ensure that path in URL with authority starts with a leading slash.
+
+ Raise ValueError if not.
+ """
+ if len(host) > 0 and len(path) > 0 and not path.startswith("/"):
+ raise ValueError(
+ "Path in a URL with authority should start with a slash ('/') if set"
+ )
+
+ @classmethod
+ def _normalize_path(cls, path):
+ # Drop '.' and '..' from path
+
+ segments = path.split("/")
+ resolved_path = []
+
+ for seg in segments:
+ if seg == "..":
+ try:
+ resolved_path.pop()
+ except IndexError:
+ # ignore any .. segments that would otherwise cause an
+ # IndexError when popped from resolved_path if
+ # resolving for rfc3986
+ pass
+ elif seg == ".":
+ continue
+ else:
+ resolved_path.append(seg)
+
+ if segments[-1] in (".", ".."):
+ # do some post-processing here.
+ # if the last segment was a relative dir,
+ # then we need to append the trailing '/'
+ resolved_path.append("")
+
+ return "/".join(resolved_path)
+
+ if sys.version_info >= (3, 7):
+
+ @classmethod
+ def _encode_host(cls, host, human=False):
+ try:
+ ip, sep, zone = host.partition("%")
+ ip = ip_address(ip)
+ except ValueError:
+ host = host.lower()
+ # IDNA encoding is slow,
+ # skip it for ASCII-only strings
+ # Don't move the check into _idna_encode() helper
+ # to reduce the cache size
+ if human or host.isascii():
+ return host
+ host = _idna_encode(host)
+ else:
+ host = ip.compressed
+ if sep:
+ host += "%" + zone
+ if ip.version == 6:
+ host = "[" + host + "]"
+ return host
+
+ else:
+ # work around for missing str.isascii() in Python <= 3.6
+ @classmethod
+ def _encode_host(cls, host, human=False):
+ try:
+ ip, sep, zone = host.partition("%")
+ ip = ip_address(ip)
+ except ValueError:
+ host = host.lower()
+ if human:
+ return host
+
+ for char in host:
+ if char > "\x7f":
+ break
+ else:
+ return host
+ host = _idna_encode(host)
+ else:
+ host = ip.compressed
+ if sep:
+ host += "%" + zone
+ if ip.version == 6:
+ host = "[" + host + "]"
+ return host
+
+ @classmethod
+ def _make_netloc(
+ cls, user, password, host, port, encode=False, encode_host=True, requote=False
+ ):
+ quoter = cls._REQUOTER if requote else cls._QUOTER
+ if encode_host:
+ ret = cls._encode_host(host)
+ else:
+ ret = host
+ if port:
+ ret = ret + ":" + str(port)
+ if password is not None:
+ if not user:
+ user = ""
+ else:
+ if encode:
+ user = quoter(user)
+ if encode:
+ password = quoter(password)
+ user = user + ":" + password
+ elif user and encode:
+ user = quoter(user)
+ if user:
+ ret = user + "@" + ret
+ return ret
+
+ def with_scheme(self, scheme):
+ """Return a new URL with scheme replaced."""
+ # N.B. doesn't cleanup query/fragment
+ if not isinstance(scheme, str):
+ raise TypeError("Invalid scheme type")
+ if not self.is_absolute():
+ raise ValueError("scheme replacement is not allowed for relative URLs")
+ return URL(self._val._replace(scheme=scheme.lower()), encoded=True)
+
+ def with_user(self, user):
+ """Return a new URL with user replaced.
+
+ Autoencode user if needed.
+
+ Clear user/password if user is None.
+
+ """
+ # N.B. doesn't cleanup query/fragment
+ val = self._val
+ if user is None:
+ password = None
+ elif isinstance(user, str):
+ user = self._QUOTER(user)
+ password = val.password
+ else:
+ raise TypeError("Invalid user type")
+ if not self.is_absolute():
+ raise ValueError("user replacement is not allowed for relative URLs")
+ return URL(
+ self._val._replace(
+ netloc=self._make_netloc(user, password, val.hostname, val.port)
+ ),
+ encoded=True,
+ )
+
+ def with_password(self, password):
+ """Return a new URL with password replaced.
+
+ Autoencode password if needed.
+
+ Clear password if argument is None.
+
+ """
+ # N.B. doesn't cleanup query/fragment
+ if password is None:
+ pass
+ elif isinstance(password, str):
+ password = self._QUOTER(password)
+ else:
+ raise TypeError("Invalid password type")
+ if not self.is_absolute():
+ raise ValueError("password replacement is not allowed for relative URLs")
+ val = self._val
+ return URL(
+ self._val._replace(
+ netloc=self._make_netloc(val.username, password, val.hostname, val.port)
+ ),
+ encoded=True,
+ )
+
+ def with_host(self, host):
+ """Return a new URL with host replaced.
+
+ Autoencode host if needed.
+
+ Changing host for relative URLs is not allowed, use .join()
+ instead.
+
+ """
+ # N.B. doesn't cleanup query/fragment
+ if not isinstance(host, str):
+ raise TypeError("Invalid host type")
+ if not self.is_absolute():
+ raise ValueError("host replacement is not allowed for relative URLs")
+ if not host:
+ raise ValueError("host removing is not allowed")
+ val = self._val
+ return URL(
+ self._val._replace(
+ netloc=self._make_netloc(val.username, val.password, host, val.port)
+ ),
+ encoded=True,
+ )
+
+ def with_port(self, port):
+ """Return a new URL with port replaced.
+
+ Clear port to default if None is passed.
+
+ """
+ # N.B. doesn't cleanup query/fragment
+ if port is not None and not isinstance(port, int):
+ raise TypeError("port should be int or None, got {}".format(type(port)))
+ if not self.is_absolute():
+ raise ValueError("port replacement is not allowed for relative URLs")
+ val = self._val
+ return URL(
+ self._val._replace(
+ netloc=self._make_netloc(
+ val.username, val.password, val.hostname, port, encode=True
+ )
+ ),
+ encoded=True,
+ )
+
+ def with_path(self, path, *, encoded=False):
+ """Return a new URL with path replaced."""
+ if not encoded:
+ path = self._PATH_QUOTER(path)
+ if self.is_absolute():
+ path = self._normalize_path(path)
+ if len(path) > 0 and path[0] != "/":
+ path = "/" + path
+ return URL(self._val._replace(path=path, query="", fragment=""), encoded=True)
+
+ @classmethod
+ def _query_seq_pairs(cls, quoter, pairs):
+ for key, val in pairs:
+ if isinstance(val, (list, tuple)):
+ for v in val:
+ yield quoter(key) + "=" + quoter(cls._query_var(v))
+ else:
+ yield quoter(key) + "=" + quoter(cls._query_var(val))
+
+ @staticmethod
+ def _query_var(v):
+ cls = type(v)
+ if issubclass(cls, str):
+ return v
+ if issubclass(cls, float):
+ if math.isinf(v):
+ raise ValueError("float('inf') is not supported")
+ if math.isnan(v):
+ raise ValueError("float('nan') is not supported")
+ return str(float(v))
+ if issubclass(cls, int) and cls is not bool:
+ return str(int(v))
+ raise TypeError(
+ "Invalid variable type: value "
+ "should be str, int or float, got {!r} "
+ "of type {}".format(v, cls)
+ )
+
+ def _get_str_query(self, *args, **kwargs):
+ if kwargs:
+ if len(args) > 0:
+ raise ValueError(
+ "Either kwargs or single query parameter must be present"
+ )
+ query = kwargs
+ elif len(args) == 1:
+ query = args[0]
+ else:
+ raise ValueError("Either kwargs or single query parameter must be present")
+
+ if query is None:
+ query = ""
+ elif isinstance(query, Mapping):
+ quoter = self._QUERY_PART_QUOTER
+ query = "&".join(self._query_seq_pairs(quoter, query.items()))
+ elif isinstance(query, str):
+ query = self._QUERY_QUOTER(query)
+ elif isinstance(query, (bytes, bytearray, memoryview)):
+ raise TypeError(
+ "Invalid query type: bytes, bytearray and memoryview are forbidden"
+ )
+ elif isinstance(query, Sequence):
+ quoter = self._QUERY_PART_QUOTER
+ # We don't expect sequence values if we're given a list of pairs
+ # already; only mappings like builtin `dict` which can't have the
+ # same key pointing to multiple values are allowed to use
+ # `_query_seq_pairs`.
+ query = "&".join(
+ quoter(k) + "=" + quoter(self._query_var(v)) for k, v in query
+ )
+ else:
+ raise TypeError(
+ "Invalid query type: only str, mapping or "
+ "sequence of (key, value) pairs is allowed"
+ )
+
+ return query
+
+ def with_query(self, *args, **kwargs):
+ """Return a new URL with query part replaced.
+
+ Accepts any Mapping (e.g. dict, multidict.MultiDict instances)
+ or str, autoencode the argument if needed.
+
+ A sequence of (key, value) pairs is supported as well.
+
+ It also can take an arbitrary number of keyword arguments.
+
+ Clear query if None is passed.
+
+ """
+ # N.B. doesn't cleanup query/fragment
+
+ new_query = self._get_str_query(*args, **kwargs)
+ return URL(
+ self._val._replace(path=self._val.path, query=new_query), encoded=True
+ )
+
+ def update_query(self, *args, **kwargs):
+ """Return a new URL with query part updated."""
+ s = self._get_str_query(*args, **kwargs)
+ new_query = MultiDict(parse_qsl(s, keep_blank_values=True))
+ query = MultiDict(self.query)
+ query.update(new_query)
+
+ return URL(self._val._replace(query=self._get_str_query(query)), encoded=True)
+
+ def with_fragment(self, fragment):
+ """Return a new URL with fragment replaced.
+
+ Autoencode fragment if needed.
+
+ Clear fragment to default if None is passed.
+
+ """
+ # N.B. doesn't cleanup query/fragment
+ if fragment is None:
+ raw_fragment = ""
+ elif not isinstance(fragment, str):
+ raise TypeError("Invalid fragment type")
+ else:
+ raw_fragment = self._FRAGMENT_QUOTER(fragment)
+ if self.raw_fragment == raw_fragment:
+ return self
+ return URL(self._val._replace(fragment=raw_fragment), encoded=True)
+
+ def with_name(self, name):
+ """Return a new URL with name (last part of path) replaced.
+
+ Query and fragment parts are cleaned up.
+
+ Name is encoded if needed.
+
+ """
+ # N.B. DOES cleanup query/fragment
+ if not isinstance(name, str):
+ raise TypeError("Invalid name type")
+ if "/" in name:
+ raise ValueError("Slash in name is not allowed")
+ name = self._PATH_QUOTER(name)
+ if name in (".", ".."):
+ raise ValueError(". and .. values are forbidden")
+ parts = list(self.raw_parts)
+ if self.is_absolute():
+ if len(parts) == 1:
+ parts.append(name)
+ else:
+ parts[-1] = name
+ parts[0] = "" # replace leading '/'
+ else:
+ parts[-1] = name
+ if parts[0] == "/":
+ parts[0] = "" # replace leading '/'
+ return URL(
+ self._val._replace(path="/".join(parts), query="", fragment=""),
+ encoded=True,
+ )
+
+ def join(self, url):
+ """Join URLs
+
+ Construct a full (“absolute”) URL by combining a “base URL”
+ (self) with another URL (url).
+
+ Informally, this uses components of the base URL, in
+ particular the addressing scheme, the network location and
+ (part of) the path, to provide missing components in the
+ relative URL.
+
+ """
+ # See docs for urllib.parse.urljoin
+ if not isinstance(url, URL):
+ raise TypeError("url should be URL")
+ return URL(urljoin(str(self), str(url)), encoded=True)
+
+ def human_repr(self):
+ """Return decoded human readable string for URL representation."""
+ user = _human_quote(self.user, "#/:?@")
+ password = _human_quote(self.password, "#/:?@")
+ host = self.host
+ if host:
+ host = self._encode_host(self.host, human=True)
+ path = _human_quote(self.path, "#?")
+ query_string = "&".join(
+ "{}={}".format(_human_quote(k, "#&+;="), _human_quote(v, "#&+;="))
+ for k, v in self.query.items()
+ )
+ fragment = _human_quote(self.fragment, "")
+ return urlunsplit(
+ SplitResult(
+ self.scheme,
+ self._make_netloc(
+ user,
+ password,
+ host,
+ self._val.port,
+ encode_host=False,
+ ),
+ path,
+ query_string,
+ fragment,
+ )
+ )
+
+
+def _human_quote(s, unsafe):
+ if not s:
+ return s
+ for c in "%" + unsafe:
+ if c in s:
+ s = s.replace(c, "%{:02X}".format(ord(c)))
+ if s.isprintable():
+ return s
+ return "".join(c if c.isprintable() else quote(c) for c in s)
+
+
+_MAXCACHE = 256
+
+
+@functools.lru_cache(_MAXCACHE)
+def _idna_decode(raw):
+ try:
+ return idna.decode(raw.encode("ascii"))
+ except UnicodeError: # e.g. '::1'
+ return raw.encode("ascii").decode("idna")
+
+
+@functools.lru_cache(_MAXCACHE)
+def _idna_encode(host):
+ try:
+ return idna.encode(host, uts46=True).decode("ascii")
+ except UnicodeError:
+ return host.encode("idna").decode("ascii")
+
+
+@rewrite_module
+def cache_clear():
+ _idna_decode.cache_clear()
+ _idna_encode.cache_clear()
+
+
+@rewrite_module
+def cache_info():
+ return {
+ "idna_encode": _idna_encode.cache_info(),
+ "idna_decode": _idna_decode.cache_info(),
+ }
+
+
+@rewrite_module
+def cache_configure(*, idna_encode_size=_MAXCACHE, idna_decode_size=_MAXCACHE):
+ global _idna_decode, _idna_encode
+
+ _idna_encode = functools.lru_cache(idna_encode_size)(_idna_encode.__wrapped__)
+ _idna_decode = functools.lru_cache(idna_decode_size)(_idna_decode.__wrapped__)
diff --git a/third_party/python/yarl/yarl/py.typed b/third_party/python/yarl/yarl/py.typed
new file mode 100644
index 0000000000..867e2c8492
--- /dev/null
+++ b/third_party/python/yarl/yarl/py.typed
@@ -0,0 +1 @@
+# Placeholder \ No newline at end of file