From 1f17f6ce48143fb3d1a8317204efef5c5755f216 Mon Sep 17 00:00:00 2001 From: David Lecomber Date: Sun, 19 Jan 2025 00:18:45 +0000 Subject: [PATCH 1/8] Enable khmer to build with fresher python and setuptools. - @mr-c for the python version updates https://github.com/dib-lab/khmer/pull/1917 - added SETUPTOOLS_USE_DISTUTILS=stdlib to use older directory convention for temp .o files during setup.py - remove linux-aarch64 as unsupported until cqf library is ported --- .../khmer/0000-Upgrade-to-python3.10.patch | 28376 ++++++++++++++++ ...nd-flags-for-third-party-compilation.patch | 6 +- recipes/khmer/meta.yaml | 17 +- 3 files changed, 28389 insertions(+), 10 deletions(-) create mode 100644 recipes/khmer/0000-Upgrade-to-python3.10.patch diff --git a/recipes/khmer/0000-Upgrade-to-python3.10.patch b/recipes/khmer/0000-Upgrade-to-python3.10.patch new file mode 100644 index 0000000000000..a9e9d5ed1e405 --- /dev/null +++ b/recipes/khmer/0000-Upgrade-to-python3.10.patch @@ -0,0 +1,28376 @@ +diff --git a/.travis.yml b/.travis.yml +index 693761b7..0b12400c 100644 +--- a/.travis.yml ++++ b/.travis.yml +@@ -21,22 +21,9 @@ matrix: + fast_finish: true + include: + +- - os: linux +- python: "3.4" +- # Tell travis we want debian trusty +- sudo: required +- dist: trusty +- env: +- - TESTATTR="'not huge and not known_failing'" +- addons: +- apt: +- packages: +- - astyle +- - cppcheck +- - enchant + + - os: linux +- python: "3.5" ++ python: "3.6" + # Tell travis we want debian trusty + sudo: required + dist: trusty +@@ -50,10 +37,9 @@ matrix: + - enchant + + - os: linux +- python: "3.6" ++ python: "3.10" + # Tell travis we want debian trusty + sudo: required +- dist: trusty + env: + - TESTATTR="'not huge and not known_failing'" + addons: +@@ -63,6 +49,7 @@ matrix: + - cppcheck + - enchant + ++ + - os: osx + language: generic + osx_image: xcode7.3 +diff --git a/MANIFEST.in b/MANIFEST.in +index 6a317ff4..8b5127c9 100644 +--- a/MANIFEST.in ++++ b/MANIFEST.in +@@ -1,5 +1,5 @@ + include ChangeLog ez_setup.py IDEAS Makefile README.md setup.cfg +-include versioneer.py MANIFEST.in CITATION CONTRIBUTING.md Doxyfile.in ++include versioneer.py MANIFEST.in CITATION Doxyfile.in + include LICENSE TODO .ycm_extra_conf.py authors.csv + recursive-include lib *.hh *.cc [Mm]akefile* get_version.py + recursive-include khmer *.hh +diff --git a/Makefile b/Makefile +index 12ebaa80..10a519b0 100644 +--- a/Makefile ++++ b/Makefile +@@ -62,7 +62,7 @@ INCLUDESTRING=$(shell gcc -E -x c++ - -v < /dev/null 2>&1 >/dev/null \ + INCLUDEOPTS=$(shell gcc -E -x c++ - -v < /dev/null 2>&1 >/dev/null \ + | grep '^ /' | grep -v cc1plus | awk '{print "-I" $$1 " "}') + +-PYINCLUDE=$(shell python -c "import sysconfig; \ ++PYINCLUDE=$(shell python3 -c "import sysconfig; \ + flags = ['-I' + sysconfig.get_path('include'), \ + '-I' + sysconfig.get_path('platinclude')]; print(' '.join(flags))") + +@@ -83,8 +83,8 @@ else + TESTATTR ?= 'not known_failing and not jenkins and not huge and not linux' + endif + +-MODEXT=$(shell python -c \ +- "import sysconfig;print(sysconfig.get_config_var('SO'))") ++MODEXT=$(shell python3 -c \ ++ "import sysconfig;print(sysconfig.get_config_var('EXT_SUFFIX'))") + EXTENSION_MODULE = khmer/_khmer$(MODEXT) + CY_MODULES = $($(wildcard khmer/_oxli/*.pyx): .pyx=.$(MODEXT)) + +@@ -147,7 +147,7 @@ clean: FORCE + + debug: FORCE + export CFLAGS="-pg -fprofile-arcs -D_GLIBCXX_DEBUG_PEDANTIC \ +- -D_GLIBCXX_DEBUG -DDEBUG_ASSEMBLY=1 -DDEBUG_FILTERS=1"; python setup.py build_ext --debug \ ++ -D_GLIBCXX_DEBUG -DDEBUG_ASSEMBLY=1 -DDEBUG_FILTERS=1"; python3 setup.py build_ext --debug \ + --inplace + + ## doc : render documentation in HTML +@@ -263,7 +263,7 @@ diff-cover.html: coverage-gcovr.xml coverage.xml + --html-report diff-cover.html + + pytests.xml: FORCE +- py.test --junitxml=$@ -m ${TESTATTR} ++ python3 -m pytest --junitxml=$@ -m ${TESTATTR} + + ## doxygen : generate documentation of the C++ and Python code + # helpful packages: doxygen graphviz +@@ -308,7 +308,7 @@ libtest: FORCE + ## test : run the khmer test suite + test: FORCE + ./setup.py develop +- py.test -m ${TESTATTR} ++ python3 -m pytest -m ${TESTATTR} + + sloccount.sc: $(CPPSOURCES) $(PYSOURCES) $(wildcard tests/*.py) Makefile + sloccount --duplicates --wide --details include src khmer scripts tests \ +@@ -324,7 +324,7 @@ coverity-build: + export PATH=${PATH}:${cov_analysis_dir}/bin; \ + cov-build --dir cov-int --c-coverage gcov \ + --disable-gcov-arg-injection make coverage-debug; \ +- cov-capture --dir cov-int --c-coverage gcov python -m pytest \ ++ cov-capture --dir cov-int --c-coverage gcov python3 -m pytest \ + -m $(TESTATTR) ; \ + cov-import-scm --dir cov-int --scm git 2>/dev/null; \ + else echo 'bin/cov-build does not exist in $$cov_analysis_dir: '\ +@@ -377,7 +377,7 @@ list-author-emails: + + list-citation: + git log --format='%aN,%aE' | sort -u | grep -v -F -f author-skips.txt > authors.csv +- python sort-authors-list.py ++ python3 sort-authors-list.py + + ## cpp-demos : run programs demonstrating access to the (unstable) C++ API + cpp-demos: sharedobj +@@ -385,10 +385,10 @@ cpp-demos: sharedobj + + ## py-demos : run programs demonstrating access to the Python API + py-demos: sharedobj +- python examples/python-api/exact-counting.py +- python examples/python-api/bloom.py +- python examples/python-api/consume.py examples/c++-api/reads.fastq +- python examples/python-api/mask.py ++ python3 examples/python-api/exact-counting.py ++ python3 examples/python-api/bloom.py ++ python3 examples/python-api/consume.py examples/c++-api/reads.fastq ++ python3 examples/python-api/mask.py + + COMMIT ?= $(shell git rev-parse HEAD) + SLUG ?= $(TRAVIS_PULL_REQUEST_SLUG) +diff --git a/khmer/_oxli/assembly.cpp b/khmer/_oxli/assembly.cpp +index e312086d..16575242 100644 +--- a/khmer/_oxli/assembly.cpp ++++ b/khmer/_oxli/assembly.cpp +@@ -1,14 +1,16 @@ +-/* Generated by Cython 0.29.2 */ ++/* Generated by Cython 0.29.32 */ + ++#ifndef PY_SSIZE_T_CLEAN + #define PY_SSIZE_T_CLEAN ++#endif /* 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_2" +-#define CYTHON_HEX_VERSION 0x001D02F0 ++#define CYTHON_ABI "0_29_32" ++#define CYTHON_HEX_VERSION 0x001D20F0 + #define CYTHON_FUTURE_DIVISION 1 + #include + #ifndef offsetof +@@ -47,6 +49,7 @@ + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP +@@ -83,10 +86,14 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC (PYPY_VERSION_HEX >= 0x07030900) ++ #endif + #elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -124,10 +131,59 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 ++ #endif ++#elif defined(PY_NOGIL) ++ #define CYTHON_COMPILING_IN_PYPY 0 ++ #define CYTHON_COMPILING_IN_PYSTON 0 ++ #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 1 ++ #ifndef CYTHON_USE_TYPE_SLOTS ++ #define CYTHON_USE_TYPE_SLOTS 1 ++ #endif ++ #undef CYTHON_USE_PYTYPE_LOOKUP ++ #define CYTHON_USE_PYTYPE_LOOKUP 0 ++ #ifndef CYTHON_USE_ASYNC_SLOTS ++ #define CYTHON_USE_ASYNC_SLOTS 1 ++ #endif ++ #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 ++ #ifndef CYTHON_PEP489_MULTI_PHASE_INIT ++ #define CYTHON_PEP489_MULTI_PHASE_INIT 1 ++ #endif ++ #ifndef CYTHON_USE_TP_FINALIZE ++ #define CYTHON_USE_TP_FINALIZE 1 ++ #endif ++ #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 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -155,7 +211,7 @@ + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif +- #if PY_VERSION_HEX < 0x030300F0 ++ #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) +@@ -170,11 +226,14 @@ + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif +- #ifndef CYTHON_FAST_THREAD_STATE ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_FAST_THREAD_STATE ++ #define CYTHON_FAST_THREAD_STATE 0 ++ #elif !defined(CYTHON_FAST_THREAD_STATE) + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL +- #define CYTHON_FAST_PYCALL 1 ++ #define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030A0000) + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) +@@ -185,15 +244,23 @@ + #ifndef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) + #endif +- #ifndef CYTHON_USE_EXC_INFO_STACK ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_USE_EXC_INFO_STACK ++ #define CYTHON_USE_EXC_INFO_STACK 0 ++ #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) + #endif ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 ++ #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" ++ #if PY_MAJOR_VERSION < 3 ++ #include "longintrepr.h" ++ #endif + #undef SHIFT + #undef BASE + #undef MASK +@@ -324,8 +391,72 @@ class __Pyx_FakeReference { + #define __Pyx_DefaultClassType PyClass_Type + #else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" ++ #define __Pyx_DefaultClassType PyType_Type ++#if PY_VERSION_HEX >= 0x030B00A1 ++ static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int k, int l, int s, int f, ++ PyObject *code, PyObject *c, PyObject* n, PyObject *v, ++ PyObject *fv, PyObject *cell, PyObject* fn, ++ PyObject *name, int fline, PyObject *lnos) { ++ PyObject *kwds=NULL, *argcount=NULL, *posonlyargcount=NULL, *kwonlyargcount=NULL; ++ PyObject *nlocals=NULL, *stacksize=NULL, *flags=NULL, *replace=NULL, *call_result=NULL, *empty=NULL; ++ const char *fn_cstr=NULL; ++ const char *name_cstr=NULL; ++ PyCodeObject* co=NULL; ++ PyObject *type, *value, *traceback; ++ PyErr_Fetch(&type, &value, &traceback); ++ if (!(kwds=PyDict_New())) goto end; ++ if (!(argcount=PyLong_FromLong(a))) goto end; ++ if (PyDict_SetItemString(kwds, "co_argcount", argcount) != 0) goto end; ++ if (!(posonlyargcount=PyLong_FromLong(0))) goto end; ++ if (PyDict_SetItemString(kwds, "co_posonlyargcount", posonlyargcount) != 0) goto end; ++ if (!(kwonlyargcount=PyLong_FromLong(k))) goto end; ++ if (PyDict_SetItemString(kwds, "co_kwonlyargcount", kwonlyargcount) != 0) goto end; ++ if (!(nlocals=PyLong_FromLong(l))) goto end; ++ if (PyDict_SetItemString(kwds, "co_nlocals", nlocals) != 0) goto end; ++ if (!(stacksize=PyLong_FromLong(s))) goto end; ++ if (PyDict_SetItemString(kwds, "co_stacksize", stacksize) != 0) goto end; ++ if (!(flags=PyLong_FromLong(f))) goto end; ++ if (PyDict_SetItemString(kwds, "co_flags", flags) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_code", code) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_consts", c) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_names", n) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_varnames", v) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_freevars", fv) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_cellvars", cell) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_linetable", lnos) != 0) goto end; ++ if (!(fn_cstr=PyUnicode_AsUTF8AndSize(fn, NULL))) goto end; ++ if (!(name_cstr=PyUnicode_AsUTF8AndSize(name, NULL))) goto end; ++ if (!(co = PyCode_NewEmpty(fn_cstr, name_cstr, fline))) goto end; ++ if (!(replace = PyObject_GetAttrString((PyObject*)co, "replace"))) goto cleanup_code_too; ++ if (!(empty = PyTuple_New(0))) goto cleanup_code_too; // unfortunately __pyx_empty_tuple isn't available here ++ if (!(call_result = PyObject_Call(replace, empty, kwds))) goto cleanup_code_too; ++ Py_XDECREF((PyObject*)co); ++ co = (PyCodeObject*)call_result; ++ call_result = NULL; ++ if (0) { ++ cleanup_code_too: ++ Py_XDECREF((PyObject*)co); ++ co = NULL; ++ } ++ end: ++ Py_XDECREF(kwds); ++ Py_XDECREF(argcount); ++ Py_XDECREF(posonlyargcount); ++ Py_XDECREF(kwonlyargcount); ++ Py_XDECREF(nlocals); ++ Py_XDECREF(stacksize); ++ Py_XDECREF(replace); ++ Py_XDECREF(call_result); ++ Py_XDECREF(empty); ++ if (type) { ++ PyErr_Restore(type, value, traceback); ++ } ++ return co; ++ } ++#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 +@@ -360,26 +491,6 @@ class __Pyx_FakeReference { + #else + #define __Pyx_PyFastCFunction_Check(func) 0 + #endif +-#if CYTHON_USE_DICT_VERSIONS +-#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);\ +- }\ +- } +-#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 + #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) +@@ -412,7 +523,7 @@ class __Pyx_FakeReference { + typedef int Py_tss_t; + static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); +- return 0; // PyThread_create_key reports success always ++ 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)); +@@ -435,7 +546,7 @@ static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); + } +-#endif // TSS (Thread Specific Storage) API ++#endif + #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) + #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) + #else +@@ -455,8 +566,12 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #endif + #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 ++ #if defined(PyUnicode_IS_READY) + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) ++ #else ++ #define __Pyx_PyUnicode_READY(op) (0) ++ #endif + #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) +@@ -464,7 +579,15 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) ++ #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) ++ #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) ++ #endif ++ #else ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) ++ #endif + #else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 +@@ -513,8 +636,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) +@@ -525,6 +650,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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 +@@ -558,13 +690,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong +- #define __Pyx_PyInt_AsHash_t PyInt_AsLong ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t + #else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t +- #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t + #endif + #if PY_MAJOR_VERSION >= 3 +- #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func)) ++ #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 +@@ -586,8 +718,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + } __Pyx_PyAsyncMethodsStruct; + #endif + +-#if defined(WIN32) || defined(MS_WINDOWS) +- #define _USE_MATH_DEFINES ++#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) ++ #if !defined(_USE_MATH_DEFINES) ++ #define _USE_MATH_DEFINES ++ #endif + #endif + #include + #ifdef NAN +@@ -605,11 +739,10 @@ static CYTHON_INLINE float __PYX_NAN() { + #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_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ +-} ++ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + + #ifndef __PYX_EXTERN_C + #ifdef __cplusplus +@@ -632,6 +765,18 @@ static CYTHON_INLINE float __PYX_NAN() { + #include + #include + #include ++ ++ #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600) ++ // move should be defined for these versions of MSVC, but __cplusplus isn't set usefully ++ #include ++ ++ namespace cython_std { ++ template typename std::remove_reference::type&& move(T& t) noexcept { return std::move(t); } ++ template typename std::remove_reference::type&& move(T&& t) noexcept { return std::move(t); } ++ } ++ ++ #endif ++ + #include + #include + #include +@@ -662,7 +807,8 @@ typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* enc + 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_DEFAULT 0 ++#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 1 ++#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) + #define __PYX_DEFAULT_STRING_ENCODING "utf8" + #define __Pyx_PyObject_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyObject_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +@@ -745,6 +891,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); + (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); ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); + #if CYTHON_ASSUME_SAFE_MACROS + #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) + #else +@@ -1691,7 +1838,7 @@ static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { + if (likely(L->allocated > len)) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); +- Py_SIZE(list) = len+1; ++ __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +@@ -1717,6 +1864,17 @@ static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_nam + /* SetVTable.proto */ + static int __Pyx_SetVtable(PyObject *dict, void *vtable); + ++/* 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 ++ ++/* PyObjectGetAttrStrNoError.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); ++ + /* SetupReduce.proto */ + static int __Pyx_setup_reduce(PyObject* type_obj); + +@@ -1734,6 +1892,32 @@ static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, + /* GetVTable.proto */ + static void* __Pyx_GetVtable(PyObject *dict); + ++/* 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 ++ + /* CLineInTraceback.proto */ + #ifdef CYTHON_CLINE_IN_TRACEBACK + #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +@@ -1805,6 +1989,11 @@ static void __Pyx_CppExn2PyErr() { + } + #endif + ++/* GCCDiagnostics.proto */ ++#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) ++#define __Pyx_HAS_GCC_DIAGNOSTIC ++#endif ++ + /* CIntToPy.proto */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint16_t(uint16_t value); + +@@ -2029,6 +2218,9 @@ static int __pyx_pw_5khmer_5_oxli_8assembly_15LinearAssembler_1__cinit__(PyObjec + static int __pyx_pw_5khmer_5_oxli_8assembly_15LinearAssembler_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *__pyx_v_graph = 0; + struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *__pyx_v_stop_filter = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -2105,6 +2297,9 @@ static int __pyx_pf_5khmer_5_oxli_8assembly_15LinearAssembler___cinit__(struct _ + int __pyx_t_5; + int __pyx_t_6; + std::shared_ptr __pyx_t_7; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "khmer/_oxli/assembly.pyx":11 +@@ -2218,6 +2413,9 @@ static PyObject *__pyx_pw_5khmer_5_oxli_8assembly_15LinearAssembler_3set_stop_fi + static char __pyx_doc_5khmer_5_oxli_8assembly_15LinearAssembler_2set_stop_filter[] = "LinearAssembler.set_stop_filter(self, Hashgraph stop_filter=None)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8assembly_15LinearAssembler_3set_stop_filter(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *__pyx_v_stop_filter = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("set_stop_filter (wrapper)", 0); +@@ -2355,6 +2553,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_8assembly_15LinearAssembler__assemble(str + 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("_assemble", 0); + + /* "khmer/_oxli/assembly.pyx":24 +@@ -2462,6 +2663,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8assembly_15LinearAssembler_4assemble(st + __Pyx_RefNannyDeclarations + oxli::Kmer __pyx_t_1; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("assemble", 0); + + /* "khmer/_oxli/assembly.pyx":31 +@@ -2521,6 +2725,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_8assembly_15LinearAssembler__assemble_lef + 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("_assemble_left", 0); + + /* "khmer/_oxli/assembly.pyx":35 +@@ -2628,6 +2835,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8assembly_15LinearAssembler_6assemble_le + __Pyx_RefNannyDeclarations + oxli::Kmer __pyx_t_1; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("assemble_left", 0); + + /* "khmer/_oxli/assembly.pyx":42 +@@ -2687,6 +2897,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_8assembly_15LinearAssembler__assemble_rig + 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("_assemble_right", 0); + + /* "khmer/_oxli/assembly.pyx":46 +@@ -2794,6 +3007,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8assembly_15LinearAssembler_8assemble_ri + __Pyx_RefNannyDeclarations + oxli::Kmer __pyx_t_1; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("assemble_right", 0); + + /* "khmer/_oxli/assembly.pyx":53 +@@ -2893,6 +3109,9 @@ static int __pyx_pf_5khmer_5_oxli_8assembly_15LinearAssembler_5graph_2__set__(st + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 0); + if (!(likely(((__pyx_v_value) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_value, __pyx_ptype_5khmer_5_oxli_6graphs_Hashgraph))))) __PYX_ERR(2, 43, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; +@@ -2998,6 +3217,9 @@ static int __pyx_pf_5khmer_5_oxli_8assembly_15LinearAssembler_11stop_filter_2__s + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 0); + if (!(likely(((__pyx_v_value) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_value, __pyx_ptype_5khmer_5_oxli_6graphs_Hashgraph))))) __PYX_ERR(2, 46, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; +@@ -3073,6 +3295,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8assembly_15LinearAssembler_10__reduce_c + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -3128,6 +3353,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8assembly_15LinearAssembler_12__setstate + 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)":4 +@@ -3171,6 +3399,9 @@ static int __pyx_pw_5khmer_5_oxli_8assembly_22SimpleLabeledAssembler_1__cinit__( + static int __pyx_pw_5khmer_5_oxli_8assembly_22SimpleLabeledAssembler_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + struct __pyx_obj_5khmer_5_oxli_8labeling_GraphLabels *__pyx_v_labels = 0; + struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *__pyx_v_stop_filter = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -3246,6 +3477,9 @@ static int __pyx_pf_5khmer_5_oxli_8assembly_22SimpleLabeledAssembler___cinit__(s + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_t_6; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "khmer/_oxli/assembly.pyx":60 +@@ -3368,6 +3602,9 @@ static PyObject *__pyx_pw_5khmer_5_oxli_8assembly_22SimpleLabeledAssembler_3set_ + static char __pyx_doc_5khmer_5_oxli_8assembly_22SimpleLabeledAssembler_2set_stop_filter[] = "SimpleLabeledAssembler.set_stop_filter(self, Hashgraph stop_filter=None)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8assembly_22SimpleLabeledAssembler_3set_stop_filter(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *__pyx_v_stop_filter = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("set_stop_filter (wrapper)", 0); +@@ -3598,6 +3835,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8assembly_22SimpleLabeledAssembler_4asse + __Pyx_RefNannyDeclarations + oxli::Kmer __pyx_t_1; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("assemble", 0); + + /* "khmer/_oxli/assembly.pyx":81 +@@ -3697,6 +3937,9 @@ static int __pyx_pf_5khmer_5_oxli_8assembly_22SimpleLabeledAssembler_6labels_2__ + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 0); + if (!(likely(((__pyx_v_value) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_value, __pyx_ptype_5khmer_5_oxli_8labeling_GraphLabels))))) __PYX_ERR(2, 57, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; +@@ -3802,6 +4045,9 @@ static int __pyx_pf_5khmer_5_oxli_8assembly_22SimpleLabeledAssembler_5graph_2__s + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 0); + if (!(likely(((__pyx_v_value) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_value, __pyx_ptype_5khmer_5_oxli_6graphs_Hashgraph))))) __PYX_ERR(2, 58, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; +@@ -3907,6 +4153,9 @@ static int __pyx_pf_5khmer_5_oxli_8assembly_22SimpleLabeledAssembler_11stop_filt + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 0); + if (!(likely(((__pyx_v_value) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_value, __pyx_ptype_5khmer_5_oxli_6graphs_Hashgraph))))) __PYX_ERR(2, 61, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; +@@ -3982,6 +4231,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8assembly_22SimpleLabeledAssembler_6__re + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -4037,6 +4289,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8assembly_22SimpleLabeledAssembler_8__se + 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)":4 +@@ -4080,6 +4335,9 @@ static int __pyx_pw_5khmer_5_oxli_8assembly_22JunctionCountAssembler_1__cinit__( + static int __pyx_pw_5khmer_5_oxli_8assembly_22JunctionCountAssembler_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *__pyx_v_graph = 0; + struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *__pyx_v_stop_filter = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -4156,6 +4414,9 @@ static int __pyx_pf_5khmer_5_oxli_8assembly_22JunctionCountAssembler___cinit__(s + int __pyx_t_5; + int __pyx_t_6; + std::shared_ptr __pyx_t_7; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "khmer/_oxli/assembly.pyx":88 +@@ -4269,6 +4530,9 @@ static PyObject *__pyx_pw_5khmer_5_oxli_8assembly_22JunctionCountAssembler_3set_ + static char __pyx_doc_5khmer_5_oxli_8assembly_22JunctionCountAssembler_2set_stop_filter[] = "JunctionCountAssembler.set_stop_filter(self, Hashgraph stop_filter=None)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8assembly_22JunctionCountAssembler_3set_stop_filter(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *__pyx_v_stop_filter = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("set_stop_filter (wrapper)", 0); +@@ -4483,6 +4747,9 @@ static std::vector __pyx_f_5khmer_5_oxli_8assembly_22JunctionCount + static PyObject *__pyx_pw_5khmer_5_oxli_8assembly_22JunctionCountAssembler_5consume(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence); /*proto*/ + static char __pyx_doc_5khmer_5_oxli_8assembly_22JunctionCountAssembler_4consume[] = "JunctionCountAssembler.consume(self, unicode sequence)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8assembly_22JunctionCountAssembler_5consume(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("consume (wrapper)", 0); +@@ -4503,6 +4770,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8assembly_22JunctionCountAssembler_4cons + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("consume", 0); + + /* "khmer/_oxli/assembly.pyx":108 +@@ -4570,6 +4840,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8assembly_22JunctionCountAssembler_6asse + __Pyx_RefNannyDeclarations + oxli::Kmer __pyx_t_1; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("assemble", 0); + + /* "khmer/_oxli/assembly.pyx":111 +@@ -4666,6 +4939,9 @@ static int __pyx_pf_5khmer_5_oxli_8assembly_22JunctionCountAssembler_5graph_2__s + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 0); + if (!(likely(((__pyx_v_value) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_value, __pyx_ptype_5khmer_5_oxli_6graphs_Hashgraph))))) __PYX_ERR(2, 70, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; +@@ -4771,6 +5047,9 @@ static int __pyx_pf_5khmer_5_oxli_8assembly_22JunctionCountAssembler_11stop_filt + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 0); + if (!(likely(((__pyx_v_value) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_value, __pyx_ptype_5khmer_5_oxli_6graphs_Hashgraph))))) __PYX_ERR(2, 73, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; +@@ -4846,6 +5125,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8assembly_22JunctionCountAssembler_8__re + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -4901,6 +5183,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8assembly_22JunctionCountAssembler_10__s + 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)":4 +@@ -4943,6 +5228,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyObject_string_to_py_std__in_strin + 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("__pyx_convert_PyObject_string_to_py_std__in_string", 0); + + /* "string.to_py":32 +@@ -4990,6 +5278,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyUnicode_string_to_py_std__in_stri + 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("__pyx_convert_PyUnicode_string_to_py_std__in_string", 0); + + /* "string.to_py":38 +@@ -5037,6 +5328,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyStr_string_to_py_std__in_string(s + 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("__pyx_convert_PyStr_string_to_py_std__in_string", 0); + + /* "string.to_py":44 +@@ -5084,6 +5378,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyBytes_string_to_py_std__in_string + 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("__pyx_convert_PyBytes_string_to_py_std__in_string", 0); + + /* "string.to_py":50 +@@ -5131,6 +5428,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyByteArray_string_to_py_std__in_st + 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("__pyx_convert_PyByteArray_string_to_py_std__in_string", 0); + + /* "string.to_py":56 +@@ -5182,6 +5482,9 @@ static PyObject *__pyx_convert_vector_to_py_std_3a__3a_string(const std::vector< + size_t __pyx_t_3; + size_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_vector_to_py_std_3a__3a_string", 0); + + /* "vector.to_py":61 +@@ -5231,7 +5534,7 @@ static PyObject *__pyx_convert_vector_to_py_std_3a__3a_string(const std::vector< + * + * @cname("__pyx_convert_string_from_py_std__in_string") + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: # <<<<<<<<<<<<<< +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + */ + +@@ -5241,11 +5544,23 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + std::string __pyx_r; + __Pyx_RefNannyDeclarations + char const *__pyx_t_1; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_string_from_py_std__in_string", 0); + ++ /* "string.from_py":14 ++ * @cname("__pyx_convert_string_from_py_std__in_string") ++ * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: ++ * cdef Py_ssize_t length = 0 # <<<<<<<<<<<<<< ++ * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) ++ * return string(data, length) ++ */ ++ __pyx_v_length = 0; ++ + /* "string.from_py":15 + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) # <<<<<<<<<<<<<< + * return string(data, length) + * +@@ -5254,7 +5569,7 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + __pyx_v_data = __pyx_t_1; + + /* "string.from_py":16 +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + * return string(data, length) # <<<<<<<<<<<<<< + * +@@ -5267,7 +5582,7 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + * + * @cname("__pyx_convert_string_from_py_std__in_string") + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: # <<<<<<<<<<<<<< +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + */ + +@@ -5392,7 +5707,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_8assembly_LinearAssembler = { + sizeof(struct __pyx_obj_5khmer_5_oxli_8assembly_LinearAssembler), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_8assembly_LinearAssembler, /*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 +@@ -5442,6 +5762,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_8assembly_LinearAssembler = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + static struct __pyx_vtabstruct_5khmer_5_oxli_8assembly_SimpleLabeledAssembler __pyx_vtable_5khmer_5_oxli_8assembly_SimpleLabeledAssembler; + +@@ -5576,7 +5905,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_8assembly_SimpleLabeledAssembler = + sizeof(struct __pyx_obj_5khmer_5_oxli_8assembly_SimpleLabeledAssembler), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_8assembly_SimpleLabeledAssembler, /*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 +@@ -5626,6 +5960,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_8assembly_SimpleLabeledAssembler = + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + static struct __pyx_vtabstruct_5khmer_5_oxli_8assembly_JunctionCountAssembler __pyx_vtable_5khmer_5_oxli_8assembly_JunctionCountAssembler; + +@@ -5739,7 +6082,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_8assembly_JunctionCountAssembler = + sizeof(struct __pyx_obj_5khmer_5_oxli_8assembly_JunctionCountAssembler), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_8assembly_JunctionCountAssembler, /*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 +@@ -5789,6 +6137,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_8assembly_JunctionCountAssembler = + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static PyMethodDef __pyx_methods[] = { +@@ -5976,6 +6333,9 @@ static int __Pyx_modinit_function_export_code(void) { + + 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_5khmer_5_oxli_8assembly_LinearAssembler = &__pyx_vtable_5khmer_5_oxli_8assembly_LinearAssembler; +@@ -5983,7 +6343,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtable_5khmer_5_oxli_8assembly_LinearAssembler._assemble_left = (PyObject *(*)(struct __pyx_obj_5khmer_5_oxli_8assembly_LinearAssembler *, oxli::Kmer))__pyx_f_5khmer_5_oxli_8assembly_15LinearAssembler__assemble_left; + __pyx_vtable_5khmer_5_oxli_8assembly_LinearAssembler._assemble_right = (PyObject *(*)(struct __pyx_obj_5khmer_5_oxli_8assembly_LinearAssembler *, oxli::Kmer))__pyx_f_5khmer_5_oxli_8assembly_15LinearAssembler__assemble_right; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_8assembly_LinearAssembler) < 0) __PYX_ERR(1, 8, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_8assembly_LinearAssembler.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_8assembly_LinearAssembler.tp_dictoffset && __pyx_type_5khmer_5_oxli_8assembly_LinearAssembler.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_8assembly_LinearAssembler.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -5994,7 +6356,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtabptr_5khmer_5_oxli_8assembly_SimpleLabeledAssembler = &__pyx_vtable_5khmer_5_oxli_8assembly_SimpleLabeledAssembler; + __pyx_vtable_5khmer_5_oxli_8assembly_SimpleLabeledAssembler._assemble = (std::vector (*)(struct __pyx_obj_5khmer_5_oxli_8assembly_SimpleLabeledAssembler *, oxli::Kmer))__pyx_f_5khmer_5_oxli_8assembly_22SimpleLabeledAssembler__assemble; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_8assembly_SimpleLabeledAssembler) < 0) __PYX_ERR(1, 57, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_8assembly_SimpleLabeledAssembler.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_8assembly_SimpleLabeledAssembler.tp_dictoffset && __pyx_type_5khmer_5_oxli_8assembly_SimpleLabeledAssembler.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_8assembly_SimpleLabeledAssembler.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -6005,7 +6369,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtabptr_5khmer_5_oxli_8assembly_JunctionCountAssembler = &__pyx_vtable_5khmer_5_oxli_8assembly_JunctionCountAssembler; + __pyx_vtable_5khmer_5_oxli_8assembly_JunctionCountAssembler._assemble = (std::vector (*)(struct __pyx_obj_5khmer_5_oxli_8assembly_JunctionCountAssembler *, oxli::Kmer))__pyx_f_5khmer_5_oxli_8assembly_22JunctionCountAssembler__assemble; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_8assembly_JunctionCountAssembler) < 0) __PYX_ERR(1, 85, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_8assembly_JunctionCountAssembler.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_8assembly_JunctionCountAssembler.tp_dictoffset && __pyx_type_5khmer_5_oxli_8assembly_JunctionCountAssembler.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_8assembly_JunctionCountAssembler.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -6023,6 +6389,9 @@ static int __Pyx_modinit_type_init_code(void) { + 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("khmer._oxli.hashing"); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 62, __pyx_L1_error) +@@ -6119,11 +6488,15 @@ static int __Pyx_modinit_variable_import_code(void) { + static int __Pyx_modinit_function_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_function_import_code", 0); + /*--- Function import code ---*/ + __pyx_t_1 = PyImport_ImportModule("khmer._oxli.utils"); if (!__pyx_t_1) __PYX_ERR(1, 1, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_1); + if (__Pyx_ImportFunction(__pyx_t_1, "_bstring", (void (**)(void))&__pyx_f_5khmer_5_oxli_5utils__bstring, "PyObject *(PyObject *)") < 0) __PYX_ERR(1, 1, __pyx_L1_error) +- Py_DECREF(__pyx_t_1); __pyx_t_1 = 0; ++ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; +@@ -6133,17 +6506,19 @@ static int __Pyx_modinit_function_import_code(void) { + } + + +-#if PY_MAJOR_VERSION < 3 +-#ifdef CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC void +-#else ++#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 CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC PyObject * ++#ifdef __cplusplus ++#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * + #else +-#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC ++#define __Pyx_PyMODINIT_FUNC PyObject * + #endif + #endif + +@@ -6225,6 +6600,9 @@ static CYTHON_SMALL_CODE int __pyx_pymod_exec_assembly(PyObject *__pyx_pyinit_mo + #endif + { + PyObject *__pyx_t_1 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { +@@ -6272,11 +6650,9 @@ if (!__Pyx_RefNanny) { + #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? */ ++ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif +- #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; +@@ -6292,10 +6668,9 @@ if (!__Pyx_RefNanny) { + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(1, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(1, 1, __pyx_L1_error) +- __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(1, 1, __pyx_L1_error) +- #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); +- #endif ++ __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(1, 1, __pyx_L1_error) ++ Py_INCREF(__pyx_cython_runtime); + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(1, 1, __pyx_L1_error); + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitGlobals() < 0) __PYX_ERR(1, 1, __pyx_L1_error) +@@ -6321,10 +6696,10 @@ if (!__Pyx_RefNanny) { + (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)) goto __pyx_L1_error; +- if (unlikely(__Pyx_modinit_type_import_code() != 0)) goto __pyx_L1_error; ++ if (unlikely(__Pyx_modinit_type_init_code() < 0)) __PYX_ERR(1, 1, __pyx_L1_error) ++ if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(1, 1, __pyx_L1_error) + (void)__Pyx_modinit_variable_import_code(); +- if (unlikely(__Pyx_modinit_function_import_code() != 0)) goto __pyx_L1_error; ++ if (unlikely(__Pyx_modinit_function_import_code() < 0)) __PYX_ERR(1, 1, __pyx_L1_error) + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(1, 1, __pyx_L1_error) +@@ -6344,7 +6719,7 @@ if (!__Pyx_RefNanny) { + * + * @cname("__pyx_convert_string_from_py_std__in_string") + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: # <<<<<<<<<<<<<< +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + */ + +@@ -6454,7 +6829,7 @@ static int __Pyx_ParseOptionalKeywords( + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 +- if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { ++ if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { +@@ -6481,7 +6856,7 @@ static int __Pyx_ParseOptionalKeywords( + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -6497,7 +6872,7 @@ static int __Pyx_ParseOptionalKeywords( + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -6585,7 +6960,7 @@ static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *nam + #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; ++ ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) +@@ -6865,6 +7240,53 @@ bad: + return -1; + } + ++/* 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; icurexc_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 ++ ++/* 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; +@@ -6885,53 +7307,81 @@ static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; ++ PyObject *object_getstate = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; ++ PyObject *getstate = NULL; + #if CYTHON_USE_PYTYPE_LOOKUP +- if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto GOOD; ++ getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); + #else +- if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto GOOD; ++ getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); ++ if (!getstate && PyErr_Occurred()) { ++ goto __PYX_BAD; ++ } + #endif ++ if (getstate) { + #if CYTHON_USE_PYTYPE_LOOKUP +- object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; ++ object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); + #else +- object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; ++ object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); ++ if (!object_getstate && PyErr_Occurred()) { ++ goto __PYX_BAD; ++ } + #endif +- reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto BAD; ++ if (object_getstate != getstate) { ++ goto __PYX_GOOD; ++ } ++ } ++#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 BAD; ++ 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 BAD; ++ 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 BAD; ++ 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_GetAttrStr(type_obj, __pyx_n_s_reduce_cython); if (unlikely(!reduce_cython)) goto BAD; +- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto BAD; +- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto BAD; ++ 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_GetAttrStr(type_obj, __pyx_n_s_setstate_cython); if (unlikely(!setstate_cython)) goto BAD; +- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto BAD; +- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto BAD; ++ 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 GOOD; +-BAD: ++ 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; +-GOOD: ++__PYX_GOOD: + #if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); ++ Py_XDECREF(object_getstate); ++ Py_XDECREF(getstate); + #endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); +@@ -7022,9 +7472,35 @@ bad: + return NULL; + } + ++/* 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 ++ + /* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +-static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { ++static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; + #if CYTHON_COMPILING_IN_CPYTHON +@@ -7054,7 +7530,7 @@ static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + } + if (!use_cline) { + c_line = 0; +- PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); ++ (void) 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; +@@ -7128,7 +7604,7 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + 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)); ++ __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } +@@ -7148,33 +7624,40 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + #include "compile.h" + #include "frameobject.h" + #include "traceback.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + 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; ++ PyCodeObject *py_code = NULL; ++ PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 ++ PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); +- #else +- py_srcfile = PyUnicode_FromString(filename); +- #endif + if (!py_srcfile) goto bad; ++ #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; ++ funcname = PyUnicode_AsUTF8(py_funcname); ++ if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); +- #else +- py_funcname = PyUnicode_FromString(funcname); ++ if (!py_funcname) goto bad; + #endif + } +- if (!py_funcname) goto bad; ++ #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, +@@ -7193,11 +7676,16 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); +- Py_DECREF(py_funcname); ++ #else ++ py_code = PyCode_NewEmpty(filename, funcname, py_line); ++ #endif ++ Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline + return py_code; + bad: +- Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); ++ #if PY_MAJOR_VERSION < 3 ++ Py_XDECREF(py_srcfile); ++ #endif + return NULL; + } + static void __Pyx_AddTraceback(const char *funcname, int c_line, +@@ -7205,14 +7693,24 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; ++ PyObject *ptype, *pvalue, *ptraceback; + 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) { ++ __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); +- if (!py_code) goto bad; ++ if (!py_code) { ++ /* If the code object creation fails, then we should clear the ++ fetched exception references and propagate the new exception */ ++ Py_XDECREF(ptype); ++ Py_XDECREF(pvalue); ++ Py_XDECREF(ptraceback); ++ goto bad; ++ } ++ __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( +@@ -7231,7 +7729,14 @@ bad: + + /* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint16_t(uint16_t value) { +- const uint16_t neg_one = (uint16_t) ((uint16_t) 0 - (uint16_t) 1), const_zero = (uint16_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const uint16_t neg_one = (uint16_t) -1, const_zero = (uint16_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(uint16_t) < sizeof(long)) { +@@ -7284,7 +7789,14 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint16_t(uint16_t value) { + + /* CIntFromPy */ + static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *x) { +- const size_t neg_one = (size_t) ((size_t) 0 - (size_t) 1), const_zero = (size_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const size_t neg_one = (size_t) -1, const_zero = (size_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -7473,7 +7985,14 @@ raise_neg_overflow: + + /* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { +@@ -7504,7 +8023,14 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + + /* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -7693,7 +8219,14 @@ raise_neg_overflow: + + /* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +- const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const int neg_one = (int) -1, const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -7982,11 +8515,33 @@ static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObj + + /* 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 ctversion[5]; ++ int same=1, i, found_dot; ++ const char* rt_from_call = Py_GetVersion(); ++ PyOS_snprintf(ctversion, 5, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); ++ found_dot = 0; ++ for (i = 0; i < 4; i++) { ++ if (!ctversion[i]) { ++ same = (rt_from_call[i] < '0' || rt_from_call[i] > '9'); ++ break; ++ } ++ if (rt_from_call[i] != ctversion[i]) { ++ same = 0; ++ break; ++ } ++ } ++ if (!same) { ++ char rtversion[5] = {'\0'}; + char message[200]; ++ for (i=0; i<4; ++i) { ++ if (rt_from_call[i] == '.') { ++ if (found_dot) break; ++ found_dot = 1; ++ } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') { ++ break; ++ } ++ rtversion[i] = rt_from_call[i]; ++ } + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", +@@ -8298,6 +8853,23 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_DECREF(x); + return ival; + } ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { ++ if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { ++ return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); ++#if PY_MAJOR_VERSION < 3 ++ } else if (likely(PyInt_CheckExact(o))) { ++ return PyInt_AS_LONG(o); ++#endif ++ } else { ++ Py_ssize_t ival; ++ PyObject *x; ++ x = PyNumber_Index(o); ++ if (!x) return -1; ++ ival = PyInt_AsLong(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); + } +diff --git a/khmer/_oxli/graphs.cpp b/khmer/_oxli/graphs.cpp +index ff7dfd5b..e6534c01 100644 +--- a/khmer/_oxli/graphs.cpp ++++ b/khmer/_oxli/graphs.cpp +@@ -1,15 +1,17 @@ +-/* Generated by Cython 0.29.2 */ ++/* Generated by Cython 0.29.32 */ + ++#ifndef PY_SSIZE_T_CLEAN + #define PY_SSIZE_T_CLEAN ++#endif /* 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_2" +-#define CYTHON_HEX_VERSION 0x001D02F0 +-#define CYTHON_FUTURE_DIVISION 1 ++#define CYTHON_ABI "0_29_32" ++#define CYTHON_HEX_VERSION 0x001D20F0 ++#define CYTHON_FUTURE_DIVISION 0 + #include + #ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +@@ -47,6 +49,7 @@ + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP +@@ -83,10 +86,14 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC (PYPY_VERSION_HEX >= 0x07030900) ++ #endif + #elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -124,10 +131,59 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 ++ #endif ++#elif defined(PY_NOGIL) ++ #define CYTHON_COMPILING_IN_PYPY 0 ++ #define CYTHON_COMPILING_IN_PYSTON 0 ++ #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 1 ++ #ifndef CYTHON_USE_TYPE_SLOTS ++ #define CYTHON_USE_TYPE_SLOTS 1 ++ #endif ++ #undef CYTHON_USE_PYTYPE_LOOKUP ++ #define CYTHON_USE_PYTYPE_LOOKUP 0 ++ #ifndef CYTHON_USE_ASYNC_SLOTS ++ #define CYTHON_USE_ASYNC_SLOTS 1 ++ #endif ++ #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 ++ #ifndef CYTHON_PEP489_MULTI_PHASE_INIT ++ #define CYTHON_PEP489_MULTI_PHASE_INIT 1 ++ #endif ++ #ifndef CYTHON_USE_TP_FINALIZE ++ #define CYTHON_USE_TP_FINALIZE 1 ++ #endif ++ #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 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -155,7 +211,7 @@ + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif +- #if PY_VERSION_HEX < 0x030300F0 ++ #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) +@@ -170,11 +226,14 @@ + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif +- #ifndef CYTHON_FAST_THREAD_STATE ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_FAST_THREAD_STATE ++ #define CYTHON_FAST_THREAD_STATE 0 ++ #elif !defined(CYTHON_FAST_THREAD_STATE) + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL +- #define CYTHON_FAST_PYCALL 1 ++ #define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030A0000) + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) +@@ -185,15 +244,23 @@ + #ifndef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) + #endif +- #ifndef CYTHON_USE_EXC_INFO_STACK ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_USE_EXC_INFO_STACK ++ #define CYTHON_USE_EXC_INFO_STACK 0 ++ #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) + #endif ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 ++ #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" ++ #if PY_MAJOR_VERSION < 3 ++ #include "longintrepr.h" ++ #endif + #undef SHIFT + #undef BASE + #undef MASK +@@ -324,8 +391,72 @@ class __Pyx_FakeReference { + #define __Pyx_DefaultClassType PyClass_Type + #else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" ++ #define __Pyx_DefaultClassType PyType_Type ++#if PY_VERSION_HEX >= 0x030B00A1 ++ static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int k, int l, int s, int f, ++ PyObject *code, PyObject *c, PyObject* n, PyObject *v, ++ PyObject *fv, PyObject *cell, PyObject* fn, ++ PyObject *name, int fline, PyObject *lnos) { ++ PyObject *kwds=NULL, *argcount=NULL, *posonlyargcount=NULL, *kwonlyargcount=NULL; ++ PyObject *nlocals=NULL, *stacksize=NULL, *flags=NULL, *replace=NULL, *call_result=NULL, *empty=NULL; ++ const char *fn_cstr=NULL; ++ const char *name_cstr=NULL; ++ PyCodeObject* co=NULL; ++ PyObject *type, *value, *traceback; ++ PyErr_Fetch(&type, &value, &traceback); ++ if (!(kwds=PyDict_New())) goto end; ++ if (!(argcount=PyLong_FromLong(a))) goto end; ++ if (PyDict_SetItemString(kwds, "co_argcount", argcount) != 0) goto end; ++ if (!(posonlyargcount=PyLong_FromLong(0))) goto end; ++ if (PyDict_SetItemString(kwds, "co_posonlyargcount", posonlyargcount) != 0) goto end; ++ if (!(kwonlyargcount=PyLong_FromLong(k))) goto end; ++ if (PyDict_SetItemString(kwds, "co_kwonlyargcount", kwonlyargcount) != 0) goto end; ++ if (!(nlocals=PyLong_FromLong(l))) goto end; ++ if (PyDict_SetItemString(kwds, "co_nlocals", nlocals) != 0) goto end; ++ if (!(stacksize=PyLong_FromLong(s))) goto end; ++ if (PyDict_SetItemString(kwds, "co_stacksize", stacksize) != 0) goto end; ++ if (!(flags=PyLong_FromLong(f))) goto end; ++ if (PyDict_SetItemString(kwds, "co_flags", flags) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_code", code) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_consts", c) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_names", n) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_varnames", v) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_freevars", fv) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_cellvars", cell) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_linetable", lnos) != 0) goto end; ++ if (!(fn_cstr=PyUnicode_AsUTF8AndSize(fn, NULL))) goto end; ++ if (!(name_cstr=PyUnicode_AsUTF8AndSize(name, NULL))) goto end; ++ if (!(co = PyCode_NewEmpty(fn_cstr, name_cstr, fline))) goto end; ++ if (!(replace = PyObject_GetAttrString((PyObject*)co, "replace"))) goto cleanup_code_too; ++ if (!(empty = PyTuple_New(0))) goto cleanup_code_too; // unfortunately __pyx_empty_tuple isn't available here ++ if (!(call_result = PyObject_Call(replace, empty, kwds))) goto cleanup_code_too; ++ Py_XDECREF((PyObject*)co); ++ co = (PyCodeObject*)call_result; ++ call_result = NULL; ++ if (0) { ++ cleanup_code_too: ++ Py_XDECREF((PyObject*)co); ++ co = NULL; ++ } ++ end: ++ Py_XDECREF(kwds); ++ Py_XDECREF(argcount); ++ Py_XDECREF(posonlyargcount); ++ Py_XDECREF(kwonlyargcount); ++ Py_XDECREF(nlocals); ++ Py_XDECREF(stacksize); ++ Py_XDECREF(replace); ++ Py_XDECREF(call_result); ++ Py_XDECREF(empty); ++ if (type) { ++ PyErr_Restore(type, value, traceback); ++ } ++ return co; ++ } ++#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 +@@ -360,26 +491,6 @@ class __Pyx_FakeReference { + #else + #define __Pyx_PyFastCFunction_Check(func) 0 + #endif +-#if CYTHON_USE_DICT_VERSIONS +-#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);\ +- }\ +- } +-#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 + #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) +@@ -412,7 +523,7 @@ class __Pyx_FakeReference { + typedef int Py_tss_t; + static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); +- return 0; // PyThread_create_key reports success always ++ 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)); +@@ -435,7 +546,7 @@ static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); + } +-#endif // TSS (Thread Specific Storage) API ++#endif + #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) + #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) + #else +@@ -455,8 +566,12 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #endif + #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 ++ #if defined(PyUnicode_IS_READY) + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) ++ #else ++ #define __Pyx_PyUnicode_READY(op) (0) ++ #endif + #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) +@@ -464,7 +579,15 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) ++ #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) ++ #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) ++ #endif ++ #else ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) ++ #endif + #else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 +@@ -513,8 +636,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) +@@ -525,6 +650,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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 +@@ -558,13 +690,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong +- #define __Pyx_PyInt_AsHash_t PyInt_AsLong ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t + #else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t +- #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t + #endif + #if PY_MAJOR_VERSION >= 3 +- #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func)) ++ #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 +@@ -586,8 +718,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + } __Pyx_PyAsyncMethodsStruct; + #endif + +-#if defined(WIN32) || defined(MS_WINDOWS) +- #define _USE_MATH_DEFINES ++#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) ++ #if !defined(_USE_MATH_DEFINES) ++ #define _USE_MATH_DEFINES ++ #endif + #endif + #include + #ifdef NAN +@@ -605,11 +739,10 @@ static CYTHON_INLINE float __PYX_NAN() { + #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_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ +-} ++ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + + #ifndef __PYX_EXTERN_C + #ifdef __cplusplus +@@ -623,13 +756,25 @@ static CYTHON_INLINE float __PYX_NAN() { + #define __PYX_HAVE_API__khmer___oxli__graphs + /* Early includes */ + #include ++#include + #include "ios" + #include "new" + #include "stdexcept" + #include "typeinfo" +-#include + #include + #include ++ ++ #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600) ++ // move should be defined for these versions of MSVC, but __cplusplus isn't set usefully ++ #include ++ ++ namespace cython_std { ++ template typename std::remove_reference::type&& move(T& t) noexcept { return std::move(t); } ++ template typename std::remove_reference::type&& move(T&& t) noexcept { return std::move(t); } ++ } ++ ++ #endif ++ + #include + #include + #include +@@ -662,10 +807,11 @@ typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* enc + 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_DEFAULT 0 +-#define __PYX_DEFAULT_STRING_ENCODING "utf8" +-#define __Pyx_PyObject_FromString __Pyx_PyUnicode_FromString +-#define __Pyx_PyObject_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize ++#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) (\ +@@ -745,6 +891,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); + (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); ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); + #if CYTHON_ASSUME_SAFE_MACROS + #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) + #else +@@ -1621,6 +1768,32 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject + /* GetBuiltinName.proto */ + static PyObject *__Pyx_GetBuiltinName(PyObject *name); + ++/* 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 ++ + /* PyCFunctionFastCall.proto */ + #if CYTHON_FAST_PYCCALL + static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); +@@ -1633,7 +1806,7 @@ static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObje + #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, int nargs, PyObject *kwargs); ++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 +@@ -1642,13 +1815,21 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + #ifndef Py_MEMBER_SIZE + #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) + #endif ++#if CYTHON_FAST_PYCALL + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + #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 // CYTHON_FAST_PYCALL + #endif + + /* PyObjectCall.proto */ +@@ -1736,10 +1917,6 @@ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ + const char* function_name); + +-/* PyUnicode_Substring.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring( +- PyObject* text, Py_ssize_t start, Py_ssize_t stop); +- + /* GetModuleGlobalName.proto */ + #if CYTHON_USE_DICT_VERSIONS + #define __Pyx_GetModuleGlobalName(var, name) {\ +@@ -1769,7 +1946,7 @@ static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { + if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); +- Py_SIZE(list) = len+1; ++ __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +@@ -1792,7 +1969,7 @@ static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { + if (likely(L->allocated > len)) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); +- Py_SIZE(list) = len+1; ++ __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +@@ -1827,6 +2004,17 @@ static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_nam + /* SetVTable.proto */ + static int __Pyx_SetVtable(PyObject *dict, void *vtable); + ++/* 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 ++ ++/* PyObjectGetAttrStrNoError.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); ++ + /* SetupReduce.proto */ + static int __Pyx_setup_reduce(PyObject* type_obj); + +@@ -1852,15 +2040,7 @@ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + + /* ClassMethod.proto */ + #include "descrobject.h" +-static PyObject* __Pyx_Method_ClassMethod(PyObject *method); +- +-/* 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 ++static CYTHON_UNUSED PyObject* __Pyx_Method_ClassMethod(PyObject *method); + + /* GetNameInClass.proto */ + #define __Pyx_GetNameInClass(var, nmspace, name) (var) = __Pyx__GetNameInClass(nmspace, name) +@@ -1895,29 +2075,10 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + /* None.proto */ + #include + +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_HashIntoType(oxli::HashIntoType value); +- +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_BoundedCounterType(oxli::BoundedCounterType value); +- +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_WordLength(oxli::WordLength value); +- +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint64_t(uint64_t value); +- +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint32_t(uint32_t value); +- +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); +- +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value); +- +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_PY_LONG_LONG(unsigned PY_LONG_LONG value); ++/* GCCDiagnostics.proto */ ++#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) ++#define __Pyx_HAS_GCC_DIAGNOSTIC ++#endif + + /* CppExceptionConversion.proto */ + #ifndef __Pyx_CppExn2PyErr +@@ -1961,15 +2122,6 @@ static void __Pyx_CppExn2PyErr() { + } + #endif + +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); +- +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_PartitionID(oxli::PartitionID value); +- +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_long(unsigned long value); +- + /* CIntFromPy.proto */ + static CYTHON_INLINE oxli::HashIntoType __Pyx_PyInt_As_oxli_3a__3a_HashIntoType(PyObject *); + +@@ -1988,6 +2140,39 @@ static CYTHON_INLINE oxli::PartitionID __Pyx_PyInt_As_oxli_3a__3a_PartitionID(Py + /* CIntFromPy.proto */ + static CYTHON_INLINE oxli::BoundedCounterType __Pyx_PyInt_As_oxli_3a__3a_BoundedCounterType(PyObject *); + ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_HashIntoType(oxli::HashIntoType value); ++ ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_BoundedCounterType(oxli::BoundedCounterType value); ++ ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_WordLength(oxli::WordLength value); ++ ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint64_t(uint64_t value); ++ ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint32_t(uint32_t value); ++ ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); ++ ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value); ++ ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_PY_LONG_LONG(unsigned PY_LONG_LONG value); ++ ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); ++ ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_PartitionID(oxli::PartitionID value); ++ ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_long(unsigned long value); ++ + /* CIntFromPy.proto */ + static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *); + +@@ -2063,6 +2248,7 @@ typedef struct { + PyObject *gi_qualname; + PyObject *gi_modulename; + PyObject *gi_code; ++ PyObject *gi_frame; + int resume_label; + char is_running; + } __pyx_CoroutineObject; +@@ -2323,14 +2509,14 @@ static PyObject *__pyx_n_s_CYTHON_TABLES; + static PyObject *__pyx_n_s_Countgraph; + static PyObject *__pyx_n_s_Counttable; + static PyObject *__pyx_n_s_CyclicCounttable; +-static PyObject *__pyx_kp_u_Expected_k_mer_length_but_got; ++static PyObject *__pyx_kp_s_Expected_k_mer_length_but_got; + static PyObject *__pyx_n_s_Hashgraph; + static PyObject *__pyx_n_s_Hashgraph_iter_stop_tags; + static PyObject *__pyx_n_s_Hashgraph_tags; + static PyObject *__pyx_n_s_Hashtable; + static PyObject *__pyx_n_s_Nodegraph; + static PyObject *__pyx_n_s_Nodetable; +-static PyObject *__pyx_kp_u_Object_of_type_0_can_not_be_inte; ++static PyObject *__pyx_kp_s_Object_of_type_0_can_not_be_inte; + static PyObject *__pyx_n_s_QFCounttable; + static PyObject *__pyx_n_s_ReadParser; + static PyObject *__pyx_n_s_SmallCountgraph; +@@ -2340,7 +2526,7 @@ static PyObject *__pyx_n_s_ValueError; + static PyObject *__pyx_n_s_abundance; + static PyObject *__pyx_n_s_add; + static PyObject *__pyx_n_s_args; +-static PyObject *__pyx_kp_u_argument_does_not_appear_to_be_a; ++static PyObject *__pyx_kp_s_argument_does_not_appear_to_be_a; + static PyObject *__pyx_n_s_band; + static PyObject *__pyx_n_s_break_on_circumference; + static PyObject *__pyx_n_s_break_on_stop_tags; +@@ -2404,11 +2590,11 @@ static PyObject *__pyx_n_s_sanitize_seq_kmer; + static PyObject *__pyx_kp_s_self__ht_this_cannot_be_converte; + static PyObject *__pyx_n_s_send; + static PyObject *__pyx_n_s_sequence; +-static PyObject *__pyx_kp_u_sequence_length_must_the_hashtab; ++static PyObject *__pyx_kp_s_sequence_length_must_the_hashtab; + static PyObject *__pyx_n_s_setstate; + static PyObject *__pyx_n_s_setstate_cython; + static PyObject *__pyx_n_s_size; +-static PyObject *__pyx_kp_u_size_has_to_be_a_power_of_two_no; ++static PyObject *__pyx_kp_s_size_has_to_be_a_power_of_two_no; + static PyObject *__pyx_n_s_start_kmer; + static PyObject *__pyx_n_s_starting_size; + static PyObject *__pyx_n_s_stop_big_traversals; +@@ -2594,16 +2780,18 @@ static PyObject *__pyx_f_5khmer_5_oxli_6graphs_9Hashtable_sanitize_seq_kmer(stru + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("sanitize_seq_kmer", 0); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overridden in Python */ + else if (unlikely((Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0) || (Py_TYPE(((PyObject *)__pyx_v_self))->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) { +- #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP +- static PY_UINT64_T tp_dict_version = 0, obj_dict_version = 0; +- if (likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict && tp_dict_version == __PYX_GET_DICT_VERSION(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) && (!Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset || obj_dict_version == __PYX_GET_DICT_VERSION(_PyObject_GetDictPtr(((PyObject *)__pyx_v_self)))))); +- else { +- PY_UINT64_T type_dict_guard = (likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict)) ? __PYX_GET_DICT_VERSION(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) : 0; ++ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS ++ static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; ++ if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) { ++ PY_UINT64_T __pyx_type_dict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); + #endif + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_sanitize_seq_kmer); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 33, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); +@@ -2631,15 +2819,15 @@ static PyObject *__pyx_f_5khmer_5_oxli_6graphs_9Hashtable_sanitize_seq_kmer(stru + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } +- #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP +- tp_dict_version = likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) ? __PYX_GET_DICT_VERSION(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) : 0; +- obj_dict_version = likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset) ? __PYX_GET_DICT_VERSION(_PyObject_GetDictPtr(((PyObject *)__pyx_v_self))) : 0; +- if (unlikely(type_dict_guard != tp_dict_version)) { +- tp_dict_version = obj_dict_version = 0; ++ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS ++ __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); ++ __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self)); ++ if (unlikely(__pyx_type_dict_guard != __pyx_tp_dict_version)) { ++ __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; + } + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; +- #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP ++ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + } + #endif + } +@@ -2685,7 +2873,7 @@ static PyObject *__pyx_f_5khmer_5_oxli_6graphs_9Hashtable_sanitize_seq_kmer(stru + * return _bstring(kmer) + * + */ +- __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_u_Expected_k_mer_length_but_got, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 37, __pyx_L1_error) ++ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Expected_k_mer_length_but_got, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 37, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_ksize); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 37, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); +@@ -2820,7 +3008,7 @@ static PyObject *__pyx_f_5khmer_5_oxli_6graphs_9Hashtable_sanitize_seq_kmer(stru + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_1sanitize_seq_kmer(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_sanitize_seq_kmer[] = "Hashtable.sanitize_seq_kmer(self, kmer) -> bytes\nLength sanitize a string k-mer and return as bytes."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_sanitize_seq_kmer[] = "Length sanitize a string k-mer and return as bytes."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_1sanitize_seq_kmer(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -2836,6 +3024,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_sanitize_seq_kmer(str + 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("sanitize_seq_kmer", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_f_5khmer_5_oxli_6graphs_9Hashtable_sanitize_seq_kmer(__pyx_v_self, __pyx_v_kmer, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 33, __pyx_L1_error) +@@ -2876,16 +3067,18 @@ static PyObject *__pyx_f_5khmer_5_oxli_6graphs_9Hashtable_sanitize_kmer(struct _ + oxli::HashIntoType __pyx_t_6; + std::string __pyx_t_7; + int __pyx_t_8; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("sanitize_kmer", 0); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overridden in Python */ + else if (unlikely((Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0) || (Py_TYPE(((PyObject *)__pyx_v_self))->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) { +- #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP +- static PY_UINT64_T tp_dict_version = 0, obj_dict_version = 0; +- if (likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict && tp_dict_version == __PYX_GET_DICT_VERSION(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) && (!Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset || obj_dict_version == __PYX_GET_DICT_VERSION(_PyObject_GetDictPtr(((PyObject *)__pyx_v_self)))))); +- else { +- PY_UINT64_T type_dict_guard = (likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict)) ? __PYX_GET_DICT_VERSION(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) : 0; ++ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS ++ static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; ++ if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) { ++ PY_UINT64_T __pyx_type_dict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); + #endif + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_sanitize_kmer); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 40, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); +@@ -2913,15 +3106,15 @@ static PyObject *__pyx_f_5khmer_5_oxli_6graphs_9Hashtable_sanitize_kmer(struct _ + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } +- #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP +- tp_dict_version = likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) ? __PYX_GET_DICT_VERSION(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) : 0; +- obj_dict_version = likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset) ? __PYX_GET_DICT_VERSION(_PyObject_GetDictPtr(((PyObject *)__pyx_v_self))) : 0; +- if (unlikely(type_dict_guard != tp_dict_version)) { +- tp_dict_version = obj_dict_version = 0; ++ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS ++ __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); ++ __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self)); ++ if (unlikely(__pyx_type_dict_guard != __pyx_tp_dict_version)) { ++ __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; + } + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; +- #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP ++ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + } + #endif + } +@@ -3100,7 +3293,7 @@ static PyObject *__pyx_f_5khmer_5_oxli_6graphs_9Hashtable_sanitize_kmer(struct _ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_3sanitize_kmer(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_2sanitize_kmer[] = "Hashtable.sanitize_kmer(self, kmer) -> bytes\nType and length sanitize a k-mer and return as bytes, reverse\n hashing if necessary."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_2sanitize_kmer[] = "Type and length sanitize a k-mer and return as bytes, reverse\n hashing if necessary."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_3sanitize_kmer(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -3116,6 +3309,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_2sanitize_kmer(struct + 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("sanitize_kmer", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_f_5khmer_5_oxli_6graphs_9Hashtable_sanitize_kmer(__pyx_v_self, __pyx_v_kmer, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 40, __pyx_L1_error) +@@ -3153,6 +3349,9 @@ static oxli::HashIntoType __pyx_f_5khmer_5_oxli_6graphs_9Hashtable_sanitize_hash + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("sanitize_hash_kmer", 0); + + /* "khmer/_oxli/graphs.pyx":57 +@@ -3300,6 +3499,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_6graphs_9Hashtable__valid_sequence(struct + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_t_9; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_valid_sequence", 0); + + /* "khmer/_oxli/graphs.pyx":67 +@@ -3309,11 +3511,7 @@ static PyObject *__pyx_f_5khmer_5_oxli_6graphs_9Hashtable__valid_sequence(struct + * raise ValueError("sequence length ({}) must >= the hashtable " + * "k-mer size ({})".format(len(sequence), + */ +- if (unlikely(__pyx_v_sequence == Py_None)) { +- PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); +- __PYX_ERR(1, 67, __pyx_L1_error) +- } +- __pyx_t_1 = __Pyx_PyUnicode_GET_LENGTH(__pyx_v_sequence); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(1, 67, __pyx_L1_error) ++ __pyx_t_1 = PyObject_Length(__pyx_v_sequence); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(1, 67, __pyx_L1_error) + __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 67, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_ksize); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 67, __pyx_L1_error) +@@ -3347,13 +3545,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_6graphs_9Hashtable__valid_sequence(struct + * self.ksize())) + * return _bstring(sequence) + */ +- __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_kp_u_sequence_length_must_the_hashtab, __pyx_n_s_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 69, __pyx_L1_error) ++ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_sequence_length_must_the_hashtab, __pyx_n_s_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 69, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); +- if (unlikely(__pyx_v_sequence == Py_None)) { +- PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); +- __PYX_ERR(1, 69, __pyx_L1_error) +- } +- __pyx_t_1 = __Pyx_PyUnicode_GET_LENGTH(__pyx_v_sequence); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(1, 69, __pyx_L1_error) ++ __pyx_t_1 = PyObject_Length(__pyx_v_sequence); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(1, 69, __pyx_L1_error) + __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 69, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + +@@ -3508,6 +3702,9 @@ static oxli::Kmer __pyx_f_5khmer_5_oxli_6graphs_9Hashtable__build_kmer(struct __ + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + char const *__pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_build_kmer", 0); + + /* "khmer/_oxli/graphs.pyx":75 +@@ -3596,7 +3793,6 @@ static oxli::Kmer __pyx_f_5khmer_5_oxli_6graphs_9Hashtable__build_kmer(struct __ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_5_kmer_type_error(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_4_kmer_type_error[] = "Hashtable._kmer_type_error(self, kmer)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_5_kmer_type_error(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -3614,6 +3810,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_4_kmer_type_error(CYT + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_kmer_type_error", 0); + + /* "khmer/_oxli/graphs.pyx":83 +@@ -3623,7 +3822,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_4_kmer_type_error(CYT + * + * def count(self, object kmer): + */ +- __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_u_Object_of_type_0_can_not_be_inte, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 83, __pyx_L1_error) ++ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Object_of_type_0_can_not_be_inte, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 83, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { +@@ -3685,7 +3884,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_4_kmer_type_error(CYT + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_7count(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_6count[] = "Hashtable.count(self, kmer)\nIncrement the count of this k-mer.\n\n Synonym for 'add'.\n "; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_6count[] = "Increment the count of this k-mer.\n\n Synonym for 'add'.\n "; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_7count(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -3703,6 +3902,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_6count(struct __pyx_o + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("count", 0); + + /* "khmer/_oxli/graphs.pyx":90 +@@ -3764,7 +3966,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_6count(struct __pyx_o + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_9add(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_8add[] = "Hashtable.add(self, kmer)\nIncrement the count of this k-mer\n\n `kmer` can be either a string or an integer representing the hashed\n value of the kmer.\n "; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_8add[] = "Increment the count of this k-mer\n\n `kmer` can be either a string or an integer representing the hashed\n value of the kmer.\n "; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_9add(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -3785,6 +3987,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_8add(struct __pyx_obj + PyObject *__pyx_t_4 = NULL; + oxli::HashIntoType __pyx_t_5; + PyObject *__pyx_t_6 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("add", 0); + + /* "khmer/_oxli/graphs.pyx":98 +@@ -3923,7 +4128,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_8add(struct __pyx_obj + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_11hash(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_10hash[] = "Hashtable.hash(self, kmer)\nCompute the hash of this k-mer."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_10hash[] = "Compute the hash of this k-mer."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_11hash(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -3943,6 +4148,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_10hash(struct __pyx_o + PyObject *__pyx_t_2 = NULL; + char const *__pyx_t_3; + oxli::HashIntoType __pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("hash", 0); + + /* "khmer/_oxli/graphs.pyx":107 +@@ -4043,9 +4251,12 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_10hash(struct __pyx_o + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_13reverse_hash(PyObject *__pyx_v_self, PyObject *__pyx_arg_kmer_hash); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_12reverse_hash[] = "Hashtable.reverse_hash(self, HashIntoType kmer_hash)\nTurn a k-mer hash back into a DNA k-mer, if possible."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_12reverse_hash[] = "Turn a k-mer hash back into a DNA k-mer, if possible."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_13reverse_hash(PyObject *__pyx_v_self, PyObject *__pyx_arg_kmer_hash) { + oxli::HashIntoType __pyx_v_kmer_hash; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("reverse_hash (wrapper)", 0); +@@ -4070,6 +4281,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_12reverse_hash(struct + __Pyx_RefNannyDeclarations + std::string __pyx_t_1; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("reverse_hash", 0); + + /* "khmer/_oxli/graphs.pyx":115 +@@ -4086,7 +4300,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_12reverse_hash(struct + oxli_raise_py_error(); if (!PyErr_Occurred())PyErr_SetString(PyExc_RuntimeError, "Error converting c++ exception."); + __PYX_ERR(1, 115, __pyx_L1_error) + } +- __pyx_t_2 = __pyx_convert_PyUnicode_string_to_py_std__in_string(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 115, __pyx_L1_error) ++ __pyx_t_2 = __pyx_convert_PyBytes_string_to_py_std__in_string(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 115, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; +@@ -4121,7 +4335,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_12reverse_hash(struct + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_15get(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_14get[] = "Hashtable.get(self, kmer)\nRetrieve the count for the given k-mer.\n\n `kmer` can be either a string or an integer representing the hashed\n value of the kmer.\n\n For Nodetables and Counttables, this function will fail if the\n supplied k-mer contains non-ACGT characters.\n "; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_14get[] = "Retrieve the count for the given k-mer.\n\n `kmer` can be either a string or an integer representing the hashed\n value of the kmer.\n\n For Nodetables and Counttables, this function will fail if the\n supplied k-mer contains non-ACGT characters.\n "; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_15get(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -4144,6 +4358,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_14get(struct __pyx_ob + oxli::HashIntoType __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get", 0); + + /* "khmer/_oxli/graphs.pyx":126 +@@ -4304,7 +4521,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_14get(struct __pyx_ob + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_17ksize(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_16ksize[] = "Hashtable.ksize(self)\nk-mer size"; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_16ksize[] = "k-mer size"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_17ksize(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -4320,6 +4537,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_16ksize(struct __pyx_ + 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("ksize", 0); + + /* "khmer/_oxli/graphs.pyx":137 +@@ -4365,7 +4585,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_16ksize(struct __pyx_ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_19hashsizes(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_18hashsizes[] = "Hashtable.hashsizes(self)\nSize of hash tables used."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_18hashsizes[] = "Size of hash tables used."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_19hashsizes(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -4381,6 +4601,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_18hashsizes(struct __ + 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("hashsizes", 0); + + /* "khmer/_oxli/graphs.pyx":141 +@@ -4426,12 +4649,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_18hashsizes(struct __ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_21get_kmers(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_20get_kmers[] = "Hashtable.get_kmers(self, unicode sequence)\nGenerate an ordered list of all k-mers in sequence."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_20get_kmers[] = "Generate an ordered list of all k-mers in sequence."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_21get_kmers(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_kmers (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(1, 143, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(1, 143, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_20get_kmers(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashtable *)__pyx_v_self), ((PyObject*)__pyx_v_sequence)); + + /* function exit code */ +@@ -4450,6 +4676,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_20get_kmers(struct __ + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_kmers", 0); + + /* "khmer/_oxli/graphs.pyx":145 +@@ -4518,12 +4747,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_20get_kmers(struct __ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_23consume(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_22consume[] = "Hashtable.consume(self, unicode sequence)\nIncrement the counts of all of the k-mers in the sequence."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_22consume[] = "Increment the counts of all of the k-mers in the sequence."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_23consume(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("consume (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(1, 150, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(1, 150, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_22consume(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashtable *)__pyx_v_self), ((PyObject*)__pyx_v_sequence)); + + /* function exit code */ +@@ -4541,6 +4773,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_22consume(struct __py + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("consume", 0); + + /* "khmer/_oxli/graphs.pyx":152 +@@ -4600,12 +4835,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_22consume(struct __py + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_25get_kmer_counts(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_24get_kmer_counts[] = "Hashtable.get_kmer_counts(self, unicode sequence)\nRetrieve an ordered list of the counts of all k-mers in sequence."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_24get_kmer_counts[] = "Retrieve an ordered list of the counts of all k-mers in sequence."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_25get_kmer_counts(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_kmer_counts (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(1, 155, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(1, 155, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_24get_kmer_counts(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashtable *)__pyx_v_self), ((PyObject*)__pyx_v_sequence)); + + /* function exit code */ +@@ -4624,6 +4862,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_24get_kmer_counts(str + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_kmer_counts", 0); + + /* "khmer/_oxli/graphs.pyx":157 +@@ -4692,12 +4933,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_24get_kmer_counts(str + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_27get_min_count(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_26get_min_count[] = "Hashtable.get_min_count(self, unicode sequence)\nGet the smallest count of all the k-mers in the string."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_26get_min_count[] = "Get the smallest count of all the k-mers in the string."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_27get_min_count(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_min_count (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(1, 162, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(1, 162, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_26get_min_count(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashtable *)__pyx_v_self), ((PyObject*)__pyx_v_sequence)); + + /* function exit code */ +@@ -4715,6 +4959,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_26get_min_count(struc + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_min_count", 0); + + /* "khmer/_oxli/graphs.pyx":164 +@@ -4774,12 +5021,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_26get_min_count(struc + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_29get_max_count(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_28get_max_count[] = "Hashtable.get_max_count(self, unicode sequence)\nGet the larget count of all the k-mers in the string."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_28get_max_count[] = "Get the larget count of all the k-mers in the string."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_29get_max_count(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_max_count (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(1, 167, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(1, 167, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_28get_max_count(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashtable *)__pyx_v_self), ((PyObject*)__pyx_v_sequence)); + + /* function exit code */ +@@ -4797,6 +5047,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_28get_max_count(struc + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_max_count", 0); + + /* "khmer/_oxli/graphs.pyx":169 +@@ -4856,12 +5109,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_28get_max_count(struc + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_31get_median_count(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_30get_median_count[] = "Hashtable.get_median_count(self, unicode sequence)\nmedian, average, and stddev of the k-mer counts in sequence."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_30get_median_count[] = "median, average, and stddev of the k-mer counts in sequence."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_31get_median_count(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_median_count (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(1, 172, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(1, 172, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_30get_median_count(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashtable *)__pyx_v_self), ((PyObject*)__pyx_v_sequence)); + + /* function exit code */ +@@ -4885,6 +5141,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_30get_median_count(st + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_median_count", 0); + + /* "khmer/_oxli/graphs.pyx":174 +@@ -5003,10 +5262,13 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_30get_median_count(st + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_33median_at_least(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_32median_at_least[] = "Hashtable.median_at_least(self, unicode sequence, int median)\nCheck if median k-mer count is at least the given value."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_32median_at_least[] = "Check if median k-mer count is at least the given value."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_33median_at_least(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_sequence = 0; + int __pyx_v_median; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("median_at_least (wrapper)", 0); +@@ -5056,7 +5318,7 @@ static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_33median_at_least(PyO + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(1, 182, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(1, 182, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_32median_at_least(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashtable *)__pyx_v_self), __pyx_v_sequence, __pyx_v_median); + + /* function exit code */ +@@ -5074,6 +5336,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_32median_at_least(str + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("median_at_least", 0); + + /* "khmer/_oxli/graphs.pyx":184 +@@ -5133,12 +5398,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_32median_at_least(str + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_35get_kmer_hashes(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_34get_kmer_hashes[] = "Hashtable.get_kmer_hashes(self, unicode sequence)\nRetrieve hashes of all k-mers in sequence.\n\n Hashes are returned in the same order as k-mers appear in sequence.\n "; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_34get_kmer_hashes[] = "Retrieve hashes of all k-mers in sequence.\n\n Hashes are returned in the same order as k-mers appear in sequence.\n "; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_35get_kmer_hashes(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_kmer_hashes (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(1, 187, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(1, 187, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_34get_kmer_hashes(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashtable *)__pyx_v_self), ((PyObject*)__pyx_v_sequence)); + + /* function exit code */ +@@ -5157,6 +5425,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_34get_kmer_hashes(str + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_kmer_hashes", 0); + + /* "khmer/_oxli/graphs.pyx":192 +@@ -5225,10 +5496,13 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_34get_kmer_hashes(str + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_37trim_on_abundance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_36trim_on_abundance[] = "Hashtable.trim_on_abundance(self, unicode sequence, int abundance)\nTrim sequence at first k-mer below the given abundance."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_36trim_on_abundance[] = "Trim sequence at first k-mer below the given abundance."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_37trim_on_abundance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_sequence = 0; + int __pyx_v_abundance; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("trim_on_abundance (wrapper)", 0); +@@ -5278,7 +5552,7 @@ static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_37trim_on_abundance(P + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(1, 197, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(1, 197, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_36trim_on_abundance(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashtable *)__pyx_v_self), __pyx_v_sequence, __pyx_v_abundance); + + /* function exit code */ +@@ -5299,6 +5573,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_36trim_on_abundance(s + std::string __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("trim_on_abundance", 0); + + /* "khmer/_oxli/graphs.pyx":199 +@@ -5335,7 +5612,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_36trim_on_abundance(s + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 201, __pyx_L1_error) + } +- __pyx_t_1 = __Pyx_PyUnicode_Substring(__pyx_v_sequence, 0, __pyx_v_trimmed_at); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 201, __pyx_L1_error) ++ __pyx_t_1 = PySequence_GetSlice(__pyx_v_sequence, 0, __pyx_v_trimmed_at); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 201, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_From_uint64_t(__pyx_v_trimmed_at); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 201, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); +@@ -5383,10 +5660,13 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_36trim_on_abundance(s + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_39trim_below_abundance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_38trim_below_abundance[] = "Hashtable.trim_below_abundance(self, unicode sequence, int abundance)\nTrim sequence at first k-mer above the given abundance."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_38trim_below_abundance[] = "Trim sequence at first k-mer above the given abundance."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_39trim_below_abundance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_sequence = 0; + int __pyx_v_abundance; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("trim_below_abundance (wrapper)", 0); +@@ -5436,7 +5716,7 @@ static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_39trim_below_abundanc + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(1, 203, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(1, 203, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_38trim_below_abundance(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashtable *)__pyx_v_self), __pyx_v_sequence, __pyx_v_abundance); + + /* function exit code */ +@@ -5457,6 +5737,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_38trim_below_abundanc + std::string __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("trim_below_abundance", 0); + + /* "khmer/_oxli/graphs.pyx":205 +@@ -5493,7 +5776,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_38trim_below_abundanc + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 207, __pyx_L1_error) + } +- __pyx_t_1 = __Pyx_PyUnicode_Substring(__pyx_v_sequence, 0, __pyx_v_trimmed_at); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 207, __pyx_L1_error) ++ __pyx_t_1 = PySequence_GetSlice(__pyx_v_sequence, 0, __pyx_v_trimmed_at); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 207, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_trimmed_at); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 207, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); +@@ -5541,10 +5824,13 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_38trim_below_abundanc + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_41find_spectral_error_positions(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_40find_spectral_error_positions[] = "Hashtable.find_spectral_error_positions(self, unicode sequence, int max_count)\nIdentify positions of low-abundance k-mers."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_40find_spectral_error_positions[] = "Identify positions of low-abundance k-mers."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_41find_spectral_error_positions(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_sequence = 0; + int __pyx_v_max_count; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("find_spectral_error_positions (wrapper)", 0); +@@ -5594,7 +5880,7 @@ static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_41find_spectral_error + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(1, 209, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(1, 209, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_40find_spectral_error_positions(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashtable *)__pyx_v_self), __pyx_v_sequence, __pyx_v_max_count); + + /* function exit code */ +@@ -5613,6 +5899,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_40find_spectral_error + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("find_spectral_error_positions", 0); + + /* "khmer/_oxli/graphs.pyx":211 +@@ -5700,6 +5989,9 @@ static oxli::read_parsers::FastxParserPtr __pyx_f_5khmer_5_oxli_6graphs_9Hashtab + std::shared_ptr > __pyx_t_7; + 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("_get_parser", 0); + + /* "khmer/_oxli/graphs.pyx":218 +@@ -5822,7 +6114,7 @@ static oxli::read_parsers::FastxParserPtr __pyx_f_5khmer_5_oxli_6graphs_9Hashtab + * return _parser + * + */ +- __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_kp_u_argument_does_not_appear_to_be_a, __pyx_n_s_format); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 226, __pyx_L1_error) ++ __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_argument_does_not_appear_to_be_a, __pyx_n_s_format); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_9 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_8))) { +@@ -5896,7 +6188,7 @@ static oxli::read_parsers::FastxParserPtr __pyx_f_5khmer_5_oxli_6graphs_9Hashtab + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_43consume_seqfile(PyObject *__pyx_v_self, PyObject *__pyx_v_parser_or_filename); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_42consume_seqfile[] = "Hashtable.consume_seqfile(self, parser_or_filename)\nCount all k-mers from file_name."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_42consume_seqfile[] = "Count all k-mers from file_name."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_43consume_seqfile(PyObject *__pyx_v_self, PyObject *__pyx_v_parser_or_filename) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -5918,6 +6210,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_42consume_seqfile(str + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("consume_seqfile", 0); + + /* "khmer/_oxli/graphs.pyx":232 +@@ -6065,12 +6360,14 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_42consume_seqfile(str + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_45consume_seqfile_with_mask(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_44consume_seqfile_with_mask[] = "Hashtable.consume_seqfile_with_mask(self, parser_or_filename, Hashtable mask, int threshold=0, bool consume_masked=False)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_45consume_seqfile_with_mask(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_parser_or_filename = 0; + struct __pyx_obj_5khmer_5_oxli_6graphs_Hashtable *__pyx_v_mask = 0; + int __pyx_v_threshold; + bool __pyx_v_consume_masked; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("consume_seqfile_with_mask (wrapper)", 0); +@@ -6191,6 +6488,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_44consume_seqfile_wit + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("consume_seqfile_with_mask", 0); + + /* "khmer/_oxli/graphs.pyx":244 +@@ -6347,11 +6647,14 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_44consume_seqfile_wit + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_47consume_seqfile_banding(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_46consume_seqfile_banding[] = "Hashtable.consume_seqfile_banding(self, parser_or_filename, int num_bands, int band)\nCount all k-mers from file_name."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_46consume_seqfile_banding[] = "Count all k-mers from file_name."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_47consume_seqfile_banding(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_parser_or_filename = 0; + int __pyx_v_num_bands; + int __pyx_v_band; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("consume_seqfile_banding (wrapper)", 0); +@@ -6428,6 +6731,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_46consume_seqfile_ban + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("consume_seqfile_banding", 0); + + /* "khmer/_oxli/graphs.pyx":257 +@@ -6575,7 +6881,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_46consume_seqfile_ban + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_49consume_seqfile_banding_with_mask(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_48consume_seqfile_banding_with_mask[] = "Hashtable.consume_seqfile_banding_with_mask(self, parser_or_filename, int num_bands, int band, Hashtable mask, int threshold=0, bool consume_masked=False)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_49consume_seqfile_banding_with_mask(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_parser_or_filename = 0; + int __pyx_v_num_bands; +@@ -6583,6 +6888,9 @@ static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_49consume_seqfile_ban + struct __pyx_obj_5khmer_5_oxli_6graphs_Hashtable *__pyx_v_mask = 0; + int __pyx_v_threshold; + bool __pyx_v_consume_masked; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("consume_seqfile_banding_with_mask (wrapper)", 0); +@@ -6723,6 +7031,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_48consume_seqfile_ban + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("consume_seqfile_banding_with_mask", 0); + + /* "khmer/_oxli/graphs.pyx":270 +@@ -6879,10 +7190,13 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_48consume_seqfile_ban + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_51abundance_distribution(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_50abundance_distribution[] = "Hashtable.abundance_distribution(self, parser_or_filename, Hashtable tracking)\nCalculate the k-mer abundance distribution over input reads."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_50abundance_distribution[] = "Calculate the k-mer abundance distribution over input reads."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_51abundance_distribution(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_parser_or_filename = 0; + struct __pyx_obj_5khmer_5_oxli_6graphs_Hashtable *__pyx_v_tracking = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("abundance_distribution (wrapper)", 0); +@@ -6959,6 +7273,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_50abundance_distribut + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("abundance_distribution", 0); + + /* "khmer/_oxli/graphs.pyx":285 +@@ -7122,7 +7439,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_50abundance_distribut + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_53save(PyObject *__pyx_v_self, PyObject *__pyx_v_file_name); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_52save[] = "Hashtable.save(self, file_name)\nSave the graph to the specified file."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_52save[] = "Save the graph to the specified file."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_53save(PyObject *__pyx_v_self, PyObject *__pyx_v_file_name) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -7139,6 +7456,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_52save(struct __pyx_o + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("save", 0); + + /* "khmer/_oxli/graphs.pyx":300 +@@ -7185,7 +7505,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_52save(struct __pyx_o + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_55load(PyObject *__pyx_v_cls, PyObject *__pyx_v_file_name); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_54load[] = "Hashtable.load(type cls, file_name)\nLoad the graph from the specified file."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_54load[] = "Load the graph from the specified file."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_55load(PyObject *__pyx_v_cls, PyObject *__pyx_v_file_name) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -7203,6 +7523,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_54load(PyTypeObject * + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("load", 0); + + /* "khmer/_oxli/graphs.pyx":305 +@@ -7278,7 +7601,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_54load(PyTypeObject * + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_57n_unique_kmers(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_56n_unique_kmers[] = "Hashtable.n_unique_kmers(self)\nEstimate of the number of unique kmers stored."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_56n_unique_kmers[] = "Estimate of the number of unique kmers stored."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_57n_unique_kmers(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -7294,6 +7617,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_56n_unique_kmers(stru + 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("n_unique_kmers", 0); + + /* "khmer/_oxli/graphs.pyx":311 +@@ -7339,7 +7665,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_56n_unique_kmers(stru + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_59n_occupied(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_58n_occupied[] = "Hashtable.n_occupied(self)\nEstimate of the number of occupied slots in the storage."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_58n_occupied[] = "Estimate of the number of occupied slots in the storage."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_59n_occupied(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -7355,6 +7681,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_58n_occupied(struct _ + 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("n_occupied", 0); + + /* "khmer/_oxli/graphs.pyx":315 +@@ -7400,7 +7729,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_58n_occupied(struct _ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_61n_tables(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_60n_tables[] = "Hashtable.n_tables(self)\nNumber of tables used in the storage."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_60n_tables[] = "Number of tables used in the storage."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_61n_tables(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -7416,6 +7745,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_60n_tables(struct __p + 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("n_tables", 0); + + /* "khmer/_oxli/graphs.pyx":319 +@@ -7461,7 +7793,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_60n_tables(struct __p + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_63set_use_bigcount(PyObject *__pyx_v_self, PyObject *__pyx_v_bigcount); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_62set_use_bigcount[] = "Hashtable.set_use_bigcount(self, bigcount)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_63set_use_bigcount(PyObject *__pyx_v_self, PyObject *__pyx_v_bigcount) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -7477,6 +7808,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_62set_use_bigcount(st + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + bool __pyx_t_1; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("set_use_bigcount", 0); + + /* "khmer/_oxli/graphs.pyx":322 +@@ -7524,7 +7858,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_62set_use_bigcount(st + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_65get_use_bigcount(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_64get_use_bigcount[] = "Hashtable.get_use_bigcount(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_65get_use_bigcount(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -7540,6 +7873,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_64get_use_bigcount(st + 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("get_use_bigcount", 0); + + /* "khmer/_oxli/graphs.pyx":325 +@@ -7585,12 +7921,14 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_64get_use_bigcount(st + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_67get_kmer_hashes_as_hashset(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_66get_kmer_hashes_as_hashset[] = "Hashtable.get_kmer_hashes_as_hashset(self, unicode sequence)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_67get_kmer_hashes_as_hashset(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_kmer_hashes_as_hashset (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(1, 327, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(1, 327, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_66get_kmer_hashes_as_hashset(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashtable *)__pyx_v_self), ((PyObject*)__pyx_v_sequence)); + + /* function exit code */ +@@ -7610,6 +7948,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_66get_kmer_hashes_as_ + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + std::string __pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_kmer_hashes_as_hashset", 0); + + /* "khmer/_oxli/graphs.pyx":328 +@@ -7718,6 +8059,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_6graphs_9Hashtable__get_raw_tables(CYTHON + Py_ssize_t __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_get_raw_tables", 0); + + /* "khmer/_oxli/graphs.pyx":336 +@@ -7821,7 +8165,6 @@ static PyObject *__pyx_f_5khmer_5_oxli_6graphs_9Hashtable__get_raw_tables(CYTHON + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_69get_raw_tables(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_68get_raw_tables[] = "Hashtable.get_raw_tables(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_69get_raw_tables(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -7839,6 +8182,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_68get_raw_tables(stru + 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("get_raw_tables", 0); + + /* "khmer/_oxli/graphs.pyx":345 +@@ -7900,7 +8246,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_68get_raw_tables(stru + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_71__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_70__reduce_cython__[] = "Hashtable.__reduce_cython__(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_71__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -7916,6 +8261,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_70__reduce_cython__(C + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -7955,7 +8303,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_70__reduce_cython__(C + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_73__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_72__setstate_cython__[] = "Hashtable.__setstate_cython__(self, __pyx_state)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_73__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -7971,6 +8318,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashtable_72__setstate_cython__ + 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)":4 +@@ -8014,6 +8364,9 @@ static int __pyx_pw_5khmer_5_oxli_6graphs_12QFCounttable_1__cinit__(PyObject *__ + static int __pyx_pw_5khmer_5_oxli_6graphs_12QFCounttable_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + int __pyx_v_k; + uint64_t __pyx_v_size; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -8084,6 +8437,9 @@ static int __pyx_pf_5khmer_5_oxli_6graphs_12QFCounttable___cinit__(struct __pyx_ + PyObject *__pyx_t_8 = NULL; + uint64_t __pyx_t_9; + std::shared_ptr __pyx_t_10; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "khmer/_oxli/graphs.pyx":375 +@@ -8137,7 +8493,7 @@ static int __pyx_pf_5khmer_5_oxli_6graphs_12QFCounttable___cinit__(struct __pyx_ + * if type(self) is QFCounttable: + * self._qf_this = make_shared[CpQFCounttable](k, log(size, 2)) + */ +- __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_kp_u_size_has_to_be_a_power_of_two_no, __pyx_n_s_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 379, __pyx_L1_error) ++ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_size_has_to_be_a_power_of_two_no, __pyx_n_s_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 379, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyInt_From_uint64_t(__pyx_v_size); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 379, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); +@@ -8313,7 +8669,7 @@ static int __pyx_pf_5khmer_5_oxli_6graphs_12QFCounttable___cinit__(struct __pyx_ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_12QFCounttable_3load(PyObject *__pyx_v_cls, PyObject *__pyx_v_file_name); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_12QFCounttable_2load[] = "QFCounttable.load(type cls, file_name)\nLoad the graph from the specified file."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_12QFCounttable_2load[] = "Load the graph from the specified file."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_12QFCounttable_3load(PyObject *__pyx_v_cls, PyObject *__pyx_v_file_name) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -8331,6 +8687,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_12QFCounttable_2load(PyTypeObjec + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("load", 0); + + /* "khmer/_oxli/graphs.pyx":388 +@@ -8404,7 +8763,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_12QFCounttable_2load(PyTypeObjec + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_12QFCounttable_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_12QFCounttable_4__reduce_cython__[] = "QFCounttable.__reduce_cython__(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_12QFCounttable_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -8420,6 +8778,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_12QFCounttable_4__reduce_cython_ + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -8459,7 +8820,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_12QFCounttable_4__reduce_cython_ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_12QFCounttable_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_12QFCounttable_6__setstate_cython__[] = "QFCounttable.__setstate_cython__(self, __pyx_state)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_12QFCounttable_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -8475,6 +8835,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_12QFCounttable_6__setstate_cytho + 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)":4 +@@ -8520,6 +8883,9 @@ static int __pyx_pw_5khmer_5_oxli_6graphs_10Counttable_1__cinit__(PyObject *__py + uint64_t __pyx_v_starting_size; + int __pyx_v_n_tables; + PyObject *__pyx_v_primes = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -8631,6 +8997,9 @@ static int __pyx_pf_5khmer_5_oxli_6graphs_10Counttable___cinit__(struct __pyx_ob + int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + std::shared_ptr __pyx_t_11; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + __Pyx_INCREF(__pyx_v_primes); + +@@ -8843,7 +9212,6 @@ static int __pyx_pf_5khmer_5_oxli_6graphs_10Counttable___cinit__(struct __pyx_ob + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_10Counttable_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_10Counttable_2__reduce_cython__[] = "Counttable.__reduce_cython__(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_10Counttable_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -8859,6 +9227,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_10Counttable_2__reduce_cython__( + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -8898,7 +9269,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_10Counttable_2__reduce_cython__( + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_10Counttable_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_10Counttable_4__setstate_cython__[] = "Counttable.__setstate_cython__(self, __pyx_state)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_10Counttable_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -8914,6 +9284,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_10Counttable_4__setstate_cython_ + 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)":4 +@@ -8959,6 +9332,9 @@ static int __pyx_pw_5khmer_5_oxli_6graphs_16CyclicCounttable_1__cinit__(PyObject + uint64_t __pyx_v_starting_size; + int __pyx_v_n_tables; + PyObject *__pyx_v_primes = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -9070,6 +9446,9 @@ static int __pyx_pf_5khmer_5_oxli_6graphs_16CyclicCounttable___cinit__(struct __ + int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + std::shared_ptr __pyx_t_11; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + __Pyx_INCREF(__pyx_v_primes); + +@@ -9282,7 +9661,6 @@ static int __pyx_pf_5khmer_5_oxli_6graphs_16CyclicCounttable___cinit__(struct __ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_16CyclicCounttable_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_16CyclicCounttable_2__reduce_cython__[] = "CyclicCounttable.__reduce_cython__(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_16CyclicCounttable_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -9298,6 +9676,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_16CyclicCounttable_2__reduce_cyt + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -9337,7 +9718,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_16CyclicCounttable_2__reduce_cyt + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_16CyclicCounttable_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_16CyclicCounttable_4__setstate_cython__[] = "CyclicCounttable.__setstate_cython__(self, __pyx_state)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_16CyclicCounttable_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -9353,6 +9733,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_16CyclicCounttable_4__setstate_c + 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)":4 +@@ -9398,6 +9781,9 @@ static int __pyx_pw_5khmer_5_oxli_6graphs_15SmallCounttable_1__cinit__(PyObject + uint64_t __pyx_v_starting_size; + int __pyx_v_n_tables; + PyObject *__pyx_v_primes = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -9509,6 +9895,9 @@ static int __pyx_pf_5khmer_5_oxli_6graphs_15SmallCounttable___cinit__(struct __p + int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + std::shared_ptr __pyx_t_11; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + __Pyx_INCREF(__pyx_v_primes); + +@@ -9723,7 +10112,6 @@ static int __pyx_pf_5khmer_5_oxli_6graphs_15SmallCounttable___cinit__(struct __p + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_15SmallCounttable_3get_raw_tables(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_15SmallCounttable_2get_raw_tables[] = "SmallCounttable.get_raw_tables(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_15SmallCounttable_3get_raw_tables(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -9745,6 +10133,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_15SmallCounttable_2get_raw_table + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_raw_tables", 0); + + /* "khmer/_oxli/graphs.pyx":440 +@@ -9831,7 +10222,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_15SmallCounttable_2get_raw_table + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_15SmallCounttable_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_15SmallCounttable_4__reduce_cython__[] = "SmallCounttable.__reduce_cython__(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_15SmallCounttable_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -9847,6 +10237,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_15SmallCounttable_4__reduce_cyth + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -9886,7 +10279,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_15SmallCounttable_4__reduce_cyth + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_15SmallCounttable_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_15SmallCounttable_6__setstate_cython__[] = "SmallCounttable.__setstate_cython__(self, __pyx_state)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_15SmallCounttable_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -9902,6 +10294,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_15SmallCounttable_6__setstate_cy + 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)":4 +@@ -9947,6 +10342,9 @@ static int __pyx_pw_5khmer_5_oxli_6graphs_9Nodetable_1__cinit__(PyObject *__pyx_ + uint64_t __pyx_v_starting_size; + int __pyx_v_n_tables; + PyObject *__pyx_v_primes = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -10058,6 +10456,9 @@ static int __pyx_pf_5khmer_5_oxli_6graphs_9Nodetable___cinit__(struct __pyx_obj_ + int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + std::shared_ptr __pyx_t_11; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + __Pyx_INCREF(__pyx_v_primes); + +@@ -10270,7 +10671,6 @@ static int __pyx_pf_5khmer_5_oxli_6graphs_9Nodetable___cinit__(struct __pyx_obj_ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Nodetable_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Nodetable_2__reduce_cython__[] = "Nodetable.__reduce_cython__(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Nodetable_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -10286,6 +10686,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Nodetable_2__reduce_cython__(CY + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -10325,7 +10728,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Nodetable_2__reduce_cython__(CY + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Nodetable_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Nodetable_4__setstate_cython__[] = "Nodetable.__setstate_cython__(self, __pyx_state)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Nodetable_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -10341,6 +10743,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Nodetable_4__setstate_cython__( + 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)":4 +@@ -10459,6 +10864,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_9partition___get__(st + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + std::shared_ptr __pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "khmer/_oxli/graphs.pyx":470 +@@ -10557,7 +10965,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_9partition___get__(st + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_3neighbors(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_2neighbors[] = "Hashgraph.neighbors(self, kmer)\nGet a list of neighbor nodes for this k-mer."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_2neighbors[] = "Get a list of neighbor nodes for this k-mer."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_3neighbors(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -10576,6 +10984,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_2neighbors(struct __p + PyObject *__pyx_t_1 = NULL; + oxli::Kmer __pyx_t_2; + PyObject *__pyx_t_3 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("neighbors", 0); + + /* "khmer/_oxli/graphs.pyx":478 +@@ -10639,11 +11050,14 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_2neighbors(struct __p + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_5calc_connected_graph_size(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_4calc_connected_graph_size[] = "Hashgraph.calc_connected_graph_size(self, kmer, max_size=0, break_on_circumference=False)\nFind the number of nodes connected to this k-mer."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_4calc_connected_graph_size[] = "Find the number of nodes connected to this k-mer."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_5calc_connected_graph_size(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_kmer = 0; + PyObject *__pyx_v_max_size = 0; + PyObject *__pyx_v_break_on_circumference = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("calc_connected_graph_size (wrapper)", 0); +@@ -10745,6 +11159,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_4calc_connected_graph + oxli::Kmer __pyx_t_2; + uint64_t __pyx_t_3; + bool __pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("calc_connected_graph_size", 0); + + /* "khmer/_oxli/graphs.pyx":484 +@@ -10885,7 +11302,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_4calc_connected_graph + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_7kmer_degree(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_6kmer_degree[] = "Hashgraph.kmer_degree(self, kmer)\nCalculate the number of immediate neighbors this k-mer has\n the graph."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_6kmer_degree[] = "Calculate the number of immediate neighbors this k-mer has\n the graph."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_7kmer_degree(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -10903,6 +11320,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_6kmer_degree(struct _ + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + char const *__pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("kmer_degree", 0); + + /* "khmer/_oxli/graphs.pyx":500 +@@ -10966,11 +11386,14 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_6kmer_degree(struct _ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_9count_kmers_within_radius(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_8count_kmers_within_radius[] = "Hashgraph.count_kmers_within_radius(self, kmer, int radius, int max_count=0)\nCalculate the number of neighbors with given radius in the graph."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_8count_kmers_within_radius[] = "Calculate the number of neighbors with given radius in the graph."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_9count_kmers_within_radius(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_kmer = 0; + int __pyx_v_radius; + int __pyx_v_max_count; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("count_kmers_within_radius (wrapper)", 0); +@@ -11055,6 +11478,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_8count_kmers_within_r + __Pyx_RefNannyDeclarations + oxli::Kmer __pyx_t_1; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("count_kmers_within_radius", 0); + + /* "khmer/_oxli/graphs.pyx":506 +@@ -11181,12 +11607,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_8count_kmers_within_r + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_11find_high_degree_nodes(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_10find_high_degree_nodes[] = "Hashgraph.find_high_degree_nodes(self, unicode sequence)\nExamine the given sequence for degree > 2 nodes and add to\n list; used in graph contraction."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_10find_high_degree_nodes[] = "Examine the given sequence for degree > 2 nodes and add to\n list; used in graph contraction."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_11find_high_degree_nodes(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("find_high_degree_nodes (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(1, 516, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(1, 516, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_10find_high_degree_nodes(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *)__pyx_v_self), ((PyObject*)__pyx_v_sequence)); + + /* function exit code */ +@@ -11207,6 +11636,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_10find_high_degree_no + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + char const *__pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("find_high_degree_nodes", 0); + + /* "khmer/_oxli/graphs.pyx":519 +@@ -11318,11 +11750,14 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_10find_high_degree_no + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_13traverse_linear_path(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_12traverse_linear_path[] = "Hashgraph.traverse_linear_path(self, kmer, HashSet hdns, Nodegraph stop_filter=None)\nTraverse the path through the graph starting with the given\n k-mer and avoiding high-degree nodes, finding (and returning)\n traversed k-mers and any encountered high-degree nodes."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_12traverse_linear_path[] = "Traverse the path through the graph starting with the given\n k-mer and avoiding high-degree nodes, finding (and returning)\n traversed k-mers and any encountered high-degree nodes."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_13traverse_linear_path(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_kmer = 0; + struct __pyx_obj_5khmer_5_oxli_7hashset_HashSet *__pyx_v_hdns = 0; + struct __pyx_obj_5khmer_5_oxli_6graphs_Nodegraph *__pyx_v_stop_filter = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("traverse_linear_path (wrapper)", 0); +@@ -11427,6 +11862,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_12traverse_linear_pat + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + oxli::Kmer __pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("traverse_linear_path", 0); + + /* "khmer/_oxli/graphs.pyx":531 +@@ -11575,11 +12013,13 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_12traverse_linear_pat + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_15extract_unique_paths(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_14extract_unique_paths[] = "Hashgraph.extract_unique_paths(self, unicode sequence, unsigned int min_length, float min_unique_f)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_15extract_unique_paths(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_sequence = 0; + unsigned int __pyx_v_min_length; + float __pyx_v_min_unique_f; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("extract_unique_paths (wrapper)", 0); +@@ -11639,7 +12079,7 @@ static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_15extract_unique_path + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(1, 542, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(1, 542, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_14extract_unique_paths(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *)__pyx_v_self), __pyx_v_sequence, __pyx_v_min_length, __pyx_v_min_unique_f); + + /* function exit code */ +@@ -11657,6 +12097,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_14extract_unique_path + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("extract_unique_paths", 0); + + /* "khmer/_oxli/graphs.pyx":545 +@@ -11723,12 +12166,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_14extract_unique_path + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_17consume_and_tag(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_16consume_and_tag[] = "Hashgraph.consume_and_tag(self, unicode sequence)\nConsume a sequence and tag it."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_16consume_and_tag[] = "Consume a sequence and tag it."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_17consume_and_tag(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("consume_and_tag (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(1, 549, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(1, 549, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_16consume_and_tag(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *)__pyx_v_self), ((PyObject*)__pyx_v_sequence)); + + /* function exit code */ +@@ -11746,6 +12192,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_16consume_and_tag(str + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("consume_and_tag", 0); + + /* "khmer/_oxli/graphs.pyx":551 +@@ -11821,12 +12270,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_16consume_and_tag(str + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_19get_tags_and_positions(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_18get_tags_and_positions[] = "Hashgraph.get_tags_and_positions(self, unicode sequence)\nRetrieve tags and their positions in a sequence."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_18get_tags_and_positions[] = "Retrieve tags and their positions in a sequence."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_19get_tags_and_positions(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_tags_and_positions (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(1, 556, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(1, 556, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_18get_tags_and_positions(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *)__pyx_v_self), ((PyObject*)__pyx_v_sequence)); + + /* function exit code */ +@@ -11855,6 +12307,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_18get_tags_and_positi + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + int __pyx_t_10; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_tags_and_positions", 0); + + /* "khmer/_oxli/graphs.pyx":558 +@@ -11885,11 +12340,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_18get_tags_and_positi + * kmer = deref(self._hg_this).hash_dna(_bstring(sequence[pos:pos+K])) + * if deref(self._hg_this).has_tag(kmer): + */ +- if (unlikely(__pyx_v_sequence == Py_None)) { +- PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); +- __PYX_ERR(1, 562, __pyx_L1_error) +- } +- __pyx_t_2 = __Pyx_PyUnicode_GET_LENGTH(__pyx_v_sequence); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(1, 562, __pyx_L1_error) ++ __pyx_t_2 = PyObject_Length(__pyx_v_sequence); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(1, 562, __pyx_L1_error) + __pyx_t_3 = ((__pyx_t_2 - __pyx_v_K) + 1); + __pyx_t_2 = __pyx_t_3; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_2; __pyx_t_4+=1) { +@@ -11906,7 +12357,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_18get_tags_and_positi + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 563, __pyx_L1_error) + } +- __pyx_t_1 = __Pyx_PyUnicode_Substring(__pyx_v_sequence, __pyx_v_pos, (__pyx_v_pos + __pyx_v_K)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 563, __pyx_L1_error) ++ __pyx_t_1 = PySequence_GetSlice(__pyx_v_sequence, __pyx_v_pos, (__pyx_v_pos + __pyx_v_K)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 563, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = __pyx_f_5khmer_5_oxli_5utils__bstring(__pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 563, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); +@@ -12011,12 +12462,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_18get_tags_and_positi + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_21get_tags_for_sequence(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_20get_tags_for_sequence[] = "Hashgraph.get_tags_for_sequence(self, unicode sequence)\nGet the tags present in a sequence."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_20get_tags_for_sequence[] = "Get the tags present in a sequence."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_21get_tags_for_sequence(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_tags_for_sequence (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(1, 568, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(1, 568, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_20get_tags_for_sequence(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *)__pyx_v_self), ((PyObject*)__pyx_v_sequence)); + + /* function exit code */ +@@ -12037,6 +12491,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_20get_tags_for_sequen + std::string __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_tags_for_sequence", 0); + + /* "khmer/_oxli/graphs.pyx":570 +@@ -12135,7 +12592,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_20get_tags_for_sequen + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_23find_all_tags_list(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_22find_all_tags_list[] = "Hashgraph.find_all_tags_list(self, kmer)\nFind all tags within range of the given k-mer, return as list"; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_22find_all_tags_list[] = "Find all tags within range of the given k-mer, return as list"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_23find_all_tags_list(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -12159,6 +12616,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_22find_all_tags_list( + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + std::shared_ptr __pyx_t_5; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("find_all_tags_list", 0); + + /* "khmer/_oxli/graphs.pyx":577 +@@ -12326,7 +12786,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_22find_all_tags_list( + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_25consume_seqfile_and_tag(PyObject *__pyx_v_self, PyObject *__pyx_v_parser_or_filename); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_24consume_seqfile_and_tag[] = "Hashgraph.consume_seqfile_and_tag(self, parser_or_filename)\nConsume all sequences in a FASTA/FASTQ file and tag the resulting\n graph."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_24consume_seqfile_and_tag[] = "Consume all sequences in a FASTA/FASTQ file and tag the resulting\n graph."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_25consume_seqfile_and_tag(PyObject *__pyx_v_self, PyObject *__pyx_v_parser_or_filename) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -12348,6 +12808,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_24consume_seqfile_and + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("consume_seqfile_and_tag", 0); + + /* "khmer/_oxli/graphs.pyx":591 +@@ -12477,12 +12940,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_24consume_seqfile_and + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_27print_tagset(PyObject *__pyx_v_self, PyObject *__pyx_v_filename); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_26print_tagset[] = "Hashgraph.print_tagset(self, unicode filename)\nPrint out all of the tags."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_26print_tagset[] = "Print out all of the tags."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_27print_tagset(PyObject *__pyx_v_self, PyObject *__pyx_v_filename) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("print_tagset (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyUnicode_Type), 1, "filename", 1))) __PYX_ERR(1, 603, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyString_Type), 1, "filename", 1))) __PYX_ERR(1, 603, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_26print_tagset(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *)__pyx_v_self), ((PyObject*)__pyx_v_filename)); + + /* function exit code */ +@@ -12499,6 +12965,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_26print_tagset(struct + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("print_tagset", 0); + + /* "khmer/_oxli/graphs.pyx":605 +@@ -12545,7 +13014,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_26print_tagset(struct + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_29add_tag(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_28add_tag[] = "Hashgraph.add_tag(self, kmer)\nAdd a k-mer to the tagset."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_28add_tag[] = "Add a k-mer to the tagset."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_29add_tag(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -12562,6 +13031,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_28add_tag(struct __py + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + oxli::HashIntoType __pyx_t_1; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("add_tag", 0); + + /* "khmer/_oxli/graphs.pyx":609 +@@ -12613,7 +13085,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_28add_tag(struct __py + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_31get_tagset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_30get_tagset[] = "Hashgraph.get_tagset(self)\nGet all tagged k-mers as DNA strings."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_30get_tagset[] = "Get all tagged k-mers as DNA strings."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_31get_tagset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -12636,6 +13108,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_30get_tagset(struct _ + oxli::HashIntoType __pyx_t_4; + std::string __pyx_t_5; + int __pyx_t_6; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_tagset", 0); + + /* "khmer/_oxli/graphs.pyx":615 +@@ -12678,7 +13153,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_30get_tagset(struct _ + oxli_raise_py_error(); if (!PyErr_Occurred())PyErr_SetString(PyExc_RuntimeError, "Error converting c++ exception."); + __PYX_ERR(1, 617, __pyx_L1_error) + } +- __pyx_t_1 = __pyx_convert_PyUnicode_string_to_py_std__in_string(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 617, __pyx_L1_error) ++ __pyx_t_1 = __pyx_convert_PyBytes_string_to_py_std__in_string(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = __Pyx_PyList_Append(__pyx_v_all_tags, __pyx_t_1); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(1, 617, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; +@@ -12735,7 +13210,7 @@ static PyObject *__pyx_gb_5khmer_5_oxli_6graphs_9Hashgraph_34generator(__pyx_Cor + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_33tags(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_32tags[] = "Hashgraph.tags(self)\nGet all tagged k-mers as DNA strings."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_32tags[] = "Get all tagged k-mers as DNA strings."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_33tags(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -12751,6 +13226,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_32tags(struct __pyx_o + struct __pyx_obj_5khmer_5_oxli_6graphs___pyx_scope_struct__tags *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("tags", 0); + __pyx_cur_scope = (struct __pyx_obj_5khmer_5_oxli_6graphs___pyx_scope_struct__tags *)__pyx_tp_new_5khmer_5_oxli_6graphs___pyx_scope_struct__tags(__pyx_ptype_5khmer_5_oxli_6graphs___pyx_scope_struct__tags, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { +@@ -12789,6 +13267,9 @@ static PyObject *__pyx_gb_5khmer_5_oxli_6graphs_9Hashgraph_34generator(__pyx_Cor + oxli::HashIntoType __pyx_t_3; + std::string __pyx_t_4; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("tags", 0); + switch (__pyx_generator->resume_label) { +@@ -12829,7 +13310,7 @@ static PyObject *__pyx_gb_5khmer_5_oxli_6graphs_9Hashgraph_34generator(__pyx_Cor + oxli_raise_py_error(); if (!PyErr_Occurred())PyErr_SetString(PyExc_RuntimeError, "Error converting c++ exception."); + __PYX_ERR(1, 624, __pyx_L1_error) + } +- __pyx_t_5 = __pyx_convert_PyUnicode_string_to_py_std__in_string(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 624, __pyx_L1_error) ++ __pyx_t_5 = __pyx_convert_PyBytes_string_to_py_std__in_string(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 624, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; +@@ -12891,10 +13372,13 @@ static PyObject *__pyx_gb_5khmer_5_oxli_6graphs_9Hashgraph_34generator(__pyx_Cor + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_36load_tagset(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_35load_tagset[] = "Hashgraph.load_tagset(self, unicode filename, clear_tags=True)\nLoad tags from a file."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_35load_tagset[] = "Load tags from a file."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_36load_tagset(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_filename = 0; + PyObject *__pyx_v_clear_tags = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("load_tagset (wrapper)", 0); +@@ -12948,7 +13432,7 @@ static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_36load_tagset(PyObjec + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyUnicode_Type), 1, "filename", 1))) __PYX_ERR(1, 626, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyString_Type), 1, "filename", 1))) __PYX_ERR(1, 626, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_35load_tagset(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *)__pyx_v_self), __pyx_v_filename, __pyx_v_clear_tags); + + /* function exit code */ +@@ -12966,6 +13450,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_35load_tagset(struct + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; + bool __pyx_t_3; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("load_tagset", 0); + + /* "khmer/_oxli/graphs.pyx":628 +@@ -13018,12 +13505,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_35load_tagset(struct + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_38save_tagset(PyObject *__pyx_v_self, PyObject *__pyx_v_filename); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_37save_tagset[] = "Hashgraph.save_tagset(self, unicode filename)\nSave tags to a file."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_37save_tagset[] = "Save tags to a file."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_38save_tagset(PyObject *__pyx_v_self, PyObject *__pyx_v_filename) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("save_tagset (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyUnicode_Type), 1, "filename", 1))) __PYX_ERR(1, 630, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyString_Type), 1, "filename", 1))) __PYX_ERR(1, 630, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_37save_tagset(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *)__pyx_v_self), ((PyObject*)__pyx_v_filename)); + + /* function exit code */ +@@ -13040,6 +13530,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_37save_tagset(struct + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("save_tagset", 0); + + /* "khmer/_oxli/graphs.pyx":632 +@@ -13101,6 +13594,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_6n_tags___get__(struc + 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("__get__", 0); + + /* "khmer/_oxli/graphs.pyx":637 +@@ -13146,9 +13642,12 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_6n_tags___get__(struc + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_40divide_tags_into_subsets(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_39divide_tags_into_subsets[] = "Hashgraph.divide_tags_into_subsets(self, int subset_size=0)\nDivide tags equally up into subsets of given size."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_39divide_tags_into_subsets[] = "Divide tags equally up into subsets of given size."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_40divide_tags_into_subsets(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + int __pyx_v_subset_size; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("divide_tags_into_subsets (wrapper)", 0); +@@ -13212,6 +13711,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_39divide_tags_into_su + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("divide_tags_into_subsets", 0); + + /* "khmer/_oxli/graphs.pyx":642 +@@ -13321,6 +13823,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_11tag_density___get__ + 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("__get__", 0); + + /* "khmer/_oxli/graphs.pyx":650 +@@ -13368,6 +13873,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_11tag_density___get__ + static int __pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_11tag_density_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_arg_density); /*proto*/ + static int __pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_11tag_density_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_arg_density) { + int __pyx_v_density; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); +@@ -13425,12 +13933,15 @@ static int __pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_11tag_density_2__set__(stru + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_42do_subset_partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_41do_subset_partition[] = "Hashgraph.do_subset_partition(self, start_kmer, end_kmer, bool break_on_stoptags=False, bool stop_big_traversals=False)\nPartition the graph starting from a given subset of tags."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_41do_subset_partition[] = "Partition the graph starting from a given subset of tags."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_42do_subset_partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_start_kmer = 0; + PyObject *__pyx_v_end_kmer = 0; + bool __pyx_v_break_on_stoptags; + bool __pyx_v_stop_big_traversals; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("do_subset_partition (wrapper)", 0); +@@ -13554,6 +14065,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_41do_subset_partition + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + oxli::HashIntoType __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("do_subset_partition", 0); + + /* "khmer/_oxli/graphs.pyx":662 +@@ -13719,7 +14233,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_41do_subset_partition + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_44find_all_tags(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_43find_all_tags[] = "Hashgraph.find_all_tags(self, kmer)\nStarting from the given k-mer, find all closely connected tags."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_43find_all_tags[] = "Starting from the given k-mer, find all closely connected tags."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_44find_all_tags(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -13738,6 +14252,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_43find_all_tags(struc + __Pyx_RefNannyDeclarations + oxli::Kmer __pyx_t_1; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("find_all_tags", 0); + + /* "khmer/_oxli/graphs.pyx":677 +@@ -13875,8 +14392,11 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_43find_all_tags(struc + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_46assign_partition_id(PyObject *__pyx_v_self, PyObject *__pyx_v_ppi); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_45assign_partition_id[] = "Hashgraph.assign_partition_id(self, PrePartitionInfo ppi)\nAssign a partition ID to a given tag."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_45assign_partition_id[] = "Assign a partition ID to a given tag."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_46assign_partition_id(PyObject *__pyx_v_self, PyObject *__pyx_v_ppi) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("assign_partition_id (wrapper)", 0); +@@ -13898,6 +14418,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_45assign_partition_id + 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("assign_partition_id", 0); + + /* "khmer/_oxli/graphs.pyx":691 +@@ -13961,11 +14484,14 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_45assign_partition_id + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_48output_partitions(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_47output_partitions[] = "Hashgraph.output_partitions(self, unicode filename, unicode output, bool output_unassigned=False)\nWrite out sequences in given filename to another file, annotating "; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_47output_partitions[] = "Write out sequences in given filename to another file, annotating "; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_48output_partitions(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_filename = 0; + PyObject *__pyx_v_output = 0; + bool __pyx_v_output_unassigned; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("output_partitions (wrapper)", 0); +@@ -14040,8 +14566,8 @@ static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_48output_partitions(P + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyUnicode_Type), 1, "filename", 1))) __PYX_ERR(1, 697, __pyx_L1_error) +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_output), (&PyUnicode_Type), 1, "output", 1))) __PYX_ERR(1, 697, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyString_Type), 1, "filename", 1))) __PYX_ERR(1, 697, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_output), (&PyString_Type), 1, "output", 1))) __PYX_ERR(1, 697, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_47output_partitions(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *)__pyx_v_self), __pyx_v_filename, __pyx_v_output, __pyx_v_output_unassigned); + + /* "khmer/_oxli/graphs.pyx":697 +@@ -14069,6 +14595,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_47output_partitions(s + std::string __pyx_t_2; + std::string __pyx_t_3; + size_t __pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("output_partitions", 0); + + /* "khmer/_oxli/graphs.pyx":702 +@@ -14153,12 +14682,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_47output_partitions(s + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_50load_partitionmap(PyObject *__pyx_v_self, PyObject *__pyx_v_filename); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_49load_partitionmap[] = "Hashgraph.load_partitionmap(self, unicode filename)\nLoad a partitionmap for the master subset."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_49load_partitionmap[] = "Load a partitionmap for the master subset."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_50load_partitionmap(PyObject *__pyx_v_self, PyObject *__pyx_v_filename) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("load_partitionmap (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyUnicode_Type), 1, "filename", 1))) __PYX_ERR(1, 707, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyString_Type), 1, "filename", 1))) __PYX_ERR(1, 707, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_49load_partitionmap(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *)__pyx_v_self), ((PyObject*)__pyx_v_filename)); + + /* function exit code */ +@@ -14175,6 +14707,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_49load_partitionmap(s + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("load_partitionmap", 0); + + /* "khmer/_oxli/graphs.pyx":709 +@@ -14226,12 +14761,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_49load_partitionmap(s + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_52save_partitionmap(PyObject *__pyx_v_self, PyObject *__pyx_v_filename); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_51save_partitionmap[] = "Hashgraph.save_partitionmap(self, unicode filename)\nSave a partitionmap for the master subset."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_51save_partitionmap[] = "Save a partitionmap for the master subset."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_52save_partitionmap(PyObject *__pyx_v_self, PyObject *__pyx_v_filename) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("save_partitionmap (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyUnicode_Type), 1, "filename", 1))) __PYX_ERR(1, 711, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyString_Type), 1, "filename", 1))) __PYX_ERR(1, 711, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_51save_partitionmap(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *)__pyx_v_self), ((PyObject*)__pyx_v_filename)); + + /* function exit code */ +@@ -14248,6 +14786,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_51save_partitionmap(s + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("save_partitionmap", 0); + + /* "khmer/_oxli/graphs.pyx":713 +@@ -14299,7 +14840,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_51save_partitionmap(s + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_54_validate_partitionmap(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_53_validate_partitionmap[] = "Hashgraph._validate_partitionmap(self)\nRun internal validation checks."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_53_validate_partitionmap[] = "Run internal validation checks."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_54_validate_partitionmap(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -14350,7 +14891,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_53_validate_partition + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_56consume_partitioned_fasta(PyObject *__pyx_v_self, PyObject *__pyx_v_filename); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_55consume_partitioned_fasta[] = "Hashgraph.consume_partitioned_fasta(self, filename)\nCount all k-mers in a given file"; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_55consume_partitioned_fasta[] = "Count all k-mers in a given file"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_56consume_partitioned_fasta(PyObject *__pyx_v_self, PyObject *__pyx_v_filename) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -14372,6 +14913,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_55consume_partitioned + std::string __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("consume_partitioned_fasta", 0); + + /* "khmer/_oxli/graphs.pyx":721 +@@ -14474,8 +15018,11 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_55consume_partitioned + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_58merge_subset(PyObject *__pyx_v_self, PyObject *__pyx_v_subset); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_57merge_subset[] = "Hashgraph.merge_subset(self, SubsetPartition subset)\nMerge the given subset into this one."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_57merge_subset[] = "Merge the given subset into this one."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_58merge_subset(PyObject *__pyx_v_self, PyObject *__pyx_v_subset) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("merge_subset (wrapper)", 0); +@@ -14530,12 +15077,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_57merge_subset(struct + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_60merge_subset_from_disk(PyObject *__pyx_v_self, PyObject *__pyx_v_filename); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_59merge_subset_from_disk[] = "Hashgraph.merge_subset_from_disk(self, unicode filename)\nMerge the given subset (filename) into this one."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_59merge_subset_from_disk[] = "Merge the given subset (filename) into this one."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_60merge_subset_from_disk(PyObject *__pyx_v_self, PyObject *__pyx_v_filename) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("merge_subset_from_disk (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyUnicode_Type), 1, "filename", 1))) __PYX_ERR(1, 733, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyString_Type), 1, "filename", 1))) __PYX_ERR(1, 733, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_59merge_subset_from_disk(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *)__pyx_v_self), ((PyObject*)__pyx_v_filename)); + + /* function exit code */ +@@ -14552,6 +15102,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_59merge_subset_from_d + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("merge_subset_from_disk", 0); + + /* "khmer/_oxli/graphs.pyx":735 +@@ -14603,7 +15156,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_59merge_subset_from_d + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_62count_partitions(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_61count_partitions[] = "Hashgraph.count_partitions(self)\nCount the number of partitions in the master partitionmap."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_61count_partitions[] = "Count the number of partitions in the master partitionmap."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_62count_partitions(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -14621,6 +15174,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_61count_partitions(st + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("count_partitions", 0); + + /* "khmer/_oxli/graphs.pyx":739 +@@ -14686,10 +15242,13 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_61count_partitions(st + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_64set_partition_id(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_63set_partition_id[] = "Hashgraph.set_partition_id(self, kmer, PartitionID pid)\nSet the partition ID for this tag."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_63set_partition_id[] = "Set the partition ID for this tag."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_64set_partition_id(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_kmer = 0; + oxli::PartitionID __pyx_v_pid; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("set_partition_id (wrapper)", 0); +@@ -14752,6 +15311,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_63set_partition_id(st + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("set_partition_id", 0); + + /* "khmer/_oxli/graphs.pyx":743 +@@ -14807,10 +15369,13 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_63set_partition_id(st + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_66join_partitions(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_65join_partitions[] = "Hashgraph.join_partitions(self, PartitionID p1, PartitionID p2)\nJoin the partitions of these two tags."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_65join_partitions[] = "Join the partitions of these two tags."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_66join_partitions(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + oxli::PartitionID __pyx_v_p1; + oxli::PartitionID __pyx_v_p2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("join_partitions (wrapper)", 0); +@@ -14871,6 +15436,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_65join_partitions(str + 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("join_partitions", 0); + + /* "khmer/_oxli/graphs.pyx":748 +@@ -14916,7 +15484,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_65join_partitions(str + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_68get_partition_id(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_67get_partition_id[] = "Hashgraph.get_partition_id(self, kmer)\nGet the partition ID of this tag."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_67get_partition_id[] = "Get the partition ID of this tag."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_68get_partition_id(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -14934,6 +15502,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_67get_partition_id(st + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_partition_id", 0); + + /* "khmer/_oxli/graphs.pyx":752 +@@ -14992,13 +15563,16 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_67get_partition_id(st + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_70repartition_largest_partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_69repartition_largest_partition[] = "Hashgraph.repartition_largest_partition(self, Countgraph counts, unsigned int distance, unsigned int threshold, unsigned int frequency, SubsetPartition subs=None)\nRepartition the largest partition (in the face of stop tags)."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_69repartition_largest_partition[] = "Repartition the largest partition (in the face of stop tags)."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_70repartition_largest_partition(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + struct __pyx_obj_5khmer_5_oxli_6graphs_Countgraph *__pyx_v_counts = 0; + unsigned int __pyx_v_distance; + unsigned int __pyx_v_threshold; + unsigned int __pyx_v_frequency; + struct __pyx_obj_5khmer_5_oxli_19legacy_partitioning_SubsetPartition *__pyx_v_subs = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("repartition_largest_partition (wrapper)", 0); +@@ -15120,6 +15694,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_69repartition_largest + int __pyx_t_2; + std::shared_ptr __pyx_t_3; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("repartition_largest_partition", 0); + + /* "khmer/_oxli/graphs.pyx":763 +@@ -15218,10 +15795,13 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_69repartition_largest + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_72load_stop_tags(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_71load_stop_tags[] = "Hashgraph.load_stop_tags(self, filename, clear_tags=False)\nLoad the set of stop tags."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_71load_stop_tags[] = "Load the set of stop tags."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_72load_stop_tags(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_filename = 0; + PyObject *__pyx_v_clear_tags = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("load_stop_tags (wrapper)", 0); +@@ -15288,6 +15868,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_71load_stop_tags(stru + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; + bool __pyx_t_3; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("load_stop_tags", 0); + + /* "khmer/_oxli/graphs.pyx":778 +@@ -15340,7 +15923,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_71load_stop_tags(stru + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_74save_stop_tags(PyObject *__pyx_v_self, PyObject *__pyx_v_filename); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_73save_stop_tags[] = "Hashgraph.save_stop_tags(self, filename)\nSave the set of stop tags."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_73save_stop_tags[] = "Save the set of stop tags."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_74save_stop_tags(PyObject *__pyx_v_self, PyObject *__pyx_v_filename) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -15357,6 +15940,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_73save_stop_tags(stru + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("save_stop_tags", 0); + + /* "khmer/_oxli/graphs.pyx":782 +@@ -15403,7 +15989,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_73save_stop_tags(stru + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_76print_stop_tags(PyObject *__pyx_v_self, PyObject *__pyx_v_filename); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_75print_stop_tags[] = "Hashgraph.print_stop_tags(self, filename)\nPrint out the set of stop tags."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_75print_stop_tags[] = "Print out the set of stop tags."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_76print_stop_tags(PyObject *__pyx_v_self, PyObject *__pyx_v_filename) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -15420,6 +16006,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_75print_stop_tags(str + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("print_stop_tags", 0); + + /* "khmer/_oxli/graphs.pyx":786 +@@ -15466,12 +16055,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_75print_stop_tags(str + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_78trim_on_stoptags(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_77trim_on_stoptags[] = "Hashgraph.trim_on_stoptags(self, unicode sequence)\nTrim the reads on the given stop tags."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_77trim_on_stoptags[] = "Trim the reads on the given stop tags."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_78trim_on_stoptags(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("trim_on_stoptags (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(1, 788, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(1, 788, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_77trim_on_stoptags(((struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *)__pyx_v_self), ((PyObject*)__pyx_v_sequence)); + + /* function exit code */ +@@ -15493,6 +16085,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_77trim_on_stoptags(st + std::string __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("trim_on_stoptags", 0); + + /* "khmer/_oxli/graphs.pyx":791 +@@ -15573,7 +16168,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_77trim_on_stoptags(st + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 795, __pyx_L1_error) + } +- __pyx_t_1 = __Pyx_PyUnicode_Substring(__pyx_v_sequence, 0, __pyx_v_trim_at); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 795, __pyx_L1_error) ++ __pyx_t_1 = PySequence_GetSlice(__pyx_v_sequence, 0, __pyx_v_trim_at); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 795, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_FromSize_t(__pyx_v_trim_at); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 795, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); +@@ -15620,7 +16215,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_77trim_on_stoptags(st + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_80add_stop_tag(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_79add_stop_tag[] = "Hashgraph.add_stop_tag(self, kmer)\nAdd this k-mer as a stop tag."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_79add_stop_tag[] = "Add this k-mer as a stop tag."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_80add_stop_tag(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -15637,6 +16232,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_79add_stop_tag(struct + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + oxli::HashIntoType __pyx_t_1; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("add_stop_tag", 0); + + /* "khmer/_oxli/graphs.pyx":799 +@@ -15688,7 +16286,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_79add_stop_tag(struct + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_82get_stop_tags(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_81get_stop_tags[] = "Hashgraph.get_stop_tags(self)\nReturn a DNA list of all of the stop tags."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_81get_stop_tags[] = "Return a DNA list of all of the stop tags."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_82get_stop_tags(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -15711,6 +16309,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_81get_stop_tags(struc + oxli::HashIntoType __pyx_t_4; + std::string __pyx_t_5; + int __pyx_t_6; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_stop_tags", 0); + + /* "khmer/_oxli/graphs.pyx":805 +@@ -15753,7 +16354,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_81get_stop_tags(struc + oxli_raise_py_error(); if (!PyErr_Occurred())PyErr_SetString(PyExc_RuntimeError, "Error converting c++ exception."); + __PYX_ERR(1, 807, __pyx_L1_error) + } +- __pyx_t_1 = __pyx_convert_PyUnicode_string_to_py_std__in_string(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 807, __pyx_L1_error) ++ __pyx_t_1 = __pyx_convert_PyBytes_string_to_py_std__in_string(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 807, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = __Pyx_PyList_Append(__pyx_v_stop_tags, __pyx_t_1); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(1, 807, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; +@@ -15810,7 +16411,7 @@ static PyObject *__pyx_gb_5khmer_5_oxli_6graphs_9Hashgraph_85generator1(__pyx_Co + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_84iter_stop_tags(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_83iter_stop_tags[] = "Hashgraph.iter_stop_tags(self)\nReturn a DNA list of all of the stop tags."; ++static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_83iter_stop_tags[] = "Return a DNA list of all of the stop tags."; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_84iter_stop_tags(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -15826,6 +16427,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_83iter_stop_tags(stru + struct __pyx_obj_5khmer_5_oxli_6graphs___pyx_scope_struct_1_iter_stop_tags *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("iter_stop_tags", 0); + __pyx_cur_scope = (struct __pyx_obj_5khmer_5_oxli_6graphs___pyx_scope_struct_1_iter_stop_tags *)__pyx_tp_new_5khmer_5_oxli_6graphs___pyx_scope_struct_1_iter_stop_tags(__pyx_ptype_5khmer_5_oxli_6graphs___pyx_scope_struct_1_iter_stop_tags, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { +@@ -15864,6 +16468,9 @@ static PyObject *__pyx_gb_5khmer_5_oxli_6graphs_9Hashgraph_85generator1(__pyx_Co + oxli::HashIntoType __pyx_t_3; + std::string __pyx_t_4; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("iter_stop_tags", 0); + switch (__pyx_generator->resume_label) { +@@ -15904,7 +16511,7 @@ static PyObject *__pyx_gb_5khmer_5_oxli_6graphs_9Hashgraph_85generator1(__pyx_Co + oxli_raise_py_error(); if (!PyErr_Occurred())PyErr_SetString(PyExc_RuntimeError, "Error converting c++ exception."); + __PYX_ERR(1, 814, __pyx_L1_error) + } +- __pyx_t_5 = __pyx_convert_PyUnicode_string_to_py_std__in_string(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 814, __pyx_L1_error) ++ __pyx_t_5 = __pyx_convert_PyBytes_string_to_py_std__in_string(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 814, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; +@@ -15964,7 +16571,6 @@ static PyObject *__pyx_gb_5khmer_5_oxli_6graphs_9Hashgraph_85generator1(__pyx_Co + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_87__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_86__reduce_cython__[] = "Hashgraph.__reduce_cython__(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_87__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -15980,6 +16586,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_86__reduce_cython__(C + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -16019,7 +16628,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_86__reduce_cython__(C + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_89__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_88__setstate_cython__[] = "Hashgraph.__setstate_cython__(self, __pyx_state)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_89__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -16035,6 +16643,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Hashgraph_88__setstate_cython__ + 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)":4 +@@ -16080,6 +16691,9 @@ static int __pyx_pw_5khmer_5_oxli_6graphs_10Countgraph_1__cinit__(PyObject *__py + uint64_t __pyx_v_starting_size; + int __pyx_v_n_tables; + PyObject *__pyx_v_primes = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -16191,6 +16805,9 @@ static int __pyx_pf_5khmer_5_oxli_6graphs_10Countgraph___cinit__(struct __pyx_ob + int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + std::shared_ptr __pyx_t_11; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + __Pyx_INCREF(__pyx_v_primes); + +@@ -16414,7 +17031,6 @@ static int __pyx_pf_5khmer_5_oxli_6graphs_10Countgraph___cinit__(struct __pyx_ob + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_10Countgraph_3do_subset_partition_with_abundance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_10Countgraph_2do_subset_partition_with_abundance[] = "Countgraph.do_subset_partition_with_abundance(self, BoundedCounterType min_count, BoundedCounterType max_count, start_kmer=0, end_kmer=0, bool break_on_stop_tags=False, bool stop_big_traversals=False)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_10Countgraph_3do_subset_partition_with_abundance(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + oxli::BoundedCounterType __pyx_v_min_count; + oxli::BoundedCounterType __pyx_v_max_count; +@@ -16422,6 +17038,9 @@ static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_10Countgraph_3do_subset_partitio + PyObject *__pyx_v_end_kmer = 0; + bool __pyx_v_break_on_stop_tags; + bool __pyx_v_stop_big_traversals; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("do_subset_partition_with_abundance (wrapper)", 0); +@@ -16570,6 +17189,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_10Countgraph_2do_subset_partitio + oxli::HashIntoType __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + std::shared_ptr __pyx_t_3; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("do_subset_partition_with_abundance", 0); + + /* "khmer/_oxli/graphs.pyx":840 +@@ -16734,7 +17356,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_10Countgraph_2do_subset_partitio + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_10Countgraph_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_10Countgraph_4__reduce_cython__[] = "Countgraph.__reduce_cython__(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_10Countgraph_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -16750,6 +17371,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_10Countgraph_4__reduce_cython__( + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -16789,7 +17413,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_10Countgraph_4__reduce_cython__( + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_10Countgraph_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_10Countgraph_6__setstate_cython__[] = "Countgraph.__setstate_cython__(self, __pyx_state)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_10Countgraph_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -16805,6 +17428,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_10Countgraph_6__setstate_cython_ + 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)":4 +@@ -16850,6 +17476,9 @@ static int __pyx_pw_5khmer_5_oxli_6graphs_15SmallCountgraph_1__cinit__(PyObject + uint64_t __pyx_v_starting_size; + int __pyx_v_n_tables; + PyObject *__pyx_v_primes = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -16961,6 +17590,9 @@ static int __pyx_pf_5khmer_5_oxli_6graphs_15SmallCountgraph___cinit__(struct __p + int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + std::shared_ptr __pyx_t_11; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + __Pyx_INCREF(__pyx_v_primes); + +@@ -17184,7 +17816,6 @@ static int __pyx_pf_5khmer_5_oxli_6graphs_15SmallCountgraph___cinit__(struct __p + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_15SmallCountgraph_3get_raw_tables(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_15SmallCountgraph_2get_raw_tables[] = "SmallCountgraph.get_raw_tables(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_15SmallCountgraph_3get_raw_tables(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -17206,6 +17837,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_15SmallCountgraph_2get_raw_table + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + Py_ssize_t __pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_raw_tables", 0); + + /* "khmer/_oxli/graphs.pyx":875 +@@ -17292,7 +17926,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_15SmallCountgraph_2get_raw_table + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_15SmallCountgraph_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_15SmallCountgraph_4__reduce_cython__[] = "SmallCountgraph.__reduce_cython__(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_15SmallCountgraph_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -17308,6 +17941,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_15SmallCountgraph_4__reduce_cyth + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -17347,7 +17983,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_15SmallCountgraph_4__reduce_cyth + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_15SmallCountgraph_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_15SmallCountgraph_6__setstate_cython__[] = "SmallCountgraph.__setstate_cython__(self, __pyx_state)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_15SmallCountgraph_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -17363,6 +17998,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_15SmallCountgraph_6__setstate_cy + 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)":4 +@@ -17408,6 +18046,9 @@ static int __pyx_pw_5khmer_5_oxli_6graphs_9Nodegraph_1__cinit__(PyObject *__pyx_ + uint64_t __pyx_v_starting_size; + int __pyx_v_n_tables; + PyObject *__pyx_v_primes = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -17519,6 +18160,9 @@ static int __pyx_pf_5khmer_5_oxli_6graphs_9Nodegraph___cinit__(struct __pyx_obj_ + int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + std::shared_ptr __pyx_t_11; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + __Pyx_INCREF(__pyx_v_primes); + +@@ -17741,8 +18385,10 @@ static int __pyx_pf_5khmer_5_oxli_6graphs_9Nodegraph___cinit__(struct __pyx_obj_ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Nodegraph_3update(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Nodegraph_2update[] = "Nodegraph.update(self, Nodegraph other)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Nodegraph_3update(PyObject *__pyx_v_self, PyObject *__pyx_v_other) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("update (wrapper)", 0); +@@ -17761,6 +18407,9 @@ static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Nodegraph_3update(PyObject *__p + static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Nodegraph_2update(struct __pyx_obj_5khmer_5_oxli_6graphs_Nodegraph *__pyx_v_self, struct __pyx_obj_5khmer_5_oxli_6graphs_Nodegraph *__pyx_v_other) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("update", 0); + + /* "khmer/_oxli/graphs.pyx":900 +@@ -17802,7 +18451,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Nodegraph_2update(struct __pyx_ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Nodegraph_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Nodegraph_4__reduce_cython__[] = "Nodegraph.__reduce_cython__(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Nodegraph_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -17818,6 +18466,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Nodegraph_4__reduce_cython__(CY + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -17857,7 +18508,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Nodegraph_4__reduce_cython__(CY + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Nodegraph_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_6graphs_9Nodegraph_6__setstate_cython__[] = "Nodegraph.__setstate_cython__(self, __pyx_state)"; + static PyObject *__pyx_pw_5khmer_5_oxli_6graphs_9Nodegraph_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -17873,6 +18523,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_6graphs_9Nodegraph_6__setstate_cython__( + 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)":4 +@@ -17915,6 +18568,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyObject_string_to_py_std__in_strin + 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("__pyx_convert_PyObject_string_to_py_std__in_string", 0); + + /* "string.to_py":32 +@@ -17962,6 +18618,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyUnicode_string_to_py_std__in_stri + 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("__pyx_convert_PyUnicode_string_to_py_std__in_string", 0); + + /* "string.to_py":38 +@@ -18009,6 +18668,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyStr_string_to_py_std__in_string(s + 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("__pyx_convert_PyStr_string_to_py_std__in_string", 0); + + /* "string.to_py":44 +@@ -18056,6 +18718,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyBytes_string_to_py_std__in_string + 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("__pyx_convert_PyBytes_string_to_py_std__in_string", 0); + + /* "string.to_py":50 +@@ -18103,6 +18768,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyByteArray_string_to_py_std__in_st + 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("__pyx_convert_PyByteArray_string_to_py_std__in_string", 0); + + /* "string.to_py":56 +@@ -18154,6 +18822,9 @@ static PyObject *__pyx_convert_vector_to_py_uint64_t(const std::vector + size_t __pyx_t_3; + size_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_vector_to_py_uint64_t", 0); + + /* "vector.to_py":61 +@@ -18203,7 +18874,7 @@ static PyObject *__pyx_convert_vector_to_py_uint64_t(const std::vector + * + * @cname("__pyx_convert_string_from_py_std__in_string") + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: # <<<<<<<<<<<<<< +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + */ + +@@ -18213,11 +18884,23 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + std::string __pyx_r; + __Pyx_RefNannyDeclarations + char const *__pyx_t_1; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_string_from_py_std__in_string", 0); + ++ /* "string.from_py":14 ++ * @cname("__pyx_convert_string_from_py_std__in_string") ++ * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: ++ * cdef Py_ssize_t length = 0 # <<<<<<<<<<<<<< ++ * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) ++ * return string(data, length) ++ */ ++ __pyx_v_length = 0; ++ + /* "string.from_py":15 + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) # <<<<<<<<<<<<<< + * return string(data, length) + * +@@ -18226,7 +18909,7 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + __pyx_v_data = __pyx_t_1; + + /* "string.from_py":16 +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + * return string(data, length) # <<<<<<<<<<<<<< + * +@@ -18239,7 +18922,7 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + * + * @cname("__pyx_convert_string_from_py_std__in_string") + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: # <<<<<<<<<<<<<< +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + */ + +@@ -18269,6 +18952,9 @@ static PyObject *__pyx_convert_vector_to_py_std_3a__3a_string(const std::vector< + size_t __pyx_t_3; + size_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_vector_to_py_std_3a__3a_string", 0); + + /* "vector.to_py":61 +@@ -18285,7 +18971,7 @@ static PyObject *__pyx_convert_vector_to_py_std_3a__3a_string(const std::vector< + __pyx_t_3 = __pyx_t_2; + for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { + __pyx_v_i = __pyx_t_4; +- __pyx_t_5 = __pyx_convert_PyUnicode_string_to_py_std__in_string((__pyx_v_v[__pyx_v_i])); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 61, __pyx_L1_error) ++ __pyx_t_5 = __pyx_convert_PyBytes_string_to_py_std__in_string((__pyx_v_v[__pyx_v_i])); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(2, 61, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; +@@ -18323,6 +19009,9 @@ static PyObject *__pyx_convert_vector_to_py_oxli_3a__3a_BoundedCounterType(const + size_t __pyx_t_3; + size_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_vector_to_py_oxli_3a__3a_BoundedCounterType", 0); + + /* "vector.to_py":61 +@@ -18377,6 +19066,9 @@ static PyObject *__pyx_convert_vector_to_py_oxli_3a__3a_HashIntoType(const std:: + size_t __pyx_t_3; + size_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_vector_to_py_oxli_3a__3a_HashIntoType", 0); + + /* "vector.to_py":61 +@@ -18431,6 +19123,9 @@ static PyObject *__pyx_convert_vector_to_py_uint32_t(const std::vector + size_t __pyx_t_3; + size_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_vector_to_py_uint32_t", 0); + + /* "vector.to_py":61 +@@ -18494,6 +19189,9 @@ static std::vector __pyx_convert_vector_from_py_uint64_t(PyObject *__ + PyObject *(*__pyx_t_3)(PyObject *); + PyObject *__pyx_t_4 = NULL; + uint64_t __pyx_t_5; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_vector_from_py_uint64_t", 0); + + /* "vector.from_py":47 +@@ -18625,7 +19323,7 @@ static void __pyx_tp_dealloc_5khmer_5_oxli_6graphs_Hashtable(PyObject *o) { + static PyMethodDef __pyx_methods_5khmer_5_oxli_6graphs_Hashtable[] = { + {"sanitize_seq_kmer", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_1sanitize_seq_kmer, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_sanitize_seq_kmer}, + {"sanitize_kmer", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_3sanitize_kmer, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_2sanitize_kmer}, +- {"_kmer_type_error", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_5_kmer_type_error, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_4_kmer_type_error}, ++ {"_kmer_type_error", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_5_kmer_type_error, METH_O, 0}, + {"count", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_7count, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_6count}, + {"add", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_9add, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_8add}, + {"hash", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_11hash, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_10hash}, +@@ -18645,21 +19343,21 @@ static PyMethodDef __pyx_methods_5khmer_5_oxli_6graphs_Hashtable[] = { + {"trim_below_abundance", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_39trim_below_abundance, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_38trim_below_abundance}, + {"find_spectral_error_positions", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_41find_spectral_error_positions, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_40find_spectral_error_positions}, + {"consume_seqfile", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_43consume_seqfile, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_42consume_seqfile}, +- {"consume_seqfile_with_mask", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_45consume_seqfile_with_mask, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_44consume_seqfile_with_mask}, ++ {"consume_seqfile_with_mask", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_45consume_seqfile_with_mask, METH_VARARGS|METH_KEYWORDS, 0}, + {"consume_seqfile_banding", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_47consume_seqfile_banding, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_46consume_seqfile_banding}, +- {"consume_seqfile_banding_with_mask", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_49consume_seqfile_banding_with_mask, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_48consume_seqfile_banding_with_mask}, ++ {"consume_seqfile_banding_with_mask", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_49consume_seqfile_banding_with_mask, METH_VARARGS|METH_KEYWORDS, 0}, + {"abundance_distribution", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_51abundance_distribution, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_50abundance_distribution}, + {"save", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_53save, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_52save}, + {"load", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_55load, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_54load}, + {"n_unique_kmers", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_57n_unique_kmers, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_56n_unique_kmers}, + {"n_occupied", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_59n_occupied, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_58n_occupied}, + {"n_tables", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_61n_tables, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_60n_tables}, +- {"set_use_bigcount", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_63set_use_bigcount, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_62set_use_bigcount}, +- {"get_use_bigcount", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_65get_use_bigcount, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_64get_use_bigcount}, +- {"get_kmer_hashes_as_hashset", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_67get_kmer_hashes_as_hashset, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_66get_kmer_hashes_as_hashset}, +- {"get_raw_tables", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_69get_raw_tables, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_68get_raw_tables}, +- {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_71__reduce_cython__, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_70__reduce_cython__}, +- {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_73__setstate_cython__, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Hashtable_72__setstate_cython__}, ++ {"set_use_bigcount", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_63set_use_bigcount, METH_O, 0}, ++ {"get_use_bigcount", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_65get_use_bigcount, METH_NOARGS, 0}, ++ {"get_kmer_hashes_as_hashset", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_67get_kmer_hashes_as_hashset, METH_O, 0}, ++ {"get_raw_tables", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_69get_raw_tables, METH_NOARGS, 0}, ++ {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_71__reduce_cython__, METH_NOARGS, 0}, ++ {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashtable_73__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} + }; + +@@ -18669,7 +19367,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_Hashtable = { + sizeof(struct __pyx_obj_5khmer_5_oxli_6graphs_Hashtable), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_6graphs_Hashtable, /*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 +@@ -18719,6 +19422,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_Hashtable = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + static struct __pyx_vtabstruct_5khmer_5_oxli_6graphs_QFCounttable __pyx_vtable_5khmer_5_oxli_6graphs_QFCounttable; + +@@ -18749,8 +19461,8 @@ static void __pyx_tp_dealloc_5khmer_5_oxli_6graphs_QFCounttable(PyObject *o) { + + static PyMethodDef __pyx_methods_5khmer_5_oxli_6graphs_QFCounttable[] = { + {"load", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_12QFCounttable_3load, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_12QFCounttable_2load}, +- {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_12QFCounttable_5__reduce_cython__, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_12QFCounttable_4__reduce_cython__}, +- {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_12QFCounttable_7__setstate_cython__, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_12QFCounttable_6__setstate_cython__}, ++ {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_12QFCounttable_5__reduce_cython__, METH_NOARGS, 0}, ++ {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_12QFCounttable_7__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} + }; + +@@ -18760,7 +19472,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_QFCounttable = { + sizeof(struct __pyx_obj_5khmer_5_oxli_6graphs_QFCounttable), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_6graphs_QFCounttable, /*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 +@@ -18810,6 +19527,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_QFCounttable = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + static struct __pyx_vtabstruct_5khmer_5_oxli_6graphs_SmallCounttable __pyx_vtable_5khmer_5_oxli_6graphs_SmallCounttable; + +@@ -18839,9 +19565,9 @@ static void __pyx_tp_dealloc_5khmer_5_oxli_6graphs_SmallCounttable(PyObject *o) + } + + static PyMethodDef __pyx_methods_5khmer_5_oxli_6graphs_SmallCounttable[] = { +- {"get_raw_tables", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_15SmallCounttable_3get_raw_tables, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_15SmallCounttable_2get_raw_tables}, +- {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_15SmallCounttable_5__reduce_cython__, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_15SmallCounttable_4__reduce_cython__}, +- {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_15SmallCounttable_7__setstate_cython__, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_15SmallCounttable_6__setstate_cython__}, ++ {"get_raw_tables", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_15SmallCounttable_3get_raw_tables, METH_NOARGS, 0}, ++ {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_15SmallCounttable_5__reduce_cython__, METH_NOARGS, 0}, ++ {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_15SmallCounttable_7__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} + }; + +@@ -18851,7 +19577,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_SmallCounttable = { + sizeof(struct __pyx_obj_5khmer_5_oxli_6graphs_SmallCounttable), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_6graphs_SmallCounttable, /*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 +@@ -18901,6 +19632,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_SmallCounttable = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + static struct __pyx_vtabstruct_5khmer_5_oxli_6graphs_Counttable __pyx_vtable_5khmer_5_oxli_6graphs_Counttable; + +@@ -18930,8 +19670,8 @@ static void __pyx_tp_dealloc_5khmer_5_oxli_6graphs_Counttable(PyObject *o) { + } + + static PyMethodDef __pyx_methods_5khmer_5_oxli_6graphs_Counttable[] = { +- {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_10Counttable_3__reduce_cython__, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_10Counttable_2__reduce_cython__}, +- {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_10Counttable_5__setstate_cython__, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_10Counttable_4__setstate_cython__}, ++ {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_10Counttable_3__reduce_cython__, METH_NOARGS, 0}, ++ {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_10Counttable_5__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} + }; + +@@ -18941,7 +19681,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_Counttable = { + sizeof(struct __pyx_obj_5khmer_5_oxli_6graphs_Counttable), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_6graphs_Counttable, /*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 +@@ -18991,6 +19736,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_Counttable = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + static struct __pyx_vtabstruct_5khmer_5_oxli_6graphs_CyclicCounttable __pyx_vtable_5khmer_5_oxli_6graphs_CyclicCounttable; + +@@ -19020,8 +19774,8 @@ static void __pyx_tp_dealloc_5khmer_5_oxli_6graphs_CyclicCounttable(PyObject *o) + } + + static PyMethodDef __pyx_methods_5khmer_5_oxli_6graphs_CyclicCounttable[] = { +- {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_16CyclicCounttable_3__reduce_cython__, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_16CyclicCounttable_2__reduce_cython__}, +- {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_16CyclicCounttable_5__setstate_cython__, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_16CyclicCounttable_4__setstate_cython__}, ++ {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_16CyclicCounttable_3__reduce_cython__, METH_NOARGS, 0}, ++ {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_16CyclicCounttable_5__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} + }; + +@@ -19031,7 +19785,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_CyclicCounttable = { + sizeof(struct __pyx_obj_5khmer_5_oxli_6graphs_CyclicCounttable), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_6graphs_CyclicCounttable, /*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 +@@ -19081,6 +19840,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_CyclicCounttable = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + static struct __pyx_vtabstruct_5khmer_5_oxli_6graphs_Nodetable __pyx_vtable_5khmer_5_oxli_6graphs_Nodetable; + +@@ -19110,8 +19878,8 @@ static void __pyx_tp_dealloc_5khmer_5_oxli_6graphs_Nodetable(PyObject *o) { + } + + static PyMethodDef __pyx_methods_5khmer_5_oxli_6graphs_Nodetable[] = { +- {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Nodetable_3__reduce_cython__, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_9Nodetable_2__reduce_cython__}, +- {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Nodetable_5__setstate_cython__, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Nodetable_4__setstate_cython__}, ++ {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Nodetable_3__reduce_cython__, METH_NOARGS, 0}, ++ {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Nodetable_5__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} + }; + +@@ -19121,7 +19889,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_Nodetable = { + sizeof(struct __pyx_obj_5khmer_5_oxli_6graphs_Nodetable), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_6graphs_Nodetable, /*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 +@@ -19171,6 +19944,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_Nodetable = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + static struct __pyx_vtabstruct_5khmer_5_oxli_6graphs_Hashgraph __pyx_vtable_5khmer_5_oxli_6graphs_Hashgraph; + +@@ -19257,7 +20039,7 @@ static PyMethodDef __pyx_methods_5khmer_5_oxli_6graphs_Hashgraph[] = { + {"count_kmers_within_radius", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_9count_kmers_within_radius, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_8count_kmers_within_radius}, + {"find_high_degree_nodes", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_11find_high_degree_nodes, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_10find_high_degree_nodes}, + {"traverse_linear_path", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_13traverse_linear_path, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_12traverse_linear_path}, +- {"extract_unique_paths", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_15extract_unique_paths, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_14extract_unique_paths}, ++ {"extract_unique_paths", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_15extract_unique_paths, METH_VARARGS|METH_KEYWORDS, 0}, + {"consume_and_tag", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_17consume_and_tag, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_16consume_and_tag}, + {"get_tags_and_positions", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_19get_tags_and_positions, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_18get_tags_and_positions}, + {"get_tags_for_sequence", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_21get_tags_for_sequence, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_20get_tags_for_sequence}, +@@ -19292,8 +20074,8 @@ static PyMethodDef __pyx_methods_5khmer_5_oxli_6graphs_Hashgraph[] = { + {"add_stop_tag", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_80add_stop_tag, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_79add_stop_tag}, + {"get_stop_tags", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_82get_stop_tags, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_81get_stop_tags}, + {"iter_stop_tags", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_84iter_stop_tags, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_83iter_stop_tags}, +- {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_87__reduce_cython__, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_86__reduce_cython__}, +- {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_89__setstate_cython__, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Hashgraph_88__setstate_cython__}, ++ {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_87__reduce_cython__, METH_NOARGS, 0}, ++ {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Hashgraph_89__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} + }; + +@@ -19310,7 +20092,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_Hashgraph = { + sizeof(struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_6graphs_Hashgraph, /*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 +@@ -19360,6 +20147,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_Hashgraph = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + static struct __pyx_vtabstruct_5khmer_5_oxli_6graphs_Nodegraph __pyx_vtable_5khmer_5_oxli_6graphs_Nodegraph; + +@@ -19391,9 +20187,9 @@ static void __pyx_tp_dealloc_5khmer_5_oxli_6graphs_Nodegraph(PyObject *o) { + } + + static PyMethodDef __pyx_methods_5khmer_5_oxli_6graphs_Nodegraph[] = { +- {"update", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Nodegraph_3update, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Nodegraph_2update}, +- {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Nodegraph_5__reduce_cython__, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_9Nodegraph_4__reduce_cython__}, +- {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Nodegraph_7__setstate_cython__, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_9Nodegraph_6__setstate_cython__}, ++ {"update", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Nodegraph_3update, METH_O, 0}, ++ {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Nodegraph_5__reduce_cython__, METH_NOARGS, 0}, ++ {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_9Nodegraph_7__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} + }; + +@@ -19403,7 +20199,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_Nodegraph = { + sizeof(struct __pyx_obj_5khmer_5_oxli_6graphs_Nodegraph), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_6graphs_Nodegraph, /*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 +@@ -19453,6 +20254,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_Nodegraph = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + static struct __pyx_vtabstruct_5khmer_5_oxli_6graphs_Countgraph __pyx_vtable_5khmer_5_oxli_6graphs_Countgraph; + +@@ -19484,9 +20294,9 @@ static void __pyx_tp_dealloc_5khmer_5_oxli_6graphs_Countgraph(PyObject *o) { + } + + static PyMethodDef __pyx_methods_5khmer_5_oxli_6graphs_Countgraph[] = { +- {"do_subset_partition_with_abundance", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_6graphs_10Countgraph_3do_subset_partition_with_abundance, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_6graphs_10Countgraph_2do_subset_partition_with_abundance}, +- {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_10Countgraph_5__reduce_cython__, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_10Countgraph_4__reduce_cython__}, +- {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_10Countgraph_7__setstate_cython__, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_10Countgraph_6__setstate_cython__}, ++ {"do_subset_partition_with_abundance", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_6graphs_10Countgraph_3do_subset_partition_with_abundance, METH_VARARGS|METH_KEYWORDS, 0}, ++ {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_10Countgraph_5__reduce_cython__, METH_NOARGS, 0}, ++ {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_10Countgraph_7__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} + }; + +@@ -19496,7 +20306,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_Countgraph = { + sizeof(struct __pyx_obj_5khmer_5_oxli_6graphs_Countgraph), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_6graphs_Countgraph, /*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 +@@ -19546,6 +20361,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_Countgraph = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + static struct __pyx_vtabstruct_5khmer_5_oxli_6graphs_SmallCountgraph __pyx_vtable_5khmer_5_oxli_6graphs_SmallCountgraph; + +@@ -19577,9 +20401,9 @@ static void __pyx_tp_dealloc_5khmer_5_oxli_6graphs_SmallCountgraph(PyObject *o) + } + + static PyMethodDef __pyx_methods_5khmer_5_oxli_6graphs_SmallCountgraph[] = { +- {"get_raw_tables", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_15SmallCountgraph_3get_raw_tables, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_15SmallCountgraph_2get_raw_tables}, +- {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_15SmallCountgraph_5__reduce_cython__, METH_NOARGS, __pyx_doc_5khmer_5_oxli_6graphs_15SmallCountgraph_4__reduce_cython__}, +- {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_15SmallCountgraph_7__setstate_cython__, METH_O, __pyx_doc_5khmer_5_oxli_6graphs_15SmallCountgraph_6__setstate_cython__}, ++ {"get_raw_tables", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_15SmallCountgraph_3get_raw_tables, METH_NOARGS, 0}, ++ {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_15SmallCountgraph_5__reduce_cython__, METH_NOARGS, 0}, ++ {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_6graphs_15SmallCountgraph_7__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} + }; + +@@ -19589,7 +20413,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_SmallCountgraph = { + sizeof(struct __pyx_obj_5khmer_5_oxli_6graphs_SmallCountgraph), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_6graphs_SmallCountgraph, /*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 +@@ -19639,6 +20468,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs_SmallCountgraph = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static struct __pyx_obj_5khmer_5_oxli_6graphs___pyx_scope_struct__tags *__pyx_freelist_5khmer_5_oxli_6graphs___pyx_scope_struct__tags[8]; +@@ -19688,7 +20526,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs___pyx_scope_struct__tags = + sizeof(struct __pyx_obj_5khmer_5_oxli_6graphs___pyx_scope_struct__tags), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_6graphs___pyx_scope_struct__tags, /*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 +@@ -19738,6 +20581,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs___pyx_scope_struct__tags = + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static struct __pyx_obj_5khmer_5_oxli_6graphs___pyx_scope_struct_1_iter_stop_tags *__pyx_freelist_5khmer_5_oxli_6graphs___pyx_scope_struct_1_iter_stop_tags[8]; +@@ -19787,7 +20639,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs___pyx_scope_struct_1_iter_s + sizeof(struct __pyx_obj_5khmer_5_oxli_6graphs___pyx_scope_struct_1_iter_stop_tags), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_6graphs___pyx_scope_struct_1_iter_stop_tags, /*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 +@@ -19837,6 +20694,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_6graphs___pyx_scope_struct_1_iter_s + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static PyMethodDef __pyx_methods[] = { +@@ -19889,14 +20755,14 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_Countgraph, __pyx_k_Countgraph, sizeof(__pyx_k_Countgraph), 0, 0, 1, 1}, + {&__pyx_n_s_Counttable, __pyx_k_Counttable, sizeof(__pyx_k_Counttable), 0, 0, 1, 1}, + {&__pyx_n_s_CyclicCounttable, __pyx_k_CyclicCounttable, sizeof(__pyx_k_CyclicCounttable), 0, 0, 1, 1}, +- {&__pyx_kp_u_Expected_k_mer_length_but_got, __pyx_k_Expected_k_mer_length_but_got, sizeof(__pyx_k_Expected_k_mer_length_but_got), 0, 1, 0, 0}, ++ {&__pyx_kp_s_Expected_k_mer_length_but_got, __pyx_k_Expected_k_mer_length_but_got, sizeof(__pyx_k_Expected_k_mer_length_but_got), 0, 0, 1, 0}, + {&__pyx_n_s_Hashgraph, __pyx_k_Hashgraph, sizeof(__pyx_k_Hashgraph), 0, 0, 1, 1}, + {&__pyx_n_s_Hashgraph_iter_stop_tags, __pyx_k_Hashgraph_iter_stop_tags, sizeof(__pyx_k_Hashgraph_iter_stop_tags), 0, 0, 1, 1}, + {&__pyx_n_s_Hashgraph_tags, __pyx_k_Hashgraph_tags, sizeof(__pyx_k_Hashgraph_tags), 0, 0, 1, 1}, + {&__pyx_n_s_Hashtable, __pyx_k_Hashtable, sizeof(__pyx_k_Hashtable), 0, 0, 1, 1}, + {&__pyx_n_s_Nodegraph, __pyx_k_Nodegraph, sizeof(__pyx_k_Nodegraph), 0, 0, 1, 1}, + {&__pyx_n_s_Nodetable, __pyx_k_Nodetable, sizeof(__pyx_k_Nodetable), 0, 0, 1, 1}, +- {&__pyx_kp_u_Object_of_type_0_can_not_be_inte, __pyx_k_Object_of_type_0_can_not_be_inte, sizeof(__pyx_k_Object_of_type_0_can_not_be_inte), 0, 1, 0, 0}, ++ {&__pyx_kp_s_Object_of_type_0_can_not_be_inte, __pyx_k_Object_of_type_0_can_not_be_inte, sizeof(__pyx_k_Object_of_type_0_can_not_be_inte), 0, 0, 1, 0}, + {&__pyx_n_s_QFCounttable, __pyx_k_QFCounttable, sizeof(__pyx_k_QFCounttable), 0, 0, 1, 1}, + {&__pyx_n_s_ReadParser, __pyx_k_ReadParser, sizeof(__pyx_k_ReadParser), 0, 0, 1, 1}, + {&__pyx_n_s_SmallCountgraph, __pyx_k_SmallCountgraph, sizeof(__pyx_k_SmallCountgraph), 0, 0, 1, 1}, +@@ -19906,7 +20772,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_abundance, __pyx_k_abundance, sizeof(__pyx_k_abundance), 0, 0, 1, 1}, + {&__pyx_n_s_add, __pyx_k_add, sizeof(__pyx_k_add), 0, 0, 1, 1}, + {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1}, +- {&__pyx_kp_u_argument_does_not_appear_to_be_a, __pyx_k_argument_does_not_appear_to_be_a, sizeof(__pyx_k_argument_does_not_appear_to_be_a), 0, 1, 0, 0}, ++ {&__pyx_kp_s_argument_does_not_appear_to_be_a, __pyx_k_argument_does_not_appear_to_be_a, sizeof(__pyx_k_argument_does_not_appear_to_be_a), 0, 0, 1, 0}, + {&__pyx_n_s_band, __pyx_k_band, sizeof(__pyx_k_band), 0, 0, 1, 1}, + {&__pyx_n_s_break_on_circumference, __pyx_k_break_on_circumference, sizeof(__pyx_k_break_on_circumference), 0, 0, 1, 1}, + {&__pyx_n_s_break_on_stop_tags, __pyx_k_break_on_stop_tags, sizeof(__pyx_k_break_on_stop_tags), 0, 0, 1, 1}, +@@ -19970,11 +20836,11 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_kp_s_self__ht_this_cannot_be_converte, __pyx_k_self__ht_this_cannot_be_converte, sizeof(__pyx_k_self__ht_this_cannot_be_converte), 0, 0, 1, 0}, + {&__pyx_n_s_send, __pyx_k_send, sizeof(__pyx_k_send), 0, 0, 1, 1}, + {&__pyx_n_s_sequence, __pyx_k_sequence, sizeof(__pyx_k_sequence), 0, 0, 1, 1}, +- {&__pyx_kp_u_sequence_length_must_the_hashtab, __pyx_k_sequence_length_must_the_hashtab, sizeof(__pyx_k_sequence_length_must_the_hashtab), 0, 1, 0, 0}, ++ {&__pyx_kp_s_sequence_length_must_the_hashtab, __pyx_k_sequence_length_must_the_hashtab, sizeof(__pyx_k_sequence_length_must_the_hashtab), 0, 0, 1, 0}, + {&__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_size, __pyx_k_size, sizeof(__pyx_k_size), 0, 0, 1, 1}, +- {&__pyx_kp_u_size_has_to_be_a_power_of_two_no, __pyx_k_size_has_to_be_a_power_of_two_no, sizeof(__pyx_k_size_has_to_be_a_power_of_two_no), 0, 1, 0, 0}, ++ {&__pyx_kp_s_size_has_to_be_a_power_of_two_no, __pyx_k_size_has_to_be_a_power_of_two_no, sizeof(__pyx_k_size_has_to_be_a_power_of_two_no), 0, 0, 1, 0}, + {&__pyx_n_s_start_kmer, __pyx_k_start_kmer, sizeof(__pyx_k_start_kmer), 0, 0, 1, 1}, + {&__pyx_n_s_starting_size, __pyx_k_starting_size, sizeof(__pyx_k_starting_size), 0, 0, 1, 1}, + {&__pyx_n_s_stop_big_traversals, __pyx_k_stop_big_traversals, sizeof(__pyx_k_stop_big_traversals), 0, 0, 1, 1}, +@@ -20263,6 +21129,9 @@ static int __Pyx_modinit_function_export_code(void) { + + 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_5khmer_5_oxli_6graphs_Hashtable = &__pyx_vtable_5khmer_5_oxli_6graphs_Hashtable; +@@ -20274,7 +21143,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtable_5khmer_5_oxli_6graphs_Hashtable._get_parser = (oxli::read_parsers::FastxParserPtr (*)(struct __pyx_obj_5khmer_5_oxli_6graphs_Hashtable *, PyObject *))__pyx_f_5khmer_5_oxli_6graphs_9Hashtable__get_parser; + __pyx_vtable_5khmer_5_oxli_6graphs_Hashtable._get_raw_tables = (PyObject *(*)(struct __pyx_obj_5khmer_5_oxli_6graphs_Hashtable *, uint8_t **, std::vector ))__pyx_f_5khmer_5_oxli_6graphs_9Hashtable__get_raw_tables; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_6graphs_Hashtable) < 0) __PYX_ERR(1, 31, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_6graphs_Hashtable.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_6graphs_Hashtable.tp_dictoffset && __pyx_type_5khmer_5_oxli_6graphs_Hashtable.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_6graphs_Hashtable.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -20286,7 +21157,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtable_5khmer_5_oxli_6graphs_QFCounttable.__pyx_base = *__pyx_vtabptr_5khmer_5_oxli_6graphs_Hashtable; + __pyx_type_5khmer_5_oxli_6graphs_QFCounttable.tp_base = __pyx_ptype_5khmer_5_oxli_6graphs_Hashtable; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_6graphs_QFCounttable) < 0) __PYX_ERR(1, 350, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_6graphs_QFCounttable.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_6graphs_QFCounttable.tp_dictoffset && __pyx_type_5khmer_5_oxli_6graphs_QFCounttable.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_6graphs_QFCounttable.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -20298,7 +21171,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtable_5khmer_5_oxli_6graphs_SmallCounttable.__pyx_base = *__pyx_vtabptr_5khmer_5_oxli_6graphs_Hashtable; + __pyx_type_5khmer_5_oxli_6graphs_SmallCounttable.tp_base = __pyx_ptype_5khmer_5_oxli_6graphs_Hashtable; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_6graphs_SmallCounttable) < 0) __PYX_ERR(1, 424, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_6graphs_SmallCounttable.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_6graphs_SmallCounttable.tp_dictoffset && __pyx_type_5khmer_5_oxli_6graphs_SmallCounttable.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_6graphs_SmallCounttable.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -20310,7 +21185,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtable_5khmer_5_oxli_6graphs_Counttable.__pyx_base = *__pyx_vtabptr_5khmer_5_oxli_6graphs_Hashtable; + __pyx_type_5khmer_5_oxli_6graphs_Counttable.tp_base = __pyx_ptype_5khmer_5_oxli_6graphs_Hashtable; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_6graphs_Counttable) < 0) __PYX_ERR(1, 392, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_6graphs_Counttable.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_6graphs_Counttable.tp_dictoffset && __pyx_type_5khmer_5_oxli_6graphs_Counttable.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_6graphs_Counttable.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -20322,7 +21199,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtable_5khmer_5_oxli_6graphs_CyclicCounttable.__pyx_base = *__pyx_vtabptr_5khmer_5_oxli_6graphs_Hashtable; + __pyx_type_5khmer_5_oxli_6graphs_CyclicCounttable.tp_base = __pyx_ptype_5khmer_5_oxli_6graphs_Hashtable; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_6graphs_CyclicCounttable) < 0) __PYX_ERR(1, 408, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_6graphs_CyclicCounttable.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_6graphs_CyclicCounttable.tp_dictoffset && __pyx_type_5khmer_5_oxli_6graphs_CyclicCounttable.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_6graphs_CyclicCounttable.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -20334,7 +21213,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtable_5khmer_5_oxli_6graphs_Nodetable.__pyx_base = *__pyx_vtabptr_5khmer_5_oxli_6graphs_Hashtable; + __pyx_type_5khmer_5_oxli_6graphs_Nodetable.tp_base = __pyx_ptype_5khmer_5_oxli_6graphs_Hashtable; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_6graphs_Nodetable) < 0) __PYX_ERR(1, 447, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_6graphs_Nodetable.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_6graphs_Nodetable.tp_dictoffset && __pyx_type_5khmer_5_oxli_6graphs_Nodetable.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_6graphs_Nodetable.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -20346,7 +21227,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtable_5khmer_5_oxli_6graphs_Hashgraph.__pyx_base = *__pyx_vtabptr_5khmer_5_oxli_6graphs_Hashtable; + __pyx_type_5khmer_5_oxli_6graphs_Hashgraph.tp_base = __pyx_ptype_5khmer_5_oxli_6graphs_Hashtable; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_6graphs_Hashgraph) < 0) __PYX_ERR(1, 463, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_6graphs_Hashgraph.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_6graphs_Hashgraph.tp_dictoffset && __pyx_type_5khmer_5_oxli_6graphs_Hashgraph.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_6graphs_Hashgraph.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -20358,7 +21241,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtable_5khmer_5_oxli_6graphs_Nodegraph.__pyx_base = *__pyx_vtabptr_5khmer_5_oxli_6graphs_Hashgraph; + __pyx_type_5khmer_5_oxli_6graphs_Nodegraph.tp_base = __pyx_ptype_5khmer_5_oxli_6graphs_Hashgraph; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_6graphs_Nodegraph) < 0) __PYX_ERR(1, 883, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_6graphs_Nodegraph.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_6graphs_Nodegraph.tp_dictoffset && __pyx_type_5khmer_5_oxli_6graphs_Nodegraph.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_6graphs_Nodegraph.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -20370,7 +21255,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtable_5khmer_5_oxli_6graphs_Countgraph.__pyx_base = *__pyx_vtabptr_5khmer_5_oxli_6graphs_Hashgraph; + __pyx_type_5khmer_5_oxli_6graphs_Countgraph.tp_base = __pyx_ptype_5khmer_5_oxli_6graphs_Hashgraph; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_6graphs_Countgraph) < 0) __PYX_ERR(1, 817, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_6graphs_Countgraph.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_6graphs_Countgraph.tp_dictoffset && __pyx_type_5khmer_5_oxli_6graphs_Countgraph.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_6graphs_Countgraph.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -20382,7 +21269,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtable_5khmer_5_oxli_6graphs_SmallCountgraph.__pyx_base = *__pyx_vtabptr_5khmer_5_oxli_6graphs_Hashgraph; + __pyx_type_5khmer_5_oxli_6graphs_SmallCountgraph.tp_base = __pyx_ptype_5khmer_5_oxli_6graphs_Hashgraph; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_6graphs_SmallCountgraph) < 0) __PYX_ERR(1, 858, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_6graphs_SmallCountgraph.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_6graphs_SmallCountgraph.tp_dictoffset && __pyx_type_5khmer_5_oxli_6graphs_SmallCountgraph.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_6graphs_SmallCountgraph.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -20391,13 +21280,17 @@ static int __Pyx_modinit_type_init_code(void) { + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_5khmer_5_oxli_6graphs_SmallCountgraph) < 0) __PYX_ERR(1, 858, __pyx_L1_error) + __pyx_ptype_5khmer_5_oxli_6graphs_SmallCountgraph = &__pyx_type_5khmer_5_oxli_6graphs_SmallCountgraph; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_6graphs___pyx_scope_struct__tags) < 0) __PYX_ERR(1, 620, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_6graphs___pyx_scope_struct__tags.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_6graphs___pyx_scope_struct__tags.tp_dictoffset && __pyx_type_5khmer_5_oxli_6graphs___pyx_scope_struct__tags.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_6graphs___pyx_scope_struct__tags.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } + __pyx_ptype_5khmer_5_oxli_6graphs___pyx_scope_struct__tags = &__pyx_type_5khmer_5_oxli_6graphs___pyx_scope_struct__tags; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_6graphs___pyx_scope_struct_1_iter_stop_tags) < 0) __PYX_ERR(1, 810, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_6graphs___pyx_scope_struct_1_iter_stop_tags.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_6graphs___pyx_scope_struct_1_iter_stop_tags.tp_dictoffset && __pyx_type_5khmer_5_oxli_6graphs___pyx_scope_struct_1_iter_stop_tags.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_6graphs___pyx_scope_struct_1_iter_stop_tags.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } +@@ -20412,6 +21305,9 @@ static int __Pyx_modinit_type_init_code(void) { + 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("khmer._oxli.hashing"); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 62, __pyx_L1_error) +@@ -20482,13 +21378,17 @@ static int __Pyx_modinit_variable_import_code(void) { + static int __Pyx_modinit_function_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_function_import_code", 0); + /*--- Function import code ---*/ + __pyx_t_1 = PyImport_ImportModule("khmer._oxli.utils"); if (!__pyx_t_1) __PYX_ERR(1, 1, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_1); + if (__Pyx_ImportFunction(__pyx_t_1, "_bstring", (void (**)(void))&__pyx_f_5khmer_5_oxli_5utils__bstring, "PyObject *(PyObject *)") < 0) __PYX_ERR(1, 1, __pyx_L1_error) + if (__Pyx_ImportFunction(__pyx_t_1, "is_str", (void (**)(void))&__pyx_f_5khmer_5_oxli_5utils_is_str, "bool (PyObject *, int __pyx_skip_dispatch)") < 0) __PYX_ERR(1, 1, __pyx_L1_error) + if (__Pyx_ImportFunction(__pyx_t_1, "is_num", (void (**)(void))&__pyx_f_5khmer_5_oxli_5utils_is_num, "bool (PyObject *, int __pyx_skip_dispatch)") < 0) __PYX_ERR(1, 1, __pyx_L1_error) +- Py_DECREF(__pyx_t_1); __pyx_t_1 = 0; ++ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; +@@ -20498,17 +21398,19 @@ static int __Pyx_modinit_function_import_code(void) { + } + + +-#if PY_MAJOR_VERSION < 3 +-#ifdef CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC void +-#else ++#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 CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC PyObject * ++#ifdef __cplusplus ++#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * + #else +-#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC ++#define __Pyx_PyMODINIT_FUNC PyObject * + #endif + #endif + +@@ -20591,6 +21493,9 @@ static CYTHON_SMALL_CODE int __pyx_pymod_exec_graphs(PyObject *__pyx_pyinit_modu + { + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { +@@ -20638,11 +21543,9 @@ if (!__Pyx_RefNanny) { + #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? */ ++ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif +- #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; +@@ -20658,10 +21561,9 @@ if (!__Pyx_RefNanny) { + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(1, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(1, 1, __pyx_L1_error) +- __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(1, 1, __pyx_L1_error) +- #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); +- #endif ++ __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(1, 1, __pyx_L1_error) ++ Py_INCREF(__pyx_cython_runtime); + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(1, 1, __pyx_L1_error); + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitGlobals() < 0) __PYX_ERR(1, 1, __pyx_L1_error) +@@ -20687,10 +21589,10 @@ if (!__Pyx_RefNanny) { + (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)) goto __pyx_L1_error; +- if (unlikely(__Pyx_modinit_type_import_code() != 0)) goto __pyx_L1_error; ++ if (unlikely(__Pyx_modinit_type_init_code() < 0)) __PYX_ERR(1, 1, __pyx_L1_error) ++ if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(1, 1, __pyx_L1_error) + (void)__Pyx_modinit_variable_import_code(); +- if (unlikely(__Pyx_modinit_function_import_code() != 0)) goto __pyx_L1_error; ++ if (unlikely(__Pyx_modinit_function_import_code() < 0)) __PYX_ERR(1, 1, __pyx_L1_error) + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(1, 1, __pyx_L1_error) +@@ -20706,7 +21608,7 @@ if (!__Pyx_RefNanny) { + __Pyx_INCREF(__pyx_n_s_log); + __Pyx_GIVEREF(__pyx_n_s_log); + PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_log); +- __pyx_t_2 = __Pyx_Import(__pyx_n_s_math, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1, __pyx_L1_error) ++ __pyx_t_2 = __Pyx_Import(__pyx_n_s_math, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1, __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_log); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error) +@@ -20727,7 +21629,7 @@ if (!__Pyx_RefNanny) { + __Pyx_INCREF(__pyx_n_s_get_n_primes_near_x); + __Pyx_GIVEREF(__pyx_n_s_get_n_primes_near_x); + PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_get_n_primes_near_x); +- __pyx_t_1 = __Pyx_Import(__pyx_n_s_khmer__oxli_utils, __pyx_t_2, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) ++ __pyx_t_1 = __Pyx_Import(__pyx_n_s_khmer__oxli_utils, __pyx_t_2, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_get_n_primes_near_x); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 14, __pyx_L1_error) +@@ -20748,7 +21650,7 @@ if (!__Pyx_RefNanny) { + __Pyx_INCREF(__pyx_n_s_ReadParser); + __Pyx_GIVEREF(__pyx_n_s_ReadParser); + PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_ReadParser); +- __pyx_t_2 = __Pyx_Import(__pyx_n_s_khmer__khmer, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 24, __pyx_L1_error) ++ __pyx_t_2 = __Pyx_Import(__pyx_n_s_khmer__khmer, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 24, __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_ReadParser); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 24, __pyx_L1_error) +@@ -20933,6 +21835,32 @@ static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + return result; + } + ++/* 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 ++ + /* PyCFunctionFastCall */ + #if CYTHON_FAST_PYCCALL + static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { +@@ -20987,7 +21915,7 @@ static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args + return result; + } + #if 1 || PY_VERSION_HEX < 0x030600B1 +-static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs) { ++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); +@@ -21058,12 +21986,12 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + } + #if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); + #else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); + #endif +@@ -21079,7 +22007,7 @@ done: + #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; ++ ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) +@@ -21166,7 +22094,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec + 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) { ++ } else if (__Pyx_PyFastCFunction_Check(func)) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); + #endif + } +@@ -21477,7 +22405,7 @@ static int __Pyx_ParseOptionalKeywords( + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 +- if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { ++ if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { +@@ -21504,7 +22432,7 @@ static int __Pyx_ParseOptionalKeywords( + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -21520,7 +22448,7 @@ static int __Pyx_ParseOptionalKeywords( + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -21557,32 +22485,6 @@ bad: + return -1; + } + +-/* 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; +- length = stop - start; +- if (length <= 0) +- return PyUnicode_FromUnicode(NULL, 0); +-#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 +-} +- + /* GetModuleGlobalName */ + #if CYTHON_USE_DICT_VERSIONS + static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) +@@ -21762,6 +22664,53 @@ bad: + return -1; + } + ++/* 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; icurexc_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 ++ ++/* 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; +@@ -21782,53 +22731,81 @@ static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; ++ PyObject *object_getstate = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; ++ PyObject *getstate = NULL; ++#if CYTHON_USE_PYTYPE_LOOKUP ++ getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); ++#else ++ getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); ++ if (!getstate && PyErr_Occurred()) { ++ goto __PYX_BAD; ++ } ++#endif ++ if (getstate) { + #if CYTHON_USE_PYTYPE_LOOKUP +- if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto GOOD; ++ object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); + #else +- if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto GOOD; ++ object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); ++ if (!object_getstate && PyErr_Occurred()) { ++ goto __PYX_BAD; ++ } + #endif ++ if (object_getstate != getstate) { ++ goto __PYX_GOOD; ++ } ++ } + #if CYTHON_USE_PYTYPE_LOOKUP +- object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; ++ 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 BAD; ++ 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 BAD; ++ 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 BAD; ++ 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 BAD; ++ 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 BAD; ++ 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_GetAttrStr(type_obj, __pyx_n_s_reduce_cython); if (unlikely(!reduce_cython)) goto BAD; +- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto BAD; +- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto BAD; ++ 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_GetAttrStr(type_obj, __pyx_n_s_setstate_cython); if (unlikely(!setstate_cython)) goto BAD; +- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto BAD; +- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto BAD; ++ 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 GOOD; +-BAD: ++ 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; +-GOOD: ++__PYX_GOOD: + #if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); ++ Py_XDECREF(object_getstate); ++ Py_XDECREF(getstate); + #endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); +@@ -21949,7 +22926,7 @@ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { +- if (strchr(__Pyx_MODULE_NAME, '.')) { ++ if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) { + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, 1); + if (!module) { +@@ -22008,6 +22985,7 @@ static PyObject* __Pyx_Method_ClassMethod(PyObject *method) { + #if CYTHON_COMPILING_IN_PYSTON || CYTHON_COMPILING_IN_PYPY + if (PyMethodDescr_Check(method)) + #else ++ #if PY_MAJOR_VERSION == 2 + static PyTypeObject *methoddescr_type = NULL; + if (methoddescr_type == NULL) { + PyObject *meth = PyObject_GetAttrString((PyObject*)&PyList_Type, "append"); +@@ -22015,6 +22993,9 @@ static PyObject* __Pyx_Method_ClassMethod(PyObject *method) { + methoddescr_type = Py_TYPE(meth); + Py_DECREF(meth); + } ++ #else ++ PyTypeObject *methoddescr_type = &PyMethodDescr_Type; ++ #endif + if (__Pyx_TypeCheck(method, methoddescr_type)) + #endif + { +@@ -22030,44 +23011,10 @@ static PyObject* __Pyx_Method_ClassMethod(PyObject *method) { + else if (PyMethod_Check(method)) { + return PyClassMethod_New(PyMethod_GET_FUNCTION(method)); + } +- else if (PyCFunction_Check(method)) { +- return PyClassMethod_New(method); +- } +-#ifdef __Pyx_CyFunction_USED +- else if (__Pyx_CyFunction_Check(method)) { ++ else { + return PyClassMethod_New(method); + } +-#endif +- PyErr_SetString(PyExc_TypeError, +- "Class-level classmethod() can only be called on " +- "a method_descriptor or instance method."); +- return NULL; +-} +- +-/* 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; icurexc_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 + + /* GetNameInClass */ + static PyObject *__Pyx_GetGlobalNameAfterAttributeLookup(PyObject *name) { +@@ -22091,7 +23038,7 @@ static PyObject *__Pyx__GetNameInClass(PyObject *nmspace, PyObject *name) { + + /* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +-static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { ++static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; + #if CYTHON_COMPILING_IN_CPYTHON +@@ -22121,7 +23068,7 @@ static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + } + if (!use_cline) { + c_line = 0; +- PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); ++ (void) 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; +@@ -22195,7 +23142,7 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + 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)); ++ __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } +@@ -22215,33 +23162,40 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + #include "compile.h" + #include "frameobject.h" + #include "traceback.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + 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; ++ PyCodeObject *py_code = NULL; ++ PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 ++ PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); +- #else +- py_srcfile = PyUnicode_FromString(filename); +- #endif + if (!py_srcfile) goto bad; ++ #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; ++ funcname = PyUnicode_AsUTF8(py_funcname); ++ if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); +- #else +- py_funcname = PyUnicode_FromString(funcname); ++ if (!py_funcname) goto bad; + #endif + } +- if (!py_funcname) goto bad; ++ #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, +@@ -22260,11 +23214,16 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); +- Py_DECREF(py_funcname); ++ #else ++ py_code = PyCode_NewEmpty(filename, funcname, py_line); ++ #endif ++ Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline + return py_code; + bad: +- Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); ++ #if PY_MAJOR_VERSION < 3 ++ Py_XDECREF(py_srcfile); ++ #endif + return NULL; + } + static void __Pyx_AddTraceback(const char *funcname, int c_line, +@@ -22272,14 +23231,24 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; ++ PyObject *ptype, *pvalue, *ptraceback; + 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) { ++ __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); +- if (!py_code) goto bad; ++ if (!py_code) { ++ /* If the code object creation fails, then we should clear the ++ fetched exception references and propagate the new exception */ ++ Py_XDECREF(ptype); ++ Py_XDECREF(pvalue); ++ Py_XDECREF(ptraceback); ++ goto bad; ++ } ++ __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( +@@ -22318,361 +23287,419 @@ bad: + return (target_type) value;\ + } + +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_HashIntoType(oxli::HashIntoType value) { +- const oxli::HashIntoType neg_one = (oxli::HashIntoType) ((oxli::HashIntoType) 0 - (oxli::HashIntoType) 1), const_zero = (oxli::HashIntoType) 0; ++/* CIntFromPy */ ++static CYTHON_INLINE oxli::HashIntoType __Pyx_PyInt_As_oxli_3a__3a_HashIntoType(PyObject *x) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::HashIntoType neg_one = (oxli::HashIntoType) -1, const_zero = (oxli::HashIntoType) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { ++#if PY_MAJOR_VERSION < 3 ++ if (likely(PyInt_Check(x))) { + if (sizeof(oxli::HashIntoType) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(oxli::HashIntoType) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::HashIntoType) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif ++ __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, long, PyInt_AS_LONG(x)) ++ } else { ++ long val = PyInt_AS_LONG(x); ++ if (is_unsigned && unlikely(val < 0)) { ++ goto raise_neg_overflow; ++ } ++ return (oxli::HashIntoType) val; + } +- } else { +- if (sizeof(oxli::HashIntoType) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::HashIntoType) <= sizeof(PY_LONG_LONG)) { +- return PyLong_FromLongLong((PY_LONG_LONG) value); ++ } else + #endif +- } +- } +- { +- int one = 1; int little = (int)*(unsigned char *)&one; +- unsigned char *bytes = (unsigned char *)&value; +- return _PyLong_FromByteArray(bytes, sizeof(oxli::HashIntoType), +- little, !is_unsigned); +- } +-} +- +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_BoundedCounterType(oxli::BoundedCounterType value) { +- const oxli::BoundedCounterType neg_one = (oxli::BoundedCounterType) ((oxli::BoundedCounterType) 0 - (oxli::BoundedCounterType) 1), const_zero = (oxli::BoundedCounterType) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(oxli::BoundedCounterType) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(oxli::BoundedCounterType) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); ++ 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 (oxli::HashIntoType) 0; ++ case 1: __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, digit, digits[0]) ++ case 2: ++ if (8 * sizeof(oxli::HashIntoType) > 1 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { ++ __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(oxli::HashIntoType) >= 2 * PyLong_SHIFT) { ++ return (oxli::HashIntoType) (((((oxli::HashIntoType)digits[1]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[0])); ++ } ++ } ++ break; ++ case 3: ++ if (8 * sizeof(oxli::HashIntoType) > 2 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { ++ __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(oxli::HashIntoType) >= 3 * PyLong_SHIFT) { ++ return (oxli::HashIntoType) (((((((oxli::HashIntoType)digits[2]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[1]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[0])); ++ } ++ } ++ break; ++ case 4: ++ if (8 * sizeof(oxli::HashIntoType) > 3 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { ++ __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, 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(oxli::HashIntoType) >= 4 * PyLong_SHIFT) { ++ return (oxli::HashIntoType) (((((((((oxli::HashIntoType)digits[3]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[2]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[1]) << PyLong_SHIFT) | (oxli::HashIntoType)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 (oxli::HashIntoType) -1; ++ if (unlikely(result == 1)) ++ goto raise_neg_overflow; ++ } ++#endif ++ if (sizeof(oxli::HashIntoType) <= sizeof(unsigned long)) { ++ __PYX_VERIFY_RETURN_INT_EXC(oxli::HashIntoType, unsigned long, PyLong_AsUnsignedLong(x)) + #ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::BoundedCounterType) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++ } else if (sizeof(oxli::HashIntoType) <= sizeof(unsigned PY_LONG_LONG)) { ++ __PYX_VERIFY_RETURN_INT_EXC(oxli::HashIntoType, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) + #endif +- } +- } else { +- if (sizeof(oxli::BoundedCounterType) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::BoundedCounterType) <= 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(oxli::BoundedCounterType), +- little, !is_unsigned); +- } +-} +- +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_WordLength(oxli::WordLength value) { +- const oxli::WordLength neg_one = (oxli::WordLength) ((oxli::WordLength) 0 - (oxli::WordLength) 1), const_zero = (oxli::WordLength) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(oxli::WordLength) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(oxli::WordLength) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::WordLength) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++ } ++ } else { ++#if CYTHON_USE_PYLONG_INTERNALS ++ const digit* digits = ((PyLongObject*)x)->ob_digit; ++ switch (Py_SIZE(x)) { ++ case 0: return (oxli::HashIntoType) 0; ++ case -1: __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, sdigit, (sdigit) (-(sdigit)digits[0])) ++ case 1: __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, digit, +digits[0]) ++ case -2: ++ if (8 * sizeof(oxli::HashIntoType) - 1 > 1 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { ++ __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(oxli::HashIntoType) - 1 > 2 * PyLong_SHIFT) { ++ return (oxli::HashIntoType) (((oxli::HashIntoType)-1)*(((((oxli::HashIntoType)digits[1]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[0]))); ++ } ++ } ++ break; ++ case 2: ++ if (8 * sizeof(oxli::HashIntoType) > 1 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { ++ __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(oxli::HashIntoType) - 1 > 2 * PyLong_SHIFT) { ++ return (oxli::HashIntoType) ((((((oxli::HashIntoType)digits[1]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[0]))); ++ } ++ } ++ break; ++ case -3: ++ if (8 * sizeof(oxli::HashIntoType) - 1 > 2 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { ++ __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(oxli::HashIntoType) - 1 > 3 * PyLong_SHIFT) { ++ return (oxli::HashIntoType) (((oxli::HashIntoType)-1)*(((((((oxli::HashIntoType)digits[2]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[1]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[0]))); ++ } ++ } ++ break; ++ case 3: ++ if (8 * sizeof(oxli::HashIntoType) > 2 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { ++ __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(oxli::HashIntoType) - 1 > 3 * PyLong_SHIFT) { ++ return (oxli::HashIntoType) ((((((((oxli::HashIntoType)digits[2]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[1]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[0]))); ++ } ++ } ++ break; ++ case -4: ++ if (8 * sizeof(oxli::HashIntoType) - 1 > 3 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { ++ __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, 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(oxli::HashIntoType) - 1 > 4 * PyLong_SHIFT) { ++ return (oxli::HashIntoType) (((oxli::HashIntoType)-1)*(((((((((oxli::HashIntoType)digits[3]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[2]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[1]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[0]))); ++ } ++ } ++ break; ++ case 4: ++ if (8 * sizeof(oxli::HashIntoType) > 3 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { ++ __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, 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(oxli::HashIntoType) - 1 > 4 * PyLong_SHIFT) { ++ return (oxli::HashIntoType) ((((((((((oxli::HashIntoType)digits[3]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[2]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[1]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[0]))); ++ } ++ } ++ break; ++ } + #endif +- } +- } else { +- if (sizeof(oxli::WordLength) <= sizeof(long)) { +- return PyInt_FromLong((long) value); ++ if (sizeof(oxli::HashIntoType) <= sizeof(long)) { ++ __PYX_VERIFY_RETURN_INT_EXC(oxli::HashIntoType, long, PyLong_AsLong(x)) + #ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::WordLength) <= sizeof(PY_LONG_LONG)) { +- return PyLong_FromLongLong((PY_LONG_LONG) value); ++ } else if (sizeof(oxli::HashIntoType) <= sizeof(PY_LONG_LONG)) { ++ __PYX_VERIFY_RETURN_INT_EXC(oxli::HashIntoType, PY_LONG_LONG, PyLong_AsLongLong(x)) + #endif ++ } + } +- } +- { +- int one = 1; int little = (int)*(unsigned char *)&one; +- unsigned char *bytes = (unsigned char *)&value; +- return _PyLong_FromByteArray(bytes, sizeof(oxli::WordLength), +- little, !is_unsigned); +- } +-} +- +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint64_t(uint64_t value) { +- 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 (is_unsigned) { +- if (sizeof(uint64_t) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(uint64_t) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(uint64_t) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++ { ++#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) ++ PyErr_SetString(PyExc_RuntimeError, ++ "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); ++#else ++ oxli::HashIntoType 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 (oxli::HashIntoType) -1; + } + } else { +- if (sizeof(uint64_t) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(uint64_t) <= 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(uint64_t), +- little, !is_unsigned); ++ oxli::HashIntoType val; ++ PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); ++ if (!tmp) return (oxli::HashIntoType) -1; ++ val = __Pyx_PyInt_As_oxli_3a__3a_HashIntoType(tmp); ++ Py_DECREF(tmp); ++ return val; + } ++raise_overflow: ++ PyErr_SetString(PyExc_OverflowError, ++ "value too large to convert to oxli::HashIntoType"); ++ return (oxli::HashIntoType) -1; ++raise_neg_overflow: ++ PyErr_SetString(PyExc_OverflowError, ++ "can't convert negative value to oxli::HashIntoType"); ++ return (oxli::HashIntoType) -1; + } + +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint32_t(uint32_t value) { +- const uint32_t neg_one = (uint32_t) ((uint32_t) 0 - (uint32_t) 1), const_zero = (uint32_t) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(uint32_t) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(uint32_t) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(uint32_t) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++/* CIntFromPy */ ++static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" + #endif +- } +- } else { +- if (sizeof(uint32_t) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(uint32_t) <= sizeof(PY_LONG_LONG)) { +- return PyLong_FromLongLong((PY_LONG_LONG) value); ++ const int neg_one = (int) -1, const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop + #endif +- } +- } +- { +- int one = 1; int little = (int)*(unsigned char *)&one; +- unsigned char *bytes = (unsigned char *)&value; +- return _PyLong_FromByteArray(bytes, sizeof(uint32_t), +- little, !is_unsigned); +- } +-} +- +-/* 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 PY_MAJOR_VERSION < 3 ++ if (likely(PyInt_Check(x))) { + 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_unsigned_int(unsigned int value) { +- const unsigned int neg_one = (unsigned int) ((unsigned int) 0 - (unsigned int) 1), const_zero = (unsigned int) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(unsigned int) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(unsigned int) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif +- } +- } else { +- if (sizeof(unsigned int) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned 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(unsigned int), +- little, !is_unsigned); +- } +-} +- +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_PY_LONG_LONG(unsigned PY_LONG_LONG value) { +- const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG) ((unsigned PY_LONG_LONG) 0 - (unsigned PY_LONG_LONG) 1), const_zero = (unsigned PY_LONG_LONG) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(unsigned PY_LONG_LONG) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif +- } +- } else { +- if (sizeof(unsigned PY_LONG_LONG) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(PY_LONG_LONG)) { +- return PyLong_FromLongLong((PY_LONG_LONG) value); +-#endif ++ __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; + } +- } +- { +- int one = 1; int little = (int)*(unsigned char *)&one; +- unsigned char *bytes = (unsigned char *)&value; +- return _PyLong_FromByteArray(bytes, sizeof(unsigned PY_LONG_LONG), +- 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); ++ } else + #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); ++ 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 +- } +- } +- { +- int one = 1; int little = (int)*(unsigned char *)&one; +- unsigned char *bytes = (unsigned char *)&value; +- return _PyLong_FromByteArray(bytes, sizeof(long), +- little, !is_unsigned); +- } +-} +- +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_PartitionID(oxli::PartitionID value) { +- const oxli::PartitionID neg_one = (oxli::PartitionID) ((oxli::PartitionID) 0 - (oxli::PartitionID) 1), const_zero = (oxli::PartitionID) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(oxli::PartitionID) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(oxli::PartitionID) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::PartitionID) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#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 +- } +- } else { +- if (sizeof(oxli::PartitionID) <= sizeof(long)) { +- return PyInt_FromLong((long) value); ++ if (sizeof(int) <= sizeof(unsigned long)) { ++ __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) + #ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::PartitionID) <= sizeof(PY_LONG_LONG)) { +- return PyLong_FromLongLong((PY_LONG_LONG) value); ++ } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { ++ __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) + #endif +- } +- } +- { +- int one = 1; int little = (int)*(unsigned char *)&one; +- unsigned char *bytes = (unsigned char *)&value; +- return _PyLong_FromByteArray(bytes, sizeof(oxli::PartitionID), +- little, !is_unsigned); +- } +-} +- +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_long(unsigned long value) { +- const unsigned long neg_one = (unsigned long) ((unsigned long) 0 - (unsigned long) 1), const_zero = (unsigned long) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(unsigned long) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(unsigned long) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); ++ } ++ } 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(unsigned long) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++ } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { ++ __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) + #endif ++ } + } +- } else { +- if (sizeof(unsigned long) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned long) <= sizeof(PY_LONG_LONG)) { +- return PyLong_FromLongLong((PY_LONG_LONG) value); ++ { ++#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; + } +- { +- int one = 1; int little = (int)*(unsigned char *)&one; +- unsigned char *bytes = (unsigned char *)&value; +- return _PyLong_FromByteArray(bytes, sizeof(unsigned long), +- little, !is_unsigned); +- } ++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; + } + + /* CIntFromPy */ +-static CYTHON_INLINE oxli::HashIntoType __Pyx_PyInt_As_oxli_3a__3a_HashIntoType(PyObject *x) { +- const oxli::HashIntoType neg_one = (oxli::HashIntoType) ((oxli::HashIntoType) 0 - (oxli::HashIntoType) 1), const_zero = (oxli::HashIntoType) 0; ++static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *x) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const uint64_t neg_one = (uint64_t) -1, const_zero = (uint64_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +- if (sizeof(oxli::HashIntoType) < sizeof(long)) { +- __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, long, PyInt_AS_LONG(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 (oxli::HashIntoType) val; ++ return (uint64_t) val; + } + } else + #endif +@@ -22681,32 +23708,32 @@ static CYTHON_INLINE oxli::HashIntoType __Pyx_PyInt_As_oxli_3a__3a_HashIntoType( + #if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { +- case 0: return (oxli::HashIntoType) 0; +- case 1: __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, digit, digits[0]) ++ case 0: return (uint64_t) 0; ++ case 1: __PYX_VERIFY_RETURN_INT(uint64_t, digit, digits[0]) + case 2: +- if (8 * sizeof(oxli::HashIntoType) > 1 * PyLong_SHIFT) { ++ if (8 * sizeof(uint64_t) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(oxli::HashIntoType) >= 2 * PyLong_SHIFT) { +- return (oxli::HashIntoType) (((((oxli::HashIntoType)digits[1]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[0])); ++ __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(oxli::HashIntoType) > 2 * PyLong_SHIFT) { ++ if (8 * sizeof(uint64_t) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(oxli::HashIntoType) >= 3 * PyLong_SHIFT) { +- return (oxli::HashIntoType) (((((((oxli::HashIntoType)digits[2]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[1]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[0])); ++ __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(oxli::HashIntoType) > 3 * PyLong_SHIFT) { ++ if (8 * sizeof(uint64_t) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, 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(oxli::HashIntoType) >= 4 * PyLong_SHIFT) { +- return (oxli::HashIntoType) (((((((((oxli::HashIntoType)digits[3]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[2]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[1]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[0])); ++ __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; +@@ -22720,86 +23747,86 @@ static CYTHON_INLINE oxli::HashIntoType __Pyx_PyInt_As_oxli_3a__3a_HashIntoType( + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) +- return (oxli::HashIntoType) -1; ++ return (uint64_t) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } + #endif +- if (sizeof(oxli::HashIntoType) <= sizeof(unsigned long)) { +- __PYX_VERIFY_RETURN_INT_EXC(oxli::HashIntoType, unsigned long, PyLong_AsUnsignedLong(x)) ++ 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(oxli::HashIntoType) <= sizeof(unsigned PY_LONG_LONG)) { +- __PYX_VERIFY_RETURN_INT_EXC(oxli::HashIntoType, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) ++ } 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 (oxli::HashIntoType) 0; +- case -1: __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, sdigit, (sdigit) (-(sdigit)digits[0])) +- case 1: __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, digit, +digits[0]) ++ 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(oxli::HashIntoType) - 1 > 1 * PyLong_SHIFT) { ++ if (8 * sizeof(uint64_t) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(oxli::HashIntoType) - 1 > 2 * PyLong_SHIFT) { +- return (oxli::HashIntoType) (((oxli::HashIntoType)-1)*(((((oxli::HashIntoType)digits[1]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[0]))); ++ __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(oxli::HashIntoType) > 1 * PyLong_SHIFT) { ++ if (8 * sizeof(uint64_t) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(oxli::HashIntoType) - 1 > 2 * PyLong_SHIFT) { +- return (oxli::HashIntoType) ((((((oxli::HashIntoType)digits[1]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[0]))); ++ __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(oxli::HashIntoType) - 1 > 2 * PyLong_SHIFT) { ++ if (8 * sizeof(uint64_t) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(oxli::HashIntoType) - 1 > 3 * PyLong_SHIFT) { +- return (oxli::HashIntoType) (((oxli::HashIntoType)-1)*(((((((oxli::HashIntoType)digits[2]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[1]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[0]))); ++ __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(oxli::HashIntoType) > 2 * PyLong_SHIFT) { ++ if (8 * sizeof(uint64_t) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(oxli::HashIntoType) - 1 > 3 * PyLong_SHIFT) { +- return (oxli::HashIntoType) ((((((((oxli::HashIntoType)digits[2]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[1]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[0]))); ++ __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(oxli::HashIntoType) - 1 > 3 * PyLong_SHIFT) { ++ if (8 * sizeof(uint64_t) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, 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(oxli::HashIntoType) - 1 > 4 * PyLong_SHIFT) { +- return (oxli::HashIntoType) (((oxli::HashIntoType)-1)*(((((((((oxli::HashIntoType)digits[3]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[2]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[1]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[0]))); ++ __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(oxli::HashIntoType) > 3 * PyLong_SHIFT) { ++ if (8 * sizeof(uint64_t) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::HashIntoType, 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(oxli::HashIntoType) - 1 > 4 * PyLong_SHIFT) { +- return (oxli::HashIntoType) ((((((((((oxli::HashIntoType)digits[3]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[2]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[1]) << PyLong_SHIFT) | (oxli::HashIntoType)digits[0]))); ++ __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(oxli::HashIntoType) <= sizeof(long)) { +- __PYX_VERIFY_RETURN_INT_EXC(oxli::HashIntoType, long, PyLong_AsLong(x)) ++ if (sizeof(uint64_t) <= sizeof(long)) { ++ __PYX_VERIFY_RETURN_INT_EXC(uint64_t, long, PyLong_AsLong(x)) + #ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::HashIntoType) <= sizeof(PY_LONG_LONG)) { +- __PYX_VERIFY_RETURN_INT_EXC(oxli::HashIntoType, PY_LONG_LONG, PyLong_AsLongLong(x)) ++ } else if (sizeof(uint64_t) <= sizeof(PY_LONG_LONG)) { ++ __PYX_VERIFY_RETURN_INT_EXC(uint64_t, PY_LONG_LONG, PyLong_AsLongLong(x)) + #endif + } + } +@@ -22808,7 +23835,7 @@ static CYTHON_INLINE oxli::HashIntoType __Pyx_PyInt_As_oxli_3a__3a_HashIntoType( + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); + #else +- oxli::HashIntoType val; ++ uint64_t val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { +@@ -22828,40 +23855,47 @@ static CYTHON_INLINE oxli::HashIntoType __Pyx_PyInt_As_oxli_3a__3a_HashIntoType( + return val; + } + #endif +- return (oxli::HashIntoType) -1; ++ return (uint64_t) -1; + } + } else { +- oxli::HashIntoType val; ++ uint64_t val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); +- if (!tmp) return (oxli::HashIntoType) -1; +- val = __Pyx_PyInt_As_oxli_3a__3a_HashIntoType(tmp); ++ 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 oxli::HashIntoType"); +- return (oxli::HashIntoType) -1; ++ "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 oxli::HashIntoType"); +- return (oxli::HashIntoType) -1; ++ "can't convert negative value to uint64_t"); ++ return (uint64_t) -1; + } + + /* CIntFromPy */ +-static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +- const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0; ++static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *x) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const unsigned int neg_one = (unsigned int) -1, const_zero = (unsigned int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + 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)) ++ if (sizeof(unsigned int) < sizeof(long)) { ++ __PYX_VERIFY_RETURN_INT(unsigned 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; ++ return (unsigned int) val; + } + } else + #endif +@@ -22870,32 +23904,32 @@ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { + #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 0: return (unsigned int) 0; ++ case 1: __PYX_VERIFY_RETURN_INT(unsigned int, digit, digits[0]) + case 2: +- if (8 * sizeof(int) > 1 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned 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])); ++ __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(unsigned int) >= 2 * PyLong_SHIFT) { ++ return (unsigned int) (((((unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])); + } + } + break; + case 3: +- if (8 * sizeof(int) > 2 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned 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])); ++ __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(unsigned int) >= 3 * PyLong_SHIFT) { ++ return (unsigned int) (((((((unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])); + } + } + break; + case 4: +- if (8 * sizeof(int) > 3 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned 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])); ++ __PYX_VERIFY_RETURN_INT(unsigned 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(unsigned int) >= 4 * PyLong_SHIFT) { ++ return (unsigned int) (((((((((unsigned int)digits[3]) << PyLong_SHIFT) | (unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])); + } + } + break; +@@ -22909,86 +23943,86 @@ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) +- return (int) -1; ++ return (unsigned 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)) ++ if (sizeof(unsigned int) <= sizeof(unsigned long)) { ++ __PYX_VERIFY_RETURN_INT_EXC(unsigned 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)) ++ } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) { ++ __PYX_VERIFY_RETURN_INT_EXC(unsigned 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 0: return (unsigned int) 0; ++ case -1: __PYX_VERIFY_RETURN_INT(unsigned int, sdigit, (sdigit) (-(sdigit)digits[0])) ++ case 1: __PYX_VERIFY_RETURN_INT(unsigned int, digit, +digits[0]) + case -2: +- if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned 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]))); ++ __PYX_VERIFY_RETURN_INT(unsigned int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(unsigned int) - 1 > 2 * PyLong_SHIFT) { ++ return (unsigned int) (((unsigned int)-1)*(((((unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); + } + } + break; + case 2: +- if (8 * sizeof(int) > 1 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned 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]))); ++ __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(unsigned int) - 1 > 2 * PyLong_SHIFT) { ++ return (unsigned int) ((((((unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); + } + } + break; + case -3: +- if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned 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]))); ++ __PYX_VERIFY_RETURN_INT(unsigned int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(unsigned int) - 1 > 3 * PyLong_SHIFT) { ++ return (unsigned int) (((unsigned int)-1)*(((((((unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); + } + } + break; + case 3: +- if (8 * sizeof(int) > 2 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned 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]))); ++ __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(unsigned int) - 1 > 3 * PyLong_SHIFT) { ++ return (unsigned int) ((((((((unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); + } + } + break; + case -4: +- if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned 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]))); ++ __PYX_VERIFY_RETURN_INT(unsigned 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(unsigned int) - 1 > 4 * PyLong_SHIFT) { ++ return (unsigned int) (((unsigned int)-1)*(((((((((unsigned int)digits[3]) << PyLong_SHIFT) | (unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); + } + } + break; + case 4: +- if (8 * sizeof(int) > 3 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned 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]))); ++ __PYX_VERIFY_RETURN_INT(unsigned 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(unsigned int) - 1 > 4 * PyLong_SHIFT) { ++ return (unsigned int) ((((((((((unsigned int)digits[3]) << PyLong_SHIFT) | (unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); + } + } + break; + } + #endif +- if (sizeof(int) <= sizeof(long)) { +- __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) ++ if (sizeof(unsigned int) <= sizeof(long)) { ++ __PYX_VERIFY_RETURN_INT_EXC(unsigned 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)) ++ } else if (sizeof(unsigned int) <= sizeof(PY_LONG_LONG)) { ++ __PYX_VERIFY_RETURN_INT_EXC(unsigned int, PY_LONG_LONG, PyLong_AsLongLong(x)) + #endif + } + } +@@ -22997,7 +24031,7 @@ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); + #else +- int val; ++ unsigned int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { +@@ -23017,40 +24051,47 @@ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { + return val; + } + #endif +- return (int) -1; ++ return (unsigned int) -1; + } + } else { +- int val; ++ unsigned int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); +- if (!tmp) return (int) -1; +- val = __Pyx_PyInt_As_int(tmp); ++ if (!tmp) return (unsigned int) -1; ++ val = __Pyx_PyInt_As_unsigned_int(tmp); + Py_DECREF(tmp); + return val; + } + raise_overflow: + PyErr_SetString(PyExc_OverflowError, +- "value too large to convert to int"); +- return (int) -1; ++ "value too large to convert to unsigned int"); ++ return (unsigned int) -1; + raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, +- "can't convert negative value to int"); +- return (int) -1; ++ "can't convert negative value to unsigned int"); ++ return (unsigned int) -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; ++static CYTHON_INLINE oxli::PartitionID __Pyx_PyInt_As_oxli_3a__3a_PartitionID(PyObject *x) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::PartitionID neg_one = (oxli::PartitionID) -1, const_zero = (oxli::PartitionID) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + 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)) ++ if (sizeof(oxli::PartitionID) < sizeof(long)) { ++ __PYX_VERIFY_RETURN_INT(oxli::PartitionID, 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; ++ return (oxli::PartitionID) val; + } + } else + #endif +@@ -23059,32 +24100,32 @@ static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *x) { + #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 0: return (oxli::PartitionID) 0; ++ case 1: __PYX_VERIFY_RETURN_INT(oxli::PartitionID, digit, digits[0]) + case 2: +- if (8 * sizeof(uint64_t) > 1 * PyLong_SHIFT) { ++ if (8 * sizeof(oxli::PartitionID) > 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])); ++ __PYX_VERIFY_RETURN_INT(oxli::PartitionID, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(oxli::PartitionID) >= 2 * PyLong_SHIFT) { ++ return (oxli::PartitionID) (((((oxli::PartitionID)digits[1]) << PyLong_SHIFT) | (oxli::PartitionID)digits[0])); + } + } + break; + case 3: +- if (8 * sizeof(uint64_t) > 2 * PyLong_SHIFT) { ++ if (8 * sizeof(oxli::PartitionID) > 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])); ++ __PYX_VERIFY_RETURN_INT(oxli::PartitionID, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(oxli::PartitionID) >= 3 * PyLong_SHIFT) { ++ return (oxli::PartitionID) (((((((oxli::PartitionID)digits[2]) << PyLong_SHIFT) | (oxli::PartitionID)digits[1]) << PyLong_SHIFT) | (oxli::PartitionID)digits[0])); + } + } + break; + case 4: +- if (8 * sizeof(uint64_t) > 3 * PyLong_SHIFT) { ++ if (8 * sizeof(oxli::PartitionID) > 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])); ++ __PYX_VERIFY_RETURN_INT(oxli::PartitionID, 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(oxli::PartitionID) >= 4 * PyLong_SHIFT) { ++ return (oxli::PartitionID) (((((((((oxli::PartitionID)digits[3]) << PyLong_SHIFT) | (oxli::PartitionID)digits[2]) << PyLong_SHIFT) | (oxli::PartitionID)digits[1]) << PyLong_SHIFT) | (oxli::PartitionID)digits[0])); + } + } + break; +@@ -23098,86 +24139,86 @@ static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *x) { + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) +- return (uint64_t) -1; ++ return (oxli::PartitionID) -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)) ++ if (sizeof(oxli::PartitionID) <= sizeof(unsigned long)) { ++ __PYX_VERIFY_RETURN_INT_EXC(oxli::PartitionID, 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)) ++ } else if (sizeof(oxli::PartitionID) <= sizeof(unsigned PY_LONG_LONG)) { ++ __PYX_VERIFY_RETURN_INT_EXC(oxli::PartitionID, 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 0: return (oxli::PartitionID) 0; ++ case -1: __PYX_VERIFY_RETURN_INT(oxli::PartitionID, sdigit, (sdigit) (-(sdigit)digits[0])) ++ case 1: __PYX_VERIFY_RETURN_INT(oxli::PartitionID, digit, +digits[0]) + case -2: +- if (8 * sizeof(uint64_t) - 1 > 1 * PyLong_SHIFT) { ++ if (8 * sizeof(oxli::PartitionID) - 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]))); ++ __PYX_VERIFY_RETURN_INT(oxli::PartitionID, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(oxli::PartitionID) - 1 > 2 * PyLong_SHIFT) { ++ return (oxli::PartitionID) (((oxli::PartitionID)-1)*(((((oxli::PartitionID)digits[1]) << PyLong_SHIFT) | (oxli::PartitionID)digits[0]))); + } + } + break; + case 2: +- if (8 * sizeof(uint64_t) > 1 * PyLong_SHIFT) { ++ if (8 * sizeof(oxli::PartitionID) > 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]))); ++ __PYX_VERIFY_RETURN_INT(oxli::PartitionID, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(oxli::PartitionID) - 1 > 2 * PyLong_SHIFT) { ++ return (oxli::PartitionID) ((((((oxli::PartitionID)digits[1]) << PyLong_SHIFT) | (oxli::PartitionID)digits[0]))); + } + } + break; + case -3: +- if (8 * sizeof(uint64_t) - 1 > 2 * PyLong_SHIFT) { ++ if (8 * sizeof(oxli::PartitionID) - 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]))); ++ __PYX_VERIFY_RETURN_INT(oxli::PartitionID, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(oxli::PartitionID) - 1 > 3 * PyLong_SHIFT) { ++ return (oxli::PartitionID) (((oxli::PartitionID)-1)*(((((((oxli::PartitionID)digits[2]) << PyLong_SHIFT) | (oxli::PartitionID)digits[1]) << PyLong_SHIFT) | (oxli::PartitionID)digits[0]))); + } + } + break; + case 3: +- if (8 * sizeof(uint64_t) > 2 * PyLong_SHIFT) { ++ if (8 * sizeof(oxli::PartitionID) > 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]))); ++ __PYX_VERIFY_RETURN_INT(oxli::PartitionID, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(oxli::PartitionID) - 1 > 3 * PyLong_SHIFT) { ++ return (oxli::PartitionID) ((((((((oxli::PartitionID)digits[2]) << PyLong_SHIFT) | (oxli::PartitionID)digits[1]) << PyLong_SHIFT) | (oxli::PartitionID)digits[0]))); + } + } + break; + case -4: +- if (8 * sizeof(uint64_t) - 1 > 3 * PyLong_SHIFT) { ++ if (8 * sizeof(oxli::PartitionID) - 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]))); ++ __PYX_VERIFY_RETURN_INT(oxli::PartitionID, 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(oxli::PartitionID) - 1 > 4 * PyLong_SHIFT) { ++ return (oxli::PartitionID) (((oxli::PartitionID)-1)*(((((((((oxli::PartitionID)digits[3]) << PyLong_SHIFT) | (oxli::PartitionID)digits[2]) << PyLong_SHIFT) | (oxli::PartitionID)digits[1]) << PyLong_SHIFT) | (oxli::PartitionID)digits[0]))); + } + } + break; + case 4: +- if (8 * sizeof(uint64_t) > 3 * PyLong_SHIFT) { ++ if (8 * sizeof(oxli::PartitionID) > 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]))); ++ __PYX_VERIFY_RETURN_INT(oxli::PartitionID, 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(oxli::PartitionID) - 1 > 4 * PyLong_SHIFT) { ++ return (oxli::PartitionID) ((((((((((oxli::PartitionID)digits[3]) << PyLong_SHIFT) | (oxli::PartitionID)digits[2]) << PyLong_SHIFT) | (oxli::PartitionID)digits[1]) << PyLong_SHIFT) | (oxli::PartitionID)digits[0]))); + } + } + break; + } + #endif +- if (sizeof(uint64_t) <= sizeof(long)) { +- __PYX_VERIFY_RETURN_INT_EXC(uint64_t, long, PyLong_AsLong(x)) ++ if (sizeof(oxli::PartitionID) <= sizeof(long)) { ++ __PYX_VERIFY_RETURN_INT_EXC(oxli::PartitionID, 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)) ++ } else if (sizeof(oxli::PartitionID) <= sizeof(PY_LONG_LONG)) { ++ __PYX_VERIFY_RETURN_INT_EXC(oxli::PartitionID, PY_LONG_LONG, PyLong_AsLongLong(x)) + #endif + } + } +@@ -23186,7 +24227,7 @@ static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *x) { + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); + #else +- uint64_t val; ++ oxli::PartitionID val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { +@@ -23206,40 +24247,47 @@ static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *x) { + return val; + } + #endif +- return (uint64_t) -1; ++ return (oxli::PartitionID) -1; + } + } else { +- uint64_t val; ++ oxli::PartitionID val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); +- if (!tmp) return (uint64_t) -1; +- val = __Pyx_PyInt_As_uint64_t(tmp); ++ if (!tmp) return (oxli::PartitionID) -1; ++ val = __Pyx_PyInt_As_oxli_3a__3a_PartitionID(tmp); + Py_DECREF(tmp); + return val; + } + raise_overflow: + PyErr_SetString(PyExc_OverflowError, +- "value too large to convert to uint64_t"); +- return (uint64_t) -1; ++ "value too large to convert to oxli::PartitionID"); ++ return (oxli::PartitionID) -1; + raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, +- "can't convert negative value to uint64_t"); +- return (uint64_t) -1; ++ "can't convert negative value to oxli::PartitionID"); ++ return (oxli::PartitionID) -1; + } + + /* CIntFromPy */ +-static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *x) { +- const unsigned int neg_one = (unsigned int) ((unsigned int) 0 - (unsigned int) 1), const_zero = (unsigned int) 0; ++static CYTHON_INLINE oxli::BoundedCounterType __Pyx_PyInt_As_oxli_3a__3a_BoundedCounterType(PyObject *x) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::BoundedCounterType neg_one = (oxli::BoundedCounterType) -1, const_zero = (oxli::BoundedCounterType) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +- if (sizeof(unsigned int) < sizeof(long)) { +- __PYX_VERIFY_RETURN_INT(unsigned int, long, PyInt_AS_LONG(x)) ++ if (sizeof(oxli::BoundedCounterType) < sizeof(long)) { ++ __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } +- return (unsigned int) val; ++ return (oxli::BoundedCounterType) val; + } + } else + #endif +@@ -23248,32 +24296,32 @@ static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *x) { + #if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { +- case 0: return (unsigned int) 0; +- case 1: __PYX_VERIFY_RETURN_INT(unsigned int, digit, digits[0]) ++ case 0: return (oxli::BoundedCounterType) 0; ++ case 1: __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, digit, digits[0]) + case 2: +- if (8 * sizeof(unsigned int) > 1 * PyLong_SHIFT) { ++ if (8 * sizeof(oxli::BoundedCounterType) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(unsigned int) >= 2 * PyLong_SHIFT) { +- return (unsigned int) (((((unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])); ++ __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(oxli::BoundedCounterType) >= 2 * PyLong_SHIFT) { ++ return (oxli::BoundedCounterType) (((((oxli::BoundedCounterType)digits[1]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[0])); + } + } + break; + case 3: +- if (8 * sizeof(unsigned int) > 2 * PyLong_SHIFT) { ++ if (8 * sizeof(oxli::BoundedCounterType) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(unsigned int) >= 3 * PyLong_SHIFT) { +- return (unsigned int) (((((((unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])); ++ __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(oxli::BoundedCounterType) >= 3 * PyLong_SHIFT) { ++ return (oxli::BoundedCounterType) (((((((oxli::BoundedCounterType)digits[2]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[1]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[0])); + } + } + break; + case 4: +- if (8 * sizeof(unsigned int) > 3 * PyLong_SHIFT) { ++ if (8 * sizeof(oxli::BoundedCounterType) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(unsigned 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(unsigned int) >= 4 * PyLong_SHIFT) { +- return (unsigned int) (((((((((unsigned int)digits[3]) << PyLong_SHIFT) | (unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])); ++ __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, 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(oxli::BoundedCounterType) >= 4 * PyLong_SHIFT) { ++ return (oxli::BoundedCounterType) (((((((((oxli::BoundedCounterType)digits[3]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[2]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[1]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[0])); + } + } + break; +@@ -23287,86 +24335,86 @@ static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *x) { + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) +- return (unsigned int) -1; ++ return (oxli::BoundedCounterType) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } + #endif +- if (sizeof(unsigned int) <= sizeof(unsigned long)) { +- __PYX_VERIFY_RETURN_INT_EXC(unsigned int, unsigned long, PyLong_AsUnsignedLong(x)) ++ if (sizeof(oxli::BoundedCounterType) <= sizeof(unsigned long)) { ++ __PYX_VERIFY_RETURN_INT_EXC(oxli::BoundedCounterType, unsigned long, PyLong_AsUnsignedLong(x)) + #ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) { +- __PYX_VERIFY_RETURN_INT_EXC(unsigned int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) ++ } else if (sizeof(oxli::BoundedCounterType) <= sizeof(unsigned PY_LONG_LONG)) { ++ __PYX_VERIFY_RETURN_INT_EXC(oxli::BoundedCounterType, 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 (unsigned int) 0; +- case -1: __PYX_VERIFY_RETURN_INT(unsigned int, sdigit, (sdigit) (-(sdigit)digits[0])) +- case 1: __PYX_VERIFY_RETURN_INT(unsigned int, digit, +digits[0]) ++ case 0: return (oxli::BoundedCounterType) 0; ++ case -1: __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, sdigit, (sdigit) (-(sdigit)digits[0])) ++ case 1: __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, digit, +digits[0]) + case -2: +- if (8 * sizeof(unsigned int) - 1 > 1 * PyLong_SHIFT) { ++ if (8 * sizeof(oxli::BoundedCounterType) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(unsigned int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(unsigned int) - 1 > 2 * PyLong_SHIFT) { +- return (unsigned int) (((unsigned int)-1)*(((((unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); ++ __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(oxli::BoundedCounterType) - 1 > 2 * PyLong_SHIFT) { ++ return (oxli::BoundedCounterType) (((oxli::BoundedCounterType)-1)*(((((oxli::BoundedCounterType)digits[1]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[0]))); + } + } + break; + case 2: +- if (8 * sizeof(unsigned int) > 1 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(unsigned int) - 1 > 2 * PyLong_SHIFT) { +- return (unsigned int) ((((((unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); ++ if (8 * sizeof(oxli::BoundedCounterType) > 1 * PyLong_SHIFT) { ++ if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { ++ __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(oxli::BoundedCounterType) - 1 > 2 * PyLong_SHIFT) { ++ return (oxli::BoundedCounterType) ((((((oxli::BoundedCounterType)digits[1]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[0]))); + } + } + break; + case -3: +- if (8 * sizeof(unsigned int) - 1 > 2 * PyLong_SHIFT) { ++ if (8 * sizeof(oxli::BoundedCounterType) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(unsigned int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(unsigned int) - 1 > 3 * PyLong_SHIFT) { +- return (unsigned int) (((unsigned int)-1)*(((((((unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); ++ __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(oxli::BoundedCounterType) - 1 > 3 * PyLong_SHIFT) { ++ return (oxli::BoundedCounterType) (((oxli::BoundedCounterType)-1)*(((((((oxli::BoundedCounterType)digits[2]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[1]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[0]))); + } + } + break; + case 3: +- if (8 * sizeof(unsigned int) > 2 * PyLong_SHIFT) { ++ if (8 * sizeof(oxli::BoundedCounterType) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(unsigned int) - 1 > 3 * PyLong_SHIFT) { +- return (unsigned int) ((((((((unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); ++ __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) ++ } else if (8 * sizeof(oxli::BoundedCounterType) - 1 > 3 * PyLong_SHIFT) { ++ return (oxli::BoundedCounterType) ((((((((oxli::BoundedCounterType)digits[2]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[1]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[0]))); + } + } + break; + case -4: +- if (8 * sizeof(unsigned int) - 1 > 3 * PyLong_SHIFT) { ++ if (8 * sizeof(oxli::BoundedCounterType) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(unsigned 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(unsigned int) - 1 > 4 * PyLong_SHIFT) { +- return (unsigned int) (((unsigned int)-1)*(((((((((unsigned int)digits[3]) << PyLong_SHIFT) | (unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); ++ __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, 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(oxli::BoundedCounterType) - 1 > 4 * PyLong_SHIFT) { ++ return (oxli::BoundedCounterType) (((oxli::BoundedCounterType)-1)*(((((((((oxli::BoundedCounterType)digits[3]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[2]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[1]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[0]))); + } + } + break; + case 4: +- if (8 * sizeof(unsigned int) > 3 * PyLong_SHIFT) { ++ if (8 * sizeof(oxli::BoundedCounterType) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(unsigned 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(unsigned int) - 1 > 4 * PyLong_SHIFT) { +- return (unsigned int) ((((((((((unsigned int)digits[3]) << PyLong_SHIFT) | (unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); ++ __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, 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(oxli::BoundedCounterType) - 1 > 4 * PyLong_SHIFT) { ++ return (oxli::BoundedCounterType) ((((((((((oxli::BoundedCounterType)digits[3]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[2]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[1]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[0]))); + } + } + break; + } + #endif +- if (sizeof(unsigned int) <= sizeof(long)) { +- __PYX_VERIFY_RETURN_INT_EXC(unsigned int, long, PyLong_AsLong(x)) ++ if (sizeof(oxli::BoundedCounterType) <= sizeof(long)) { ++ __PYX_VERIFY_RETURN_INT_EXC(oxli::BoundedCounterType, long, PyLong_AsLong(x)) + #ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned int) <= sizeof(PY_LONG_LONG)) { +- __PYX_VERIFY_RETURN_INT_EXC(unsigned int, PY_LONG_LONG, PyLong_AsLongLong(x)) ++ } else if (sizeof(oxli::BoundedCounterType) <= sizeof(PY_LONG_LONG)) { ++ __PYX_VERIFY_RETURN_INT_EXC(oxli::BoundedCounterType, PY_LONG_LONG, PyLong_AsLongLong(x)) + #endif + } + } +@@ -23375,7 +24423,7 @@ static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *x) { + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); + #else +- unsigned int val; ++ oxli::BoundedCounterType val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { +@@ -23395,407 +24443,454 @@ static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *x) { + return val; + } + #endif +- return (unsigned int) -1; ++ return (oxli::BoundedCounterType) -1; + } + } else { +- unsigned int val; ++ oxli::BoundedCounterType val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); +- if (!tmp) return (unsigned int) -1; +- val = __Pyx_PyInt_As_unsigned_int(tmp); ++ if (!tmp) return (oxli::BoundedCounterType) -1; ++ val = __Pyx_PyInt_As_oxli_3a__3a_BoundedCounterType(tmp); + Py_DECREF(tmp); + return val; + } + raise_overflow: + PyErr_SetString(PyExc_OverflowError, +- "value too large to convert to unsigned int"); +- return (unsigned int) -1; ++ "value too large to convert to oxli::BoundedCounterType"); ++ return (oxli::BoundedCounterType) -1; + raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, +- "can't convert negative value to unsigned int"); +- return (unsigned int) -1; ++ "can't convert negative value to oxli::BoundedCounterType"); ++ return (oxli::BoundedCounterType) -1; + } + +-/* CIntFromPy */ +-static CYTHON_INLINE oxli::PartitionID __Pyx_PyInt_As_oxli_3a__3a_PartitionID(PyObject *x) { +- const oxli::PartitionID neg_one = (oxli::PartitionID) ((oxli::PartitionID) 0 - (oxli::PartitionID) 1), const_zero = (oxli::PartitionID) 0; ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_HashIntoType(oxli::HashIntoType value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::HashIntoType neg_one = (oxli::HashIntoType) -1, const_zero = (oxli::HashIntoType) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; +-#if PY_MAJOR_VERSION < 3 +- if (likely(PyInt_Check(x))) { +- if (sizeof(oxli::PartitionID) < sizeof(long)) { +- __PYX_VERIFY_RETURN_INT(oxli::PartitionID, long, PyInt_AS_LONG(x)) +- } else { +- long val = PyInt_AS_LONG(x); +- if (is_unsigned && unlikely(val < 0)) { +- goto raise_neg_overflow; +- } +- return (oxli::PartitionID) val; ++ if (is_unsigned) { ++ if (sizeof(oxli::HashIntoType) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(oxli::HashIntoType) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::HashIntoType) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif + } +- } else ++ } else { ++ if (sizeof(oxli::HashIntoType) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::HashIntoType) <= sizeof(PY_LONG_LONG)) { ++ return PyLong_FromLongLong((PY_LONG_LONG) value); + #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 (oxli::PartitionID) 0; +- case 1: __PYX_VERIFY_RETURN_INT(oxli::PartitionID, digit, digits[0]) +- case 2: +- if (8 * sizeof(oxli::PartitionID) > 1 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::PartitionID, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(oxli::PartitionID) >= 2 * PyLong_SHIFT) { +- return (oxli::PartitionID) (((((oxli::PartitionID)digits[1]) << PyLong_SHIFT) | (oxli::PartitionID)digits[0])); +- } +- } +- break; +- case 3: +- if (8 * sizeof(oxli::PartitionID) > 2 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::PartitionID, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(oxli::PartitionID) >= 3 * PyLong_SHIFT) { +- return (oxli::PartitionID) (((((((oxli::PartitionID)digits[2]) << PyLong_SHIFT) | (oxli::PartitionID)digits[1]) << PyLong_SHIFT) | (oxli::PartitionID)digits[0])); +- } +- } +- break; +- case 4: +- if (8 * sizeof(oxli::PartitionID) > 3 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::PartitionID, 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(oxli::PartitionID) >= 4 * PyLong_SHIFT) { +- return (oxli::PartitionID) (((((((((oxli::PartitionID)digits[3]) << PyLong_SHIFT) | (oxli::PartitionID)digits[2]) << PyLong_SHIFT) | (oxli::PartitionID)digits[1]) << PyLong_SHIFT) | (oxli::PartitionID)digits[0])); +- } +- } +- break; +- } ++ } ++ } ++ { ++ int one = 1; int little = (int)*(unsigned char *)&one; ++ unsigned char *bytes = (unsigned char *)&value; ++ return _PyLong_FromByteArray(bytes, sizeof(oxli::HashIntoType), ++ little, !is_unsigned); ++ } ++} ++ ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_BoundedCounterType(oxli::BoundedCounterType value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" + #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 (oxli::PartitionID) -1; +- if (unlikely(result == 1)) +- goto raise_neg_overflow; +- } ++ const oxli::BoundedCounterType neg_one = (oxli::BoundedCounterType) -1, const_zero = (oxli::BoundedCounterType) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(oxli::BoundedCounterType) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(oxli::BoundedCounterType) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::BoundedCounterType) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(oxli::BoundedCounterType) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::BoundedCounterType) <= 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(oxli::BoundedCounterType), ++ little, !is_unsigned); ++ } ++} ++ ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_WordLength(oxli::WordLength value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::WordLength neg_one = (oxli::WordLength) -1, const_zero = (oxli::WordLength) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(oxli::WordLength) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(oxli::WordLength) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::WordLength) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(oxli::WordLength) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::WordLength) <= 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(oxli::WordLength), ++ little, !is_unsigned); ++ } ++} ++ ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint64_t(uint64_t value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const uint64_t neg_one = (uint64_t) -1, const_zero = (uint64_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(uint64_t) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(uint64_t) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(uint64_t) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(uint64_t) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(uint64_t) <= 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(uint64_t), ++ little, !is_unsigned); ++ } ++} ++ ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint32_t(uint32_t value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const uint32_t neg_one = (uint32_t) -1, const_zero = (uint32_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(uint32_t) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(uint32_t) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(uint32_t) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + #endif +- if (sizeof(oxli::PartitionID) <= sizeof(unsigned long)) { +- __PYX_VERIFY_RETURN_INT_EXC(oxli::PartitionID, unsigned long, PyLong_AsUnsignedLong(x)) ++ } ++ } else { ++ if (sizeof(uint32_t) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); + #ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::PartitionID) <= sizeof(unsigned PY_LONG_LONG)) { +- __PYX_VERIFY_RETURN_INT_EXC(oxli::PartitionID, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) ++ } else if (sizeof(uint32_t) <= sizeof(PY_LONG_LONG)) { ++ return PyLong_FromLongLong((PY_LONG_LONG) value); + #endif +- } +- } else { +-#if CYTHON_USE_PYLONG_INTERNALS +- const digit* digits = ((PyLongObject*)x)->ob_digit; +- switch (Py_SIZE(x)) { +- case 0: return (oxli::PartitionID) 0; +- case -1: __PYX_VERIFY_RETURN_INT(oxli::PartitionID, sdigit, (sdigit) (-(sdigit)digits[0])) +- case 1: __PYX_VERIFY_RETURN_INT(oxli::PartitionID, digit, +digits[0]) +- case -2: +- if (8 * sizeof(oxli::PartitionID) - 1 > 1 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::PartitionID, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(oxli::PartitionID) - 1 > 2 * PyLong_SHIFT) { +- return (oxli::PartitionID) (((oxli::PartitionID)-1)*(((((oxli::PartitionID)digits[1]) << PyLong_SHIFT) | (oxli::PartitionID)digits[0]))); +- } +- } +- break; +- case 2: +- if (8 * sizeof(oxli::PartitionID) > 1 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::PartitionID, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(oxli::PartitionID) - 1 > 2 * PyLong_SHIFT) { +- return (oxli::PartitionID) ((((((oxli::PartitionID)digits[1]) << PyLong_SHIFT) | (oxli::PartitionID)digits[0]))); +- } +- } +- break; +- case -3: +- if (8 * sizeof(oxli::PartitionID) - 1 > 2 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::PartitionID, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(oxli::PartitionID) - 1 > 3 * PyLong_SHIFT) { +- return (oxli::PartitionID) (((oxli::PartitionID)-1)*(((((((oxli::PartitionID)digits[2]) << PyLong_SHIFT) | (oxli::PartitionID)digits[1]) << PyLong_SHIFT) | (oxli::PartitionID)digits[0]))); +- } +- } +- break; +- case 3: +- if (8 * sizeof(oxli::PartitionID) > 2 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::PartitionID, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(oxli::PartitionID) - 1 > 3 * PyLong_SHIFT) { +- return (oxli::PartitionID) ((((((((oxli::PartitionID)digits[2]) << PyLong_SHIFT) | (oxli::PartitionID)digits[1]) << PyLong_SHIFT) | (oxli::PartitionID)digits[0]))); +- } +- } +- break; +- case -4: +- if (8 * sizeof(oxli::PartitionID) - 1 > 3 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::PartitionID, 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(oxli::PartitionID) - 1 > 4 * PyLong_SHIFT) { +- return (oxli::PartitionID) (((oxli::PartitionID)-1)*(((((((((oxli::PartitionID)digits[3]) << PyLong_SHIFT) | (oxli::PartitionID)digits[2]) << PyLong_SHIFT) | (oxli::PartitionID)digits[1]) << PyLong_SHIFT) | (oxli::PartitionID)digits[0]))); +- } +- } +- break; +- case 4: +- if (8 * sizeof(oxli::PartitionID) > 3 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::PartitionID, 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(oxli::PartitionID) - 1 > 4 * PyLong_SHIFT) { +- return (oxli::PartitionID) ((((((((((oxli::PartitionID)digits[3]) << PyLong_SHIFT) | (oxli::PartitionID)digits[2]) << PyLong_SHIFT) | (oxli::PartitionID)digits[1]) << PyLong_SHIFT) | (oxli::PartitionID)digits[0]))); +- } +- } +- break; +- } ++ } ++ } ++ { ++ int one = 1; int little = (int)*(unsigned char *)&one; ++ unsigned char *bytes = (unsigned char *)&value; ++ return _PyLong_FromByteArray(bytes, sizeof(uint32_t), ++ little, !is_unsigned); ++ } ++} ++ ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" + #endif +- if (sizeof(oxli::PartitionID) <= sizeof(long)) { +- __PYX_VERIFY_RETURN_INT_EXC(oxli::PartitionID, long, PyLong_AsLong(x)) ++ const int neg_one = (int) -1, const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ 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(oxli::PartitionID) <= sizeof(PY_LONG_LONG)) { +- __PYX_VERIFY_RETURN_INT_EXC(oxli::PartitionID, PY_LONG_LONG, PyLong_AsLongLong(x)) ++ } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + #endif +- } + } +- { +-#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) +- PyErr_SetString(PyExc_RuntimeError, +- "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +-#else +- oxli::PartitionID 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; +- } ++ } 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_unsigned_int(unsigned int value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const unsigned int neg_one = (unsigned int) -1, const_zero = (unsigned int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(unsigned int) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(unsigned int) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + #endif +- return (oxli::PartitionID) -1; + } + } else { +- oxli::PartitionID val; +- PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); +- if (!tmp) return (oxli::PartitionID) -1; +- val = __Pyx_PyInt_As_oxli_3a__3a_PartitionID(tmp); +- Py_DECREF(tmp); +- return val; ++ if (sizeof(unsigned int) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(unsigned 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(unsigned int), ++ little, !is_unsigned); + } +-raise_overflow: +- PyErr_SetString(PyExc_OverflowError, +- "value too large to convert to oxli::PartitionID"); +- return (oxli::PartitionID) -1; +-raise_neg_overflow: +- PyErr_SetString(PyExc_OverflowError, +- "can't convert negative value to oxli::PartitionID"); +- return (oxli::PartitionID) -1; + } + +-/* CIntFromPy */ +-static CYTHON_INLINE oxli::BoundedCounterType __Pyx_PyInt_As_oxli_3a__3a_BoundedCounterType(PyObject *x) { +- const oxli::BoundedCounterType neg_one = (oxli::BoundedCounterType) ((oxli::BoundedCounterType) 0 - (oxli::BoundedCounterType) 1), const_zero = (oxli::BoundedCounterType) 0; ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_PY_LONG_LONG(unsigned PY_LONG_LONG value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG) -1, const_zero = (unsigned PY_LONG_LONG) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; +-#if PY_MAJOR_VERSION < 3 +- if (likely(PyInt_Check(x))) { +- if (sizeof(oxli::BoundedCounterType) < sizeof(long)) { +- __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, long, PyInt_AS_LONG(x)) +- } else { +- long val = PyInt_AS_LONG(x); +- if (is_unsigned && unlikely(val < 0)) { +- goto raise_neg_overflow; +- } +- return (oxli::BoundedCounterType) val; ++ if (is_unsigned) { ++ if (sizeof(unsigned PY_LONG_LONG) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif + } +- } else ++ } else { ++ if (sizeof(unsigned PY_LONG_LONG) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(PY_LONG_LONG)) { ++ return PyLong_FromLongLong((PY_LONG_LONG) value); + #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 (oxli::BoundedCounterType) 0; +- case 1: __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, digit, digits[0]) +- case 2: +- if (8 * sizeof(oxli::BoundedCounterType) > 1 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(oxli::BoundedCounterType) >= 2 * PyLong_SHIFT) { +- return (oxli::BoundedCounterType) (((((oxli::BoundedCounterType)digits[1]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[0])); +- } +- } +- break; +- case 3: +- if (8 * sizeof(oxli::BoundedCounterType) > 2 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(oxli::BoundedCounterType) >= 3 * PyLong_SHIFT) { +- return (oxli::BoundedCounterType) (((((((oxli::BoundedCounterType)digits[2]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[1]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[0])); +- } +- } +- break; +- case 4: +- if (8 * sizeof(oxli::BoundedCounterType) > 3 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, 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(oxli::BoundedCounterType) >= 4 * PyLong_SHIFT) { +- return (oxli::BoundedCounterType) (((((((((oxli::BoundedCounterType)digits[3]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[2]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[1]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[0])); +- } +- } +- break; +- } ++ } ++ } ++ { ++ int one = 1; int little = (int)*(unsigned char *)&one; ++ unsigned char *bytes = (unsigned char *)&value; ++ return _PyLong_FromByteArray(bytes, sizeof(unsigned PY_LONG_LONG), ++ little, !is_unsigned); ++ } ++} ++ ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" + #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 (oxli::BoundedCounterType) -1; +- if (unlikely(result == 1)) +- goto raise_neg_overflow; +- } ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop + #endif +- if (sizeof(oxli::BoundedCounterType) <= sizeof(unsigned long)) { +- __PYX_VERIFY_RETURN_INT_EXC(oxli::BoundedCounterType, unsigned long, PyLong_AsUnsignedLong(x)) ++ 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(oxli::BoundedCounterType) <= sizeof(unsigned PY_LONG_LONG)) { +- __PYX_VERIFY_RETURN_INT_EXC(oxli::BoundedCounterType, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) ++ } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + #endif +- } +- } else { +-#if CYTHON_USE_PYLONG_INTERNALS +- const digit* digits = ((PyLongObject*)x)->ob_digit; +- switch (Py_SIZE(x)) { +- case 0: return (oxli::BoundedCounterType) 0; +- case -1: __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, sdigit, (sdigit) (-(sdigit)digits[0])) +- case 1: __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, digit, +digits[0]) +- case -2: +- if (8 * sizeof(oxli::BoundedCounterType) - 1 > 1 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(oxli::BoundedCounterType) - 1 > 2 * PyLong_SHIFT) { +- return (oxli::BoundedCounterType) (((oxli::BoundedCounterType)-1)*(((((oxli::BoundedCounterType)digits[1]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[0]))); +- } +- } +- break; +- case 2: +- if (8 * sizeof(oxli::BoundedCounterType) > 1 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(oxli::BoundedCounterType) - 1 > 2 * PyLong_SHIFT) { +- return (oxli::BoundedCounterType) ((((((oxli::BoundedCounterType)digits[1]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[0]))); +- } +- } +- break; +- case -3: +- if (8 * sizeof(oxli::BoundedCounterType) - 1 > 2 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(oxli::BoundedCounterType) - 1 > 3 * PyLong_SHIFT) { +- return (oxli::BoundedCounterType) (((oxli::BoundedCounterType)-1)*(((((((oxli::BoundedCounterType)digits[2]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[1]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[0]))); +- } +- } +- break; +- case 3: +- if (8 * sizeof(oxli::BoundedCounterType) > 2 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) +- } else if (8 * sizeof(oxli::BoundedCounterType) - 1 > 3 * PyLong_SHIFT) { +- return (oxli::BoundedCounterType) ((((((((oxli::BoundedCounterType)digits[2]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[1]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[0]))); +- } +- } +- break; +- case -4: +- if (8 * sizeof(oxli::BoundedCounterType) - 1 > 3 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, 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(oxli::BoundedCounterType) - 1 > 4 * PyLong_SHIFT) { +- return (oxli::BoundedCounterType) (((oxli::BoundedCounterType)-1)*(((((((((oxli::BoundedCounterType)digits[3]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[2]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[1]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[0]))); +- } +- } +- break; +- case 4: +- if (8 * sizeof(oxli::BoundedCounterType) > 3 * PyLong_SHIFT) { +- if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { +- __PYX_VERIFY_RETURN_INT(oxli::BoundedCounterType, 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(oxli::BoundedCounterType) - 1 > 4 * PyLong_SHIFT) { +- return (oxli::BoundedCounterType) ((((((((((oxli::BoundedCounterType)digits[3]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[2]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[1]) << PyLong_SHIFT) | (oxli::BoundedCounterType)digits[0]))); +- } +- } +- break; +- } ++ } ++ } 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 +- if (sizeof(oxli::BoundedCounterType) <= sizeof(long)) { +- __PYX_VERIFY_RETURN_INT_EXC(oxli::BoundedCounterType, long, PyLong_AsLong(x)) ++ } ++ } ++ { ++ int one = 1; int little = (int)*(unsigned char *)&one; ++ unsigned char *bytes = (unsigned char *)&value; ++ return _PyLong_FromByteArray(bytes, sizeof(long), ++ little, !is_unsigned); ++ } ++} ++ ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_PartitionID(oxli::PartitionID value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::PartitionID neg_one = (oxli::PartitionID) -1, const_zero = (oxli::PartitionID) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(oxli::PartitionID) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(oxli::PartitionID) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); + #ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::BoundedCounterType) <= sizeof(PY_LONG_LONG)) { +- __PYX_VERIFY_RETURN_INT_EXC(oxli::BoundedCounterType, PY_LONG_LONG, PyLong_AsLongLong(x)) ++ } else if (sizeof(oxli::PartitionID) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + #endif +- } + } +- { +-#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) +- PyErr_SetString(PyExc_RuntimeError, +- "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +-#else +- oxli::BoundedCounterType 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; +- } ++ } else { ++ if (sizeof(oxli::PartitionID) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::PartitionID) <= 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(oxli::PartitionID), ++ little, !is_unsigned); ++ } ++} ++ ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_long(unsigned long value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const unsigned long neg_one = (unsigned long) -1, const_zero = (unsigned long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(unsigned long) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(unsigned long) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(unsigned long) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + #endif +- return (oxli::BoundedCounterType) -1; + } + } else { +- oxli::BoundedCounterType val; +- PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); +- if (!tmp) return (oxli::BoundedCounterType) -1; +- val = __Pyx_PyInt_As_oxli_3a__3a_BoundedCounterType(tmp); +- Py_DECREF(tmp); +- return val; ++ if (sizeof(unsigned long) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(unsigned 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(unsigned long), ++ little, !is_unsigned); + } +-raise_overflow: +- PyErr_SetString(PyExc_OverflowError, +- "value too large to convert to oxli::BoundedCounterType"); +- return (oxli::BoundedCounterType) -1; +-raise_neg_overflow: +- PyErr_SetString(PyExc_OverflowError, +- "can't convert negative value to oxli::BoundedCounterType"); +- return (oxli::BoundedCounterType) -1; + } + + /* CIntFromPy */ + static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *x) { +- const size_t neg_one = (size_t) ((size_t) 0 - (size_t) 1), const_zero = (size_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const size_t neg_one = (size_t) -1, const_zero = (size_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -23984,7 +25079,14 @@ raise_neg_overflow: + + /* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -24518,6 +25620,12 @@ static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name + /* CoroutineBase */ + #include + #include ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + #define __Pyx_Coroutine_Undelegate(gen) Py_CLEAR((gen)->yieldfrom) + static int __Pyx_PyGen__FetchStopIterationValue(CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject **pvalue) { + PyObject *et, *ev, *tb; +@@ -24689,9 +25797,13 @@ PyObject *__Pyx_Coroutine_SendEx(__pyx_CoroutineObject *self, PyObject *value, i + if (exc_state->exc_traceback) { + PyTracebackObject *tb = (PyTracebackObject *) exc_state->exc_traceback; + PyFrameObject *f = tb->tb_frame; +- Py_XINCREF(tstate->frame); + assert(f->f_back == NULL); ++ #if PY_VERSION_HEX >= 0x030B00A1 ++ f->f_back = PyThreadState_GetFrame(tstate); ++ #else ++ Py_XINCREF(tstate->frame); + f->f_back = tstate->frame; ++ #endif + } + #endif + } +@@ -24744,6 +25856,30 @@ PyObject *__Pyx_Coroutine_MethodReturn(CYTHON_UNUSED PyObject* gen, PyObject *re + } + return retval; + } ++#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) ++static CYTHON_INLINE ++PyObject *__Pyx_PyGen_Send(PyGenObject *gen, PyObject *arg) { ++#if PY_VERSION_HEX <= 0x030A00A1 ++ return _PyGen_Send(gen, arg); ++#else ++ PyObject *result; ++ if (PyIter_Send((PyObject*)gen, arg ? arg : Py_None, &result) == PYGEN_RETURN) { ++ if (PyAsyncGen_CheckExact(gen)) { ++ assert(result == Py_None); ++ PyErr_SetNone(PyExc_StopAsyncIteration); ++ } ++ else if (result == Py_None) { ++ PyErr_SetNone(PyExc_StopIteration); ++ } ++ else { ++ _PyGen_SetStopIterationValue(result); ++ } ++ Py_CLEAR(result); ++ } ++ return result; ++#endif ++} ++#endif + static CYTHON_INLINE + PyObject *__Pyx_Coroutine_FinishDelegation(__pyx_CoroutineObject *gen) { + PyObject *ret; +@@ -24780,12 +25916,12 @@ static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) { + #endif + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) + if (PyGen_CheckExact(yf)) { +- ret = _PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); ++ ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); + } else + #endif + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03050000 && defined(PyCoro_CheckExact) && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) + if (PyCoro_CheckExact(yf)) { +- ret = _PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); ++ ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); + } else + #endif + { +@@ -24869,7 +26005,7 @@ static PyObject *__Pyx_Generator_Next(PyObject *self) { + #endif + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) + if (PyGen_CheckExact(yf)) { +- ret = _PyGen_Send((PyGenObject*)yf, NULL); ++ ret = __Pyx_PyGen_Send((PyGenObject*)yf, NULL); + } else + #endif + #ifdef __Pyx_Coroutine_USED +@@ -25029,6 +26165,7 @@ static int __Pyx_Coroutine_clear(PyObject *self) { + } + #endif + Py_CLEAR(gen->gi_code); ++ Py_CLEAR(gen->gi_frame); + Py_CLEAR(gen->gi_name); + Py_CLEAR(gen->gi_qualname); + Py_CLEAR(gen->gi_modulename); +@@ -25045,7 +26182,7 @@ static void __Pyx_Coroutine_dealloc(PyObject *self) { + if (PyObject_CallFinalizerFromDealloc(self)) + #else + Py_TYPE(gen)->tp_del(self); +- if (self->ob_refcnt > 0) ++ if (Py_REFCNT(self) > 0) + #endif + { + return; +@@ -25072,7 +26209,7 @@ static void __Pyx_Coroutine_del(PyObject *self) { + } + #if !CYTHON_USE_TP_FINALIZE + assert(self->ob_refcnt == 0); +- self->ob_refcnt = 1; ++ __Pyx_SET_REFCNT(self, 1); + #endif + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&error_type, &error_value, &error_traceback); +@@ -25139,17 +26276,17 @@ static void __Pyx_Coroutine_del(PyObject *self) { + } + __Pyx_ErrRestore(error_type, error_value, error_traceback); + #if !CYTHON_USE_TP_FINALIZE +- assert(self->ob_refcnt > 0); ++ assert(Py_REFCNT(self) > 0); + if (--self->ob_refcnt == 0) { + return; + } + { +- Py_ssize_t refcnt = self->ob_refcnt; ++ Py_ssize_t refcnt = Py_REFCNT(self); + _Py_NewReference(self); +- self->ob_refcnt = refcnt; ++ __Pyx_SET_REFCNT(self, refcnt); + } + #if CYTHON_COMPILING_IN_CPYTHON +- assert(PyType_IS_GC(self->ob_type) && ++ assert(PyType_IS_GC(Py_TYPE(self)) && + _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED); + _Py_DEC_REFTOTAL; + #endif +@@ -25215,6 +26352,27 @@ __Pyx_Coroutine_set_qualname(__pyx_CoroutineObject *self, PyObject *value, CYTHO + Py_XDECREF(tmp); + return 0; + } ++static PyObject * ++__Pyx_Coroutine_get_frame(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context) ++{ ++ PyObject *frame = self->gi_frame; ++ if (!frame) { ++ if (unlikely(!self->gi_code)) { ++ Py_RETURN_NONE; ++ } ++ frame = (PyObject *) PyFrame_New( ++ PyThreadState_Get(), /*PyThreadState *tstate,*/ ++ (PyCodeObject*) self->gi_code, /*PyCodeObject *code,*/ ++ __pyx_d, /*PyObject *globals,*/ ++ 0 /*PyObject *locals*/ ++ ); ++ if (unlikely(!frame)) ++ return NULL; ++ self->gi_frame = frame; ++ } ++ Py_INCREF(frame); ++ return frame; ++} + static __pyx_CoroutineObject *__Pyx__Coroutine_New( + PyTypeObject* type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, + PyObject *name, PyObject *qualname, PyObject *module_name) { +@@ -25248,6 +26406,7 @@ static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit( + gen->gi_modulename = module_name; + Py_XINCREF(code); + gen->gi_code = code; ++ gen->gi_frame = NULL; + PyObject_GC_Track(gen); + return gen; + } +@@ -25371,6 +26530,8 @@ static PyGetSetDef __pyx_Generator_getsets[] = { + (char*) PyDoc_STR("name of the generator"), 0}, + {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname, + (char*) PyDoc_STR("qualified name of the generator"), 0}, ++ {(char *) "gi_frame", (getter)__Pyx_Coroutine_get_frame, NULL, ++ (char*) PyDoc_STR("Frame of the generator"), 0}, + {0, 0, 0, 0, 0} + }; + static PyTypeObject __pyx_GeneratorType_type = { +@@ -25430,6 +26591,15 @@ static PyTypeObject __pyx_GeneratorType_type = { + #elif PY_VERSION_HEX >= 0x030400a1 + 0, + #endif ++#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, ++#endif ++#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, ++#endif ++#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, ++#endif + }; + static int __pyx_Generator_init(void) { + __pyx_GeneratorType_type.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; +@@ -25443,11 +26613,33 @@ static int __pyx_Generator_init(void) { + + /* 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 ctversion[5]; ++ int same=1, i, found_dot; ++ const char* rt_from_call = Py_GetVersion(); ++ PyOS_snprintf(ctversion, 5, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); ++ found_dot = 0; ++ for (i = 0; i < 4; i++) { ++ if (!ctversion[i]) { ++ same = (rt_from_call[i] < '0' || rt_from_call[i] > '9'); ++ break; ++ } ++ if (rt_from_call[i] != ctversion[i]) { ++ same = 0; ++ break; ++ } ++ } ++ if (!same) { ++ char rtversion[5] = {'\0'}; + char message[200]; ++ for (i=0; i<4; ++i) { ++ if (rt_from_call[i] == '.') { ++ if (found_dot) break; ++ found_dot = 1; ++ } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') { ++ break; ++ } ++ rtversion[i] = rt_from_call[i]; ++ } + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", +@@ -25759,6 +26951,23 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_DECREF(x); + return ival; + } ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { ++ if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { ++ return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); ++#if PY_MAJOR_VERSION < 3 ++ } else if (likely(PyInt_CheckExact(o))) { ++ return PyInt_AS_LONG(o); ++#endif ++ } else { ++ Py_ssize_t ival; ++ PyObject *x; ++ x = PyNumber_Index(o); ++ if (!x) return -1; ++ ival = PyInt_AsLong(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); + } +diff --git a/khmer/_oxli/hashing.cpp b/khmer/_oxli/hashing.cpp +index 174186b0..861741a5 100644 +--- a/khmer/_oxli/hashing.cpp ++++ b/khmer/_oxli/hashing.cpp +@@ -1,14 +1,16 @@ +-/* Generated by Cython 0.29.2 */ ++/* Generated by Cython 0.29.32 */ + ++#ifndef PY_SSIZE_T_CLEAN + #define PY_SSIZE_T_CLEAN ++#endif /* 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_2" +-#define CYTHON_HEX_VERSION 0x001D02F0 ++#define CYTHON_ABI "0_29_32" ++#define CYTHON_HEX_VERSION 0x001D20F0 + #define CYTHON_FUTURE_DIVISION 1 + #include + #ifndef offsetof +@@ -47,6 +49,7 @@ + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP +@@ -83,10 +86,14 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC (PYPY_VERSION_HEX >= 0x07030900) ++ #endif + #elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -124,10 +131,59 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 ++ #endif ++#elif defined(PY_NOGIL) ++ #define CYTHON_COMPILING_IN_PYPY 0 ++ #define CYTHON_COMPILING_IN_PYSTON 0 ++ #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 1 ++ #ifndef CYTHON_USE_TYPE_SLOTS ++ #define CYTHON_USE_TYPE_SLOTS 1 ++ #endif ++ #undef CYTHON_USE_PYTYPE_LOOKUP ++ #define CYTHON_USE_PYTYPE_LOOKUP 0 ++ #ifndef CYTHON_USE_ASYNC_SLOTS ++ #define CYTHON_USE_ASYNC_SLOTS 1 ++ #endif ++ #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 ++ #ifndef CYTHON_PEP489_MULTI_PHASE_INIT ++ #define CYTHON_PEP489_MULTI_PHASE_INIT 1 ++ #endif ++ #ifndef CYTHON_USE_TP_FINALIZE ++ #define CYTHON_USE_TP_FINALIZE 1 ++ #endif ++ #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 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -155,7 +211,7 @@ + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif +- #if PY_VERSION_HEX < 0x030300F0 ++ #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) +@@ -170,11 +226,14 @@ + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif +- #ifndef CYTHON_FAST_THREAD_STATE ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_FAST_THREAD_STATE ++ #define CYTHON_FAST_THREAD_STATE 0 ++ #elif !defined(CYTHON_FAST_THREAD_STATE) + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL +- #define CYTHON_FAST_PYCALL 1 ++ #define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030A0000) + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) +@@ -185,15 +244,23 @@ + #ifndef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) + #endif +- #ifndef CYTHON_USE_EXC_INFO_STACK ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_USE_EXC_INFO_STACK ++ #define CYTHON_USE_EXC_INFO_STACK 0 ++ #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) + #endif ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 ++ #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" ++ #if PY_MAJOR_VERSION < 3 ++ #include "longintrepr.h" ++ #endif + #undef SHIFT + #undef BASE + #undef MASK +@@ -324,8 +391,72 @@ class __Pyx_FakeReference { + #define __Pyx_DefaultClassType PyClass_Type + #else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" ++ #define __Pyx_DefaultClassType PyType_Type ++#if PY_VERSION_HEX >= 0x030B00A1 ++ static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int k, int l, int s, int f, ++ PyObject *code, PyObject *c, PyObject* n, PyObject *v, ++ PyObject *fv, PyObject *cell, PyObject* fn, ++ PyObject *name, int fline, PyObject *lnos) { ++ PyObject *kwds=NULL, *argcount=NULL, *posonlyargcount=NULL, *kwonlyargcount=NULL; ++ PyObject *nlocals=NULL, *stacksize=NULL, *flags=NULL, *replace=NULL, *call_result=NULL, *empty=NULL; ++ const char *fn_cstr=NULL; ++ const char *name_cstr=NULL; ++ PyCodeObject* co=NULL; ++ PyObject *type, *value, *traceback; ++ PyErr_Fetch(&type, &value, &traceback); ++ if (!(kwds=PyDict_New())) goto end; ++ if (!(argcount=PyLong_FromLong(a))) goto end; ++ if (PyDict_SetItemString(kwds, "co_argcount", argcount) != 0) goto end; ++ if (!(posonlyargcount=PyLong_FromLong(0))) goto end; ++ if (PyDict_SetItemString(kwds, "co_posonlyargcount", posonlyargcount) != 0) goto end; ++ if (!(kwonlyargcount=PyLong_FromLong(k))) goto end; ++ if (PyDict_SetItemString(kwds, "co_kwonlyargcount", kwonlyargcount) != 0) goto end; ++ if (!(nlocals=PyLong_FromLong(l))) goto end; ++ if (PyDict_SetItemString(kwds, "co_nlocals", nlocals) != 0) goto end; ++ if (!(stacksize=PyLong_FromLong(s))) goto end; ++ if (PyDict_SetItemString(kwds, "co_stacksize", stacksize) != 0) goto end; ++ if (!(flags=PyLong_FromLong(f))) goto end; ++ if (PyDict_SetItemString(kwds, "co_flags", flags) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_code", code) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_consts", c) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_names", n) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_varnames", v) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_freevars", fv) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_cellvars", cell) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_linetable", lnos) != 0) goto end; ++ if (!(fn_cstr=PyUnicode_AsUTF8AndSize(fn, NULL))) goto end; ++ if (!(name_cstr=PyUnicode_AsUTF8AndSize(name, NULL))) goto end; ++ if (!(co = PyCode_NewEmpty(fn_cstr, name_cstr, fline))) goto end; ++ if (!(replace = PyObject_GetAttrString((PyObject*)co, "replace"))) goto cleanup_code_too; ++ if (!(empty = PyTuple_New(0))) goto cleanup_code_too; // unfortunately __pyx_empty_tuple isn't available here ++ if (!(call_result = PyObject_Call(replace, empty, kwds))) goto cleanup_code_too; ++ Py_XDECREF((PyObject*)co); ++ co = (PyCodeObject*)call_result; ++ call_result = NULL; ++ if (0) { ++ cleanup_code_too: ++ Py_XDECREF((PyObject*)co); ++ co = NULL; ++ } ++ end: ++ Py_XDECREF(kwds); ++ Py_XDECREF(argcount); ++ Py_XDECREF(posonlyargcount); ++ Py_XDECREF(kwonlyargcount); ++ Py_XDECREF(nlocals); ++ Py_XDECREF(stacksize); ++ Py_XDECREF(replace); ++ Py_XDECREF(call_result); ++ Py_XDECREF(empty); ++ if (type) { ++ PyErr_Restore(type, value, traceback); ++ } ++ return co; ++ } ++#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 +@@ -360,26 +491,6 @@ class __Pyx_FakeReference { + #else + #define __Pyx_PyFastCFunction_Check(func) 0 + #endif +-#if CYTHON_USE_DICT_VERSIONS +-#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);\ +- }\ +- } +-#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 + #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) +@@ -412,7 +523,7 @@ class __Pyx_FakeReference { + typedef int Py_tss_t; + static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); +- return 0; // PyThread_create_key reports success always ++ 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)); +@@ -435,7 +546,7 @@ static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); + } +-#endif // TSS (Thread Specific Storage) API ++#endif + #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) + #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) + #else +@@ -455,8 +566,12 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #endif + #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 ++ #if defined(PyUnicode_IS_READY) + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) ++ #else ++ #define __Pyx_PyUnicode_READY(op) (0) ++ #endif + #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) +@@ -464,7 +579,15 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) ++ #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) ++ #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) ++ #endif ++ #else ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) ++ #endif + #else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 +@@ -513,8 +636,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) +@@ -525,6 +650,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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 +@@ -558,13 +690,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong +- #define __Pyx_PyInt_AsHash_t PyInt_AsLong ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t + #else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t +- #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t + #endif + #if PY_MAJOR_VERSION >= 3 +- #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func)) ++ #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 +@@ -586,8 +718,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + } __Pyx_PyAsyncMethodsStruct; + #endif + +-#if defined(WIN32) || defined(MS_WINDOWS) +- #define _USE_MATH_DEFINES ++#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) ++ #if !defined(_USE_MATH_DEFINES) ++ #define _USE_MATH_DEFINES ++ #endif + #endif + #include + #ifdef NAN +@@ -605,11 +739,10 @@ static CYTHON_INLINE float __PYX_NAN() { + #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_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ +-} ++ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + + #ifndef __PYX_EXTERN_C + #ifdef __cplusplus +@@ -629,6 +762,18 @@ static CYTHON_INLINE float __PYX_NAN() { + #include + #include + #include ++ ++ #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600) ++ // move should be defined for these versions of MSVC, but __cplusplus isn't set usefully ++ #include ++ ++ namespace cython_std { ++ template typename std::remove_reference::type&& move(T& t) noexcept { return std::move(t); } ++ template typename std::remove_reference::type&& move(T&& t) noexcept { return std::move(t); } ++ } ++ ++ #endif ++ + #include + #include + #include +@@ -649,7 +794,8 @@ typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* enc + 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_DEFAULT 0 ++#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 1 ++#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) + #define __PYX_DEFAULT_STRING_ENCODING "utf8" + #define __Pyx_PyObject_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyObject_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +@@ -732,6 +878,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); + (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); ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); + #if CYTHON_ASSUME_SAFE_MACROS + #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) + #else +@@ -977,7 +1124,7 @@ static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *nam + #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, int nargs, PyObject *kwargs); ++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 +@@ -986,13 +1133,21 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + #ifndef Py_MEMBER_SIZE + #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) + #endif ++#if CYTHON_FAST_PYCALL + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + #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 // CYTHON_FAST_PYCALL + #endif + + /* PyObjectCall.proto */ +@@ -1070,9 +1225,6 @@ static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_nam + /* SetVTable.proto */ + static int __Pyx_SetVtable(PyObject *dict, void *vtable); + +-/* SetupReduce.proto */ +-static int __Pyx_setup_reduce(PyObject* type_obj); +- + /* PyErrExceptionMatches.proto */ + #if CYTHON_FAST_THREAD_STATE + #define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +@@ -1081,6 +1233,38 @@ static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tsta + #define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) + #endif + ++/* PyObjectGetAttrStrNoError.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); ++ ++/* SetupReduce.proto */ ++static int __Pyx_setup_reduce(PyObject* type_obj); ++ ++/* 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) {\ +@@ -1145,8 +1329,10 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + /* None.proto */ + #include + +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_HashIntoType(oxli::HashIntoType value); ++/* GCCDiagnostics.proto */ ++#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) ++#define __Pyx_HAS_GCC_DIAGNOSTIC ++#endif + + /* CIntFromPy.proto */ + static CYTHON_INLINE oxli::HashIntoType __Pyx_PyInt_As_oxli_3a__3a_HashIntoType(PyObject *); +@@ -1154,6 +1340,9 @@ static CYTHON_INLINE oxli::HashIntoType __Pyx_PyInt_As_oxli_3a__3a_HashIntoType( + /* CIntFromPy.proto */ + static CYTHON_INLINE oxli::WordLength __Pyx_PyInt_As_oxli_3a__3a_WordLength(PyObject *); + ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_HashIntoType(oxli::HashIntoType value); ++ + /* CIntToPy.proto */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +@@ -1298,6 +1487,9 @@ static PyObject *__pyx_codeobj__4; + static int __pyx_pw_5khmer_5_oxli_7hashing_4Kmer_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ + static int __pyx_pw_5khmer_5_oxli_7hashing_4Kmer_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_kmer = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -1363,6 +1555,9 @@ static int __pyx_pf_5khmer_5_oxli_7hashing_4Kmer___cinit__(struct __pyx_obj_5khm + PyObject *__pyx_t_3 = NULL; + std::string __pyx_t_4; + Py_ssize_t __pyx_t_5; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "khmer/_oxli/hashing.pyx":13 +@@ -1479,6 +1674,9 @@ static Py_ssize_t __pyx_pf_5khmer_5_oxli_7hashing_4Kmer_2__len__(struct __pyx_ob + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__len__", 0); + + /* "khmer/_oxli/hashing.pyx":20 +@@ -1596,6 +1794,9 @@ static Py_hash_t __pyx_pf_5khmer_5_oxli_7hashing_4Kmer_6__hash__(struct __pyx_ob + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_hash_t __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__hash__", 0); + + /* "khmer/_oxli/hashing.pyx":26 +@@ -1709,6 +1910,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashing_4Kmer_6kmer_f___get__(struct __ + 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("__get__", 0); + + /* "khmer/_oxli/hashing.pyx":33 +@@ -1769,6 +1973,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashing_4Kmer_6kmer_r___get__(struct __ + 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("__get__", 0); + + /* "khmer/_oxli/hashing.pyx":37 +@@ -1829,6 +2036,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashing_4Kmer_6kmer_u___get__(struct __ + 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("__get__", 0); + + /* "khmer/_oxli/hashing.pyx":41 +@@ -1893,6 +2103,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashing_4Kmer_10reverse_complement(stru + oxli::HashIntoType __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + std::string __pyx_t_3; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("reverse_complement", 0); + + /* "khmer/_oxli/hashing.pyx":44 +@@ -1993,6 +2206,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashing_4Kmer_10is_forward___get__(stru + 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("__get__", 0); + + /* "khmer/_oxli/hashing.pyx":51 +@@ -2042,6 +2258,9 @@ static struct __pyx_obj_5khmer_5_oxli_7hashing_Kmer *__pyx_f_5khmer_5_oxli_7hash + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + oxli::HashIntoType __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("wrap", 0); + + /* "khmer/_oxli/hashing.pyx":55 +@@ -2131,6 +2350,9 @@ static PyMethodDef __pyx_mdef_5khmer_5_oxli_7hashing_4Kmer_13create = {"create", + static PyObject *__pyx_pw_5khmer_5_oxli_7hashing_4Kmer_13create(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + oxli::HashIntoType __pyx_v_tag; + oxli::WordLength __pyx_v_K; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("create (wrapper)", 0); +@@ -2193,6 +2415,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashing_4Kmer_12create(oxli::HashIntoTy + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + oxli::HashIntoType __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("create", 0); + + /* "khmer/_oxli/hashing.pyx":62 +@@ -2325,6 +2550,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashing_4Kmer_14__reduce_cython__(CYTHO + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -2380,6 +2608,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashing_4Kmer_16__setstate_cython__(CYT + 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)":4 +@@ -2414,7 +2645,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashing_4Kmer_16__setstate_cython__(CYT + * + * @cname("__pyx_convert_string_from_py_std__in_string") + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: # <<<<<<<<<<<<<< +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + */ + +@@ -2424,11 +2655,23 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + std::string __pyx_r; + __Pyx_RefNannyDeclarations + char const *__pyx_t_1; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_string_from_py_std__in_string", 0); + ++ /* "string.from_py":14 ++ * @cname("__pyx_convert_string_from_py_std__in_string") ++ * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: ++ * cdef Py_ssize_t length = 0 # <<<<<<<<<<<<<< ++ * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) ++ * return string(data, length) ++ */ ++ __pyx_v_length = 0; ++ + /* "string.from_py":15 + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) # <<<<<<<<<<<<<< + * return string(data, length) + * +@@ -2437,7 +2680,7 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + __pyx_v_data = __pyx_t_1; + + /* "string.from_py":16 +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + * return string(data, length) # <<<<<<<<<<<<<< + * +@@ -2450,7 +2693,7 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + * + * @cname("__pyx_convert_string_from_py_std__in_string") + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: # <<<<<<<<<<<<<< +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + */ + +@@ -2475,6 +2718,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyObject_string_to_py_std__in_strin + 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("__pyx_convert_PyObject_string_to_py_std__in_string", 0); + + /* "string.to_py":32 +@@ -2522,6 +2768,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyUnicode_string_to_py_std__in_stri + 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("__pyx_convert_PyUnicode_string_to_py_std__in_string", 0); + + /* "string.to_py":38 +@@ -2569,6 +2818,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyStr_string_to_py_std__in_string(s + 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("__pyx_convert_PyStr_string_to_py_std__in_string", 0); + + /* "string.to_py":44 +@@ -2616,6 +2868,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyBytes_string_to_py_std__in_string + 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("__pyx_convert_PyBytes_string_to_py_std__in_string", 0); + + /* "string.to_py":50 +@@ -2663,6 +2918,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyByteArray_string_to_py_std__in_st + 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("__pyx_convert_PyByteArray_string_to_py_std__in_string", 0); + + /* "string.to_py":56 +@@ -2792,7 +3050,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7hashing_Kmer = { + sizeof(struct __pyx_obj_5khmer_5_oxli_7hashing_Kmer), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_7hashing_Kmer, /*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 +@@ -2842,6 +3105,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7hashing_Kmer = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static PyMethodDef __pyx_methods[] = { +@@ -3004,12 +3276,17 @@ static int __Pyx_modinit_function_export_code(void) { + + 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_5khmer_5_oxli_7hashing_Kmer = &__pyx_vtable_5khmer_5_oxli_7hashing_Kmer; + __pyx_vtable_5khmer_5_oxli_7hashing_Kmer.wrap = (struct __pyx_obj_5khmer_5_oxli_7hashing_Kmer *(*)(oxli::Kmer *, oxli::WordLength))__pyx_f_5khmer_5_oxli_7hashing_4Kmer_wrap; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_7hashing_Kmer) < 0) __PYX_ERR(0, 10, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_7hashing_Kmer.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_7hashing_Kmer.tp_dictoffset && __pyx_type_5khmer_5_oxli_7hashing_Kmer.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_7hashing_Kmer.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -3049,17 +3326,19 @@ static int __Pyx_modinit_function_import_code(void) { + } + + +-#if PY_MAJOR_VERSION < 3 +-#ifdef CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC void +-#else ++#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 CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC PyObject * ++#ifdef __cplusplus ++#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * + #else +-#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC ++#define __Pyx_PyMODINIT_FUNC PyObject * + #endif + #endif + +@@ -3142,6 +3421,9 @@ static CYTHON_SMALL_CODE int __pyx_pymod_exec_hashing(PyObject *__pyx_pyinit_mod + { + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { +@@ -3189,11 +3471,9 @@ if (!__Pyx_RefNanny) { + #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? */ ++ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif +- #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; +@@ -3209,10 +3489,9 @@ if (!__Pyx_RefNanny) { + __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) +- __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) +- #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); +- #endif ++ __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) +@@ -3238,7 +3517,7 @@ if (!__Pyx_RefNanny) { + (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)) goto __pyx_L1_error; ++ if (unlikely(__Pyx_modinit_type_init_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + (void)__Pyx_modinit_type_import_code(); + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); +@@ -3401,7 +3680,7 @@ static int __Pyx_ParseOptionalKeywords( + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 +- if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { ++ if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { +@@ -3428,7 +3707,7 @@ static int __Pyx_ParseOptionalKeywords( + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -3444,7 +3723,7 @@ static int __Pyx_ParseOptionalKeywords( + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -3559,7 +3838,7 @@ static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args + return result; + } + #if 1 || PY_VERSION_HEX < 0x030600B1 +-static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs) { ++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); +@@ -3630,12 +3909,12 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + } + #if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); + #else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); + #endif +@@ -3651,7 +3930,7 @@ done: + #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; ++ ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) +@@ -3960,6 +4239,53 @@ bad: + return -1; + } + ++/* 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; icurexc_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 ++ ++/* 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; +@@ -3980,53 +4306,81 @@ static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; ++ PyObject *object_getstate = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; ++ PyObject *getstate = NULL; ++#if CYTHON_USE_PYTYPE_LOOKUP ++ getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); ++#else ++ getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); ++ if (!getstate && PyErr_Occurred()) { ++ goto __PYX_BAD; ++ } ++#endif ++ if (getstate) { + #if CYTHON_USE_PYTYPE_LOOKUP +- if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto GOOD; ++ object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); + #else +- if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto GOOD; ++ object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); ++ if (!object_getstate && PyErr_Occurred()) { ++ goto __PYX_BAD; ++ } + #endif ++ if (object_getstate != getstate) { ++ goto __PYX_GOOD; ++ } ++ } + #if CYTHON_USE_PYTYPE_LOOKUP +- object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; ++ 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 BAD; ++ 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 BAD; ++ 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 BAD; ++ 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 BAD; ++ 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 BAD; ++ 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_GetAttrStr(type_obj, __pyx_n_s_reduce_cython); if (unlikely(!reduce_cython)) goto BAD; +- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto BAD; +- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto BAD; ++ 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_GetAttrStr(type_obj, __pyx_n_s_setstate_cython); if (unlikely(!setstate_cython)) goto BAD; +- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto BAD; +- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto BAD; ++ 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 GOOD; +-BAD: ++ 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; +-GOOD: ++__PYX_GOOD: + #if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); ++ Py_XDECREF(object_getstate); ++ Py_XDECREF(getstate); + #endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); +@@ -4036,28 +4390,29 @@ GOOD: + return ret; + } + +-/* 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; itp_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 +- for (i=0; icurexc_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); ++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 + +@@ -4161,7 +4516,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec + 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) { ++ } else if (__Pyx_PyFastCFunction_Check(func)) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); + #endif + } +@@ -4181,7 +4536,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec + + /* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +-static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { ++static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; + #if CYTHON_COMPILING_IN_CPYTHON +@@ -4211,7 +4566,7 @@ static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + } + if (!use_cline) { + c_line = 0; +- PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); ++ (void) 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; +@@ -4285,7 +4640,7 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + 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)); ++ __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } +@@ -4305,33 +4660,40 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + #include "compile.h" + #include "frameobject.h" + #include "traceback.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + 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; ++ PyCodeObject *py_code = NULL; ++ PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 ++ PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); +- #else +- py_srcfile = PyUnicode_FromString(filename); +- #endif + if (!py_srcfile) goto bad; ++ #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; ++ funcname = PyUnicode_AsUTF8(py_funcname); ++ if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); +- #else +- py_funcname = PyUnicode_FromString(funcname); ++ if (!py_funcname) goto bad; + #endif + } +- if (!py_funcname) goto bad; ++ #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, +@@ -4350,11 +4712,16 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); +- Py_DECREF(py_funcname); ++ #else ++ py_code = PyCode_NewEmpty(filename, funcname, py_line); ++ #endif ++ Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline + return py_code; + bad: +- Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); ++ #if PY_MAJOR_VERSION < 3 ++ Py_XDECREF(py_srcfile); ++ #endif + return NULL; + } + static void __Pyx_AddTraceback(const char *funcname, int c_line, +@@ -4362,14 +4729,24 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; ++ PyObject *ptype, *pvalue, *ptraceback; + 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) { ++ __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); +- if (!py_code) goto bad; ++ if (!py_code) { ++ /* If the code object creation fails, then we should clear the ++ fetched exception references and propagate the new exception */ ++ Py_XDECREF(ptype); ++ Py_XDECREF(pvalue); ++ Py_XDECREF(ptraceback); ++ goto bad; ++ } ++ __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( +@@ -4408,40 +4785,16 @@ bad: + return (target_type) value;\ + } + +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_HashIntoType(oxli::HashIntoType value) { +- const oxli::HashIntoType neg_one = (oxli::HashIntoType) ((oxli::HashIntoType) 0 - (oxli::HashIntoType) 1), const_zero = (oxli::HashIntoType) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(oxli::HashIntoType) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(oxli::HashIntoType) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::HashIntoType) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif +- } +- } else { +- if (sizeof(oxli::HashIntoType) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::HashIntoType) <= 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(oxli::HashIntoType), +- little, !is_unsigned); +- } +-} +- + /* CIntFromPy */ + static CYTHON_INLINE oxli::HashIntoType __Pyx_PyInt_As_oxli_3a__3a_HashIntoType(PyObject *x) { +- const oxli::HashIntoType neg_one = (oxli::HashIntoType) ((oxli::HashIntoType) 0 - (oxli::HashIntoType) 1), const_zero = (oxli::HashIntoType) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::HashIntoType neg_one = (oxli::HashIntoType) -1, const_zero = (oxli::HashIntoType) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -4630,7 +4983,14 @@ raise_neg_overflow: + + /* CIntFromPy */ + static CYTHON_INLINE oxli::WordLength __Pyx_PyInt_As_oxli_3a__3a_WordLength(PyObject *x) { +- const oxli::WordLength neg_one = (oxli::WordLength) ((oxli::WordLength) 0 - (oxli::WordLength) 1), const_zero = (oxli::WordLength) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::WordLength neg_one = (oxli::WordLength) -1, const_zero = (oxli::WordLength) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -4817,9 +5177,54 @@ raise_neg_overflow: + return (oxli::WordLength) -1; + } + ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_HashIntoType(oxli::HashIntoType value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::HashIntoType neg_one = (oxli::HashIntoType) -1, const_zero = (oxli::HashIntoType) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(oxli::HashIntoType) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(oxli::HashIntoType) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::HashIntoType) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(oxli::HashIntoType) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::HashIntoType) <= 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(oxli::HashIntoType), ++ 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; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { +@@ -4850,7 +5255,14 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + + /* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -5039,7 +5451,14 @@ raise_neg_overflow: + + /* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +- const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const int neg_one = (int) -1, const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -5328,11 +5747,33 @@ static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObj + + /* 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 ctversion[5]; ++ int same=1, i, found_dot; ++ const char* rt_from_call = Py_GetVersion(); ++ PyOS_snprintf(ctversion, 5, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); ++ found_dot = 0; ++ for (i = 0; i < 4; i++) { ++ if (!ctversion[i]) { ++ same = (rt_from_call[i] < '0' || rt_from_call[i] > '9'); ++ break; ++ } ++ if (rt_from_call[i] != ctversion[i]) { ++ same = 0; ++ break; ++ } ++ } ++ if (!same) { ++ char rtversion[5] = {'\0'}; + char message[200]; ++ for (i=0; i<4; ++i) { ++ if (rt_from_call[i] == '.') { ++ if (found_dot) break; ++ found_dot = 1; ++ } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') { ++ break; ++ } ++ rtversion[i] = rt_from_call[i]; ++ } + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", +@@ -5590,6 +6031,23 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_DECREF(x); + return ival; + } ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { ++ if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { ++ return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); ++#if PY_MAJOR_VERSION < 3 ++ } else if (likely(PyInt_CheckExact(o))) { ++ return PyInt_AS_LONG(o); ++#endif ++ } else { ++ Py_ssize_t ival; ++ PyObject *x; ++ x = PyNumber_Index(o); ++ if (!x) return -1; ++ ival = PyInt_AsLong(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); + } +diff --git a/khmer/_oxli/hashset.cpp b/khmer/_oxli/hashset.cpp +index b362b4b1..350d0963 100644 +--- a/khmer/_oxli/hashset.cpp ++++ b/khmer/_oxli/hashset.cpp +@@ -1,15 +1,17 @@ +-/* Generated by Cython 0.29.2 */ ++/* Generated by Cython 0.29.32 */ + ++#ifndef PY_SSIZE_T_CLEAN + #define PY_SSIZE_T_CLEAN ++#endif /* 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_2" +-#define CYTHON_HEX_VERSION 0x001D02F0 +-#define CYTHON_FUTURE_DIVISION 1 ++#define CYTHON_ABI "0_29_32" ++#define CYTHON_HEX_VERSION 0x001D20F0 ++#define CYTHON_FUTURE_DIVISION 0 + #include + #ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +@@ -47,6 +49,7 @@ + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP +@@ -83,10 +86,14 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC (PYPY_VERSION_HEX >= 0x07030900) ++ #endif + #elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -124,10 +131,59 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 ++ #endif ++#elif defined(PY_NOGIL) ++ #define CYTHON_COMPILING_IN_PYPY 0 ++ #define CYTHON_COMPILING_IN_PYSTON 0 ++ #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 1 ++ #ifndef CYTHON_USE_TYPE_SLOTS ++ #define CYTHON_USE_TYPE_SLOTS 1 ++ #endif ++ #undef CYTHON_USE_PYTYPE_LOOKUP ++ #define CYTHON_USE_PYTYPE_LOOKUP 0 ++ #ifndef CYTHON_USE_ASYNC_SLOTS ++ #define CYTHON_USE_ASYNC_SLOTS 1 ++ #endif ++ #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 ++ #ifndef CYTHON_PEP489_MULTI_PHASE_INIT ++ #define CYTHON_PEP489_MULTI_PHASE_INIT 1 ++ #endif ++ #ifndef CYTHON_USE_TP_FINALIZE ++ #define CYTHON_USE_TP_FINALIZE 1 ++ #endif ++ #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 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -155,7 +211,7 @@ + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif +- #if PY_VERSION_HEX < 0x030300F0 ++ #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) +@@ -170,11 +226,14 @@ + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif +- #ifndef CYTHON_FAST_THREAD_STATE ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_FAST_THREAD_STATE ++ #define CYTHON_FAST_THREAD_STATE 0 ++ #elif !defined(CYTHON_FAST_THREAD_STATE) + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL +- #define CYTHON_FAST_PYCALL 1 ++ #define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030A0000) + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) +@@ -185,15 +244,23 @@ + #ifndef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) + #endif +- #ifndef CYTHON_USE_EXC_INFO_STACK ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_USE_EXC_INFO_STACK ++ #define CYTHON_USE_EXC_INFO_STACK 0 ++ #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) + #endif ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 ++ #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" ++ #if PY_MAJOR_VERSION < 3 ++ #include "longintrepr.h" ++ #endif + #undef SHIFT + #undef BASE + #undef MASK +@@ -324,8 +391,72 @@ class __Pyx_FakeReference { + #define __Pyx_DefaultClassType PyClass_Type + #else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" ++ #define __Pyx_DefaultClassType PyType_Type ++#if PY_VERSION_HEX >= 0x030B00A1 ++ static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int k, int l, int s, int f, ++ PyObject *code, PyObject *c, PyObject* n, PyObject *v, ++ PyObject *fv, PyObject *cell, PyObject* fn, ++ PyObject *name, int fline, PyObject *lnos) { ++ PyObject *kwds=NULL, *argcount=NULL, *posonlyargcount=NULL, *kwonlyargcount=NULL; ++ PyObject *nlocals=NULL, *stacksize=NULL, *flags=NULL, *replace=NULL, *call_result=NULL, *empty=NULL; ++ const char *fn_cstr=NULL; ++ const char *name_cstr=NULL; ++ PyCodeObject* co=NULL; ++ PyObject *type, *value, *traceback; ++ PyErr_Fetch(&type, &value, &traceback); ++ if (!(kwds=PyDict_New())) goto end; ++ if (!(argcount=PyLong_FromLong(a))) goto end; ++ if (PyDict_SetItemString(kwds, "co_argcount", argcount) != 0) goto end; ++ if (!(posonlyargcount=PyLong_FromLong(0))) goto end; ++ if (PyDict_SetItemString(kwds, "co_posonlyargcount", posonlyargcount) != 0) goto end; ++ if (!(kwonlyargcount=PyLong_FromLong(k))) goto end; ++ if (PyDict_SetItemString(kwds, "co_kwonlyargcount", kwonlyargcount) != 0) goto end; ++ if (!(nlocals=PyLong_FromLong(l))) goto end; ++ if (PyDict_SetItemString(kwds, "co_nlocals", nlocals) != 0) goto end; ++ if (!(stacksize=PyLong_FromLong(s))) goto end; ++ if (PyDict_SetItemString(kwds, "co_stacksize", stacksize) != 0) goto end; ++ if (!(flags=PyLong_FromLong(f))) goto end; ++ if (PyDict_SetItemString(kwds, "co_flags", flags) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_code", code) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_consts", c) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_names", n) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_varnames", v) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_freevars", fv) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_cellvars", cell) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_linetable", lnos) != 0) goto end; ++ if (!(fn_cstr=PyUnicode_AsUTF8AndSize(fn, NULL))) goto end; ++ if (!(name_cstr=PyUnicode_AsUTF8AndSize(name, NULL))) goto end; ++ if (!(co = PyCode_NewEmpty(fn_cstr, name_cstr, fline))) goto end; ++ if (!(replace = PyObject_GetAttrString((PyObject*)co, "replace"))) goto cleanup_code_too; ++ if (!(empty = PyTuple_New(0))) goto cleanup_code_too; // unfortunately __pyx_empty_tuple isn't available here ++ if (!(call_result = PyObject_Call(replace, empty, kwds))) goto cleanup_code_too; ++ Py_XDECREF((PyObject*)co); ++ co = (PyCodeObject*)call_result; ++ call_result = NULL; ++ if (0) { ++ cleanup_code_too: ++ Py_XDECREF((PyObject*)co); ++ co = NULL; ++ } ++ end: ++ Py_XDECREF(kwds); ++ Py_XDECREF(argcount); ++ Py_XDECREF(posonlyargcount); ++ Py_XDECREF(kwonlyargcount); ++ Py_XDECREF(nlocals); ++ Py_XDECREF(stacksize); ++ Py_XDECREF(replace); ++ Py_XDECREF(call_result); ++ Py_XDECREF(empty); ++ if (type) { ++ PyErr_Restore(type, value, traceback); ++ } ++ return co; ++ } ++#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 +@@ -360,26 +491,6 @@ class __Pyx_FakeReference { + #else + #define __Pyx_PyFastCFunction_Check(func) 0 + #endif +-#if CYTHON_USE_DICT_VERSIONS +-#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);\ +- }\ +- } +-#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 + #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) +@@ -412,7 +523,7 @@ class __Pyx_FakeReference { + typedef int Py_tss_t; + static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); +- return 0; // PyThread_create_key reports success always ++ 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)); +@@ -435,7 +546,7 @@ static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); + } +-#endif // TSS (Thread Specific Storage) API ++#endif + #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) + #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) + #else +@@ -455,8 +566,12 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #endif + #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 ++ #if defined(PyUnicode_IS_READY) + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) ++ #else ++ #define __Pyx_PyUnicode_READY(op) (0) ++ #endif + #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) +@@ -464,7 +579,15 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) ++ #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) ++ #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) ++ #endif ++ #else ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) ++ #endif + #else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 +@@ -513,8 +636,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) +@@ -525,6 +650,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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 +@@ -558,13 +690,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong +- #define __Pyx_PyInt_AsHash_t PyInt_AsLong ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t + #else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t +- #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t + #endif + #if PY_MAJOR_VERSION >= 3 +- #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func)) ++ #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 +@@ -586,8 +718,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + } __Pyx_PyAsyncMethodsStruct; + #endif + +-#if defined(WIN32) || defined(MS_WINDOWS) +- #define _USE_MATH_DEFINES ++#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) ++ #if !defined(_USE_MATH_DEFINES) ++ #define _USE_MATH_DEFINES ++ #endif + #endif + #include + #ifdef NAN +@@ -605,11 +739,10 @@ static CYTHON_INLINE float __PYX_NAN() { + #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_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ +-} ++ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + + #ifndef __PYX_EXTERN_C + #ifdef __cplusplus +@@ -627,6 +760,18 @@ static CYTHON_INLINE float __PYX_NAN() { + #include "stdexcept" + #include "typeinfo" + #include ++ ++ #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600) ++ // move should be defined for these versions of MSVC, but __cplusplus isn't set usefully ++ #include ++ ++ namespace cython_std { ++ template typename std::remove_reference::type&& move(T& t) noexcept { return std::move(t); } ++ template typename std::remove_reference::type&& move(T&& t) noexcept { return std::move(t); } ++ } ++ ++ #endif ++ + #include + #include + #include +@@ -652,10 +797,11 @@ typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* enc + 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_DEFAULT 0 +-#define __PYX_DEFAULT_STRING_ENCODING "utf8" +-#define __Pyx_PyObject_FromString __Pyx_PyUnicode_FromString +-#define __Pyx_PyObject_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize ++#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) (\ +@@ -735,6 +881,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); + (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); ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); + #if CYTHON_ASSUME_SAFE_MACROS + #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) + #else +@@ -1031,7 +1178,7 @@ static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObje + #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, int nargs, PyObject *kwargs); ++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 +@@ -1040,13 +1187,21 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + #ifndef Py_MEMBER_SIZE + #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) + #endif ++#if CYTHON_FAST_PYCALL + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + #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 // CYTHON_FAST_PYCALL + #endif + + /* PyObjectCall.proto */ +@@ -1067,6 +1222,32 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject + /* PyObjectCallOneArg.proto */ + static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + ++/* 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 ++ + /* PyThreadStateGet.proto */ + #if CYTHON_FAST_THREAD_STATE + #define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +@@ -1132,6 +1313,17 @@ static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_nam + /* SetVTable.proto */ + static int __Pyx_SetVtable(PyObject *dict, void *vtable); + ++/* 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 ++ ++/* PyObjectGetAttrStrNoError.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); ++ + /* SetupReduce.proto */ + static int __Pyx_setup_reduce(PyObject* type_obj); + +@@ -1178,6 +1370,11 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + /* None.proto */ + #include + ++/* GCCDiagnostics.proto */ ++#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) ++#define __Pyx_HAS_GCC_DIAGNOSTIC ++#endif ++ + /* CppExceptionConversion.proto */ + #ifndef __Pyx_CppExn2PyErr + #include +@@ -1220,18 +1417,18 @@ static void __Pyx_CppExn2PyErr() { + } + #endif + +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_HashIntoType(oxli::HashIntoType value); +- +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_WordLength(oxli::WordLength value); +- + /* CIntFromPy.proto */ + static CYTHON_INLINE oxli::HashIntoType __Pyx_PyInt_As_oxli_3a__3a_HashIntoType(PyObject *); + + /* CIntFromPy.proto */ + static CYTHON_INLINE oxli::WordLength __Pyx_PyInt_As_oxli_3a__3a_WordLength(PyObject *); + ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_HashIntoType(oxli::HashIntoType value); ++ ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_WordLength(oxli::WordLength value); ++ + /* CIntToPy.proto */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +@@ -1310,6 +1507,7 @@ typedef struct { + PyObject *gi_qualname; + PyObject *gi_modulename; + PyObject *gi_code; ++ PyObject *gi_frame; + int resume_label; + char is_running; + } __pyx_CoroutineObject; +@@ -1452,11 +1650,11 @@ static PyObject *__pyx_n_s_TypeError; + static PyObject *__pyx_n_s_ValueError; + static PyObject *__pyx_n_s_add; + static PyObject *__pyx_n_s_args; +-static PyObject *__pyx_kp_u_cannot_concatenate_HashSets_with; ++static PyObject *__pyx_kp_s_cannot_concatenate_HashSets_with; + static PyObject *__pyx_n_s_cline_in_traceback; + static PyObject *__pyx_n_s_close; + static PyObject *__pyx_n_s_getstate; +-static PyObject *__pyx_kp_u_hash_not_in_HashSet_cannot_remov; ++static PyObject *__pyx_kp_s_hash_not_in_HashSet_cannot_remov; + static PyObject *__pyx_n_s_hashes; + static PyObject *__pyx_n_s_iter; + static PyObject *__pyx_n_s_khmer__oxli_hashset; +@@ -1511,6 +1709,9 @@ static int __pyx_pw_5khmer_5_oxli_7hashset_7HashSet_1__cinit__(PyObject *__pyx_v + static int __pyx_pw_5khmer_5_oxli_7hashset_7HashSet_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_ksize = 0; + PyObject *__pyx_v_hashes = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -1579,6 +1780,9 @@ static int __pyx_pf_5khmer_5_oxli_7hashset_7HashSet___cinit__(struct __pyx_obj_5 + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "khmer/_oxli/hashset.pyx":9 +@@ -1668,7 +1872,6 @@ static int __pyx_pf_5khmer_5_oxli_7hashset_7HashSet___cinit__(struct __pyx_obj_5 + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_3update(PyObject *__pyx_v_self, PyObject *__pyx_v_hashes); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_7hashset_7HashSet_2update[] = "HashSet.update(self, hashes)"; + static PyObject *__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_3update(PyObject *__pyx_v_self, PyObject *__pyx_v_hashes) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -1689,6 +1892,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashset_7HashSet_2update(struct __pyx_o + PyObject *(*__pyx_t_3)(PyObject *); + PyObject *__pyx_t_4 = NULL; + oxli::HashIntoType __pyx_t_5; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("update", 0); + + /* "khmer/_oxli/hashset.pyx":14 +@@ -1805,16 +2011,18 @@ static PyObject *__pyx_f_5khmer_5_oxli_7hashset_7HashSet_add(struct __pyx_obj_5k + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("add", 0); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overridden in Python */ + else if (unlikely((Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0) || (Py_TYPE(((PyObject *)__pyx_v_self))->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) { +- #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP +- static PY_UINT64_T tp_dict_version = 0, obj_dict_version = 0; +- if (likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict && tp_dict_version == __PYX_GET_DICT_VERSION(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) && (!Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset || obj_dict_version == __PYX_GET_DICT_VERSION(_PyObject_GetDictPtr(((PyObject *)__pyx_v_self)))))); +- else { +- PY_UINT64_T type_dict_guard = (likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict)) ? __PYX_GET_DICT_VERSION(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) : 0; ++ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS ++ static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; ++ if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) { ++ PY_UINT64_T __pyx_type_dict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); + #endif + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_add); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); +@@ -1844,15 +2052,15 @@ static PyObject *__pyx_f_5khmer_5_oxli_7hashset_7HashSet_add(struct __pyx_obj_5k + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } +- #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP +- tp_dict_version = likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) ? __PYX_GET_DICT_VERSION(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) : 0; +- obj_dict_version = likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset) ? __PYX_GET_DICT_VERSION(_PyObject_GetDictPtr(((PyObject *)__pyx_v_self))) : 0; +- if (unlikely(type_dict_guard != tp_dict_version)) { +- tp_dict_version = obj_dict_version = 0; ++ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS ++ __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); ++ __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self)); ++ if (unlikely(__pyx_type_dict_guard != __pyx_tp_dict_version)) { ++ __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; + } + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; +- #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP ++ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + } + #endif + } +@@ -1898,9 +2106,11 @@ static PyObject *__pyx_f_5khmer_5_oxli_7hashset_7HashSet_add(struct __pyx_obj_5k + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_5add(PyObject *__pyx_v_self, PyObject *__pyx_arg_h); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_7hashset_7HashSet_4add[] = "HashSet.add(self, HashIntoType h)"; + static PyObject *__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_5add(PyObject *__pyx_v_self, PyObject *__pyx_arg_h) { + oxli::HashIntoType __pyx_v_h; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("add (wrapper)", 0); +@@ -1924,6 +2134,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashset_7HashSet_4add(struct __pyx_obj_ + 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("add", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_f_5khmer_5_oxli_7hashset_7HashSet_add(__pyx_v_self, __pyx_v_h, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 17, __pyx_L1_error) +@@ -1961,16 +2174,18 @@ static PyObject *__pyx_f_5khmer_5_oxli_7hashset_7HashSet_remove(struct __pyx_obj + 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("remove", 0); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overridden in Python */ + else if (unlikely((Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0) || (Py_TYPE(((PyObject *)__pyx_v_self))->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) { +- #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP +- static PY_UINT64_T tp_dict_version = 0, obj_dict_version = 0; +- if (likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict && tp_dict_version == __PYX_GET_DICT_VERSION(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) && (!Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset || obj_dict_version == __PYX_GET_DICT_VERSION(_PyObject_GetDictPtr(((PyObject *)__pyx_v_self)))))); +- else { +- PY_UINT64_T type_dict_guard = (likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict)) ? __PYX_GET_DICT_VERSION(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) : 0; ++ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS ++ static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; ++ if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) { ++ PY_UINT64_T __pyx_type_dict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); + #endif + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_remove); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 20, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); +@@ -2000,15 +2215,15 @@ static PyObject *__pyx_f_5khmer_5_oxli_7hashset_7HashSet_remove(struct __pyx_obj + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } +- #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP +- tp_dict_version = likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) ? __PYX_GET_DICT_VERSION(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) : 0; +- obj_dict_version = likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset) ? __PYX_GET_DICT_VERSION(_PyObject_GetDictPtr(((PyObject *)__pyx_v_self))) : 0; +- if (unlikely(type_dict_guard != tp_dict_version)) { +- tp_dict_version = obj_dict_version = 0; ++ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS ++ __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); ++ __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self)); ++ if (unlikely(__pyx_type_dict_guard != __pyx_tp_dict_version)) { ++ __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; + } + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; +- #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP ++ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + } + #endif + } +@@ -2072,9 +2287,11 @@ static PyObject *__pyx_f_5khmer_5_oxli_7hashset_7HashSet_remove(struct __pyx_obj + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_7remove(PyObject *__pyx_v_self, PyObject *__pyx_arg_h); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_7hashset_7HashSet_6remove[] = "HashSet.remove(self, HashIntoType h)"; + static PyObject *__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_7remove(PyObject *__pyx_v_self, PyObject *__pyx_arg_h) { + oxli::HashIntoType __pyx_v_h; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("remove (wrapper)", 0); +@@ -2098,6 +2315,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashset_7HashSet_6remove(struct __pyx_o + 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("remove", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_f_5khmer_5_oxli_7hashset_7HashSet_remove(__pyx_v_self, __pyx_v_h, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 20, __pyx_L1_error) +@@ -2197,6 +2417,9 @@ static int __pyx_pf_5khmer_5_oxli_7hashset_7HashSet_10__contains__(struct __pyx_ + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + char const *__pyx_t_5; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__contains__", 0); + + /* "khmer/_oxli/hashset.pyx":30 +@@ -2339,6 +2562,9 @@ static int __pyx_pf_5khmer_5_oxli_7hashset_7HashSet_10__contains__(struct __pyx_ + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_13__add__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/ + static PyObject *__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_13__add__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__add__ (wrapper)", 0); +@@ -2362,6 +2588,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashset_7HashSet_12__add__(PyObject *__ + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__add__", 0); + + /* "khmer/_oxli/hashset.pyx":40 +@@ -2488,6 +2717,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashset_7HashSet_12__add__(PyObject *__ + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_15__iadd__(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/ + static PyObject *__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_15__iadd__(PyObject *__pyx_v_self, PyObject *__pyx_v_other) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__iadd__ (wrapper)", 0); +@@ -2512,6 +2744,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashset_7HashSet_14__iadd__(struct __py + std::set ::iterator __pyx_t_3; + std::set *__pyx_t_4; + oxli::HashIntoType __pyx_t_5; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__iadd__", 0); + + /* "khmer/_oxli/hashset.pyx":50 +@@ -2641,6 +2876,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashset_7HashSet_16__iter__(struct __py + struct __pyx_obj_5khmer_5_oxli_7hashset___pyx_scope_struct____iter__ *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__iter__", 0); + __pyx_cur_scope = (struct __pyx_obj_5khmer_5_oxli_7hashset___pyx_scope_struct____iter__ *)__pyx_tp_new_5khmer_5_oxli_7hashset___pyx_scope_struct____iter__(__pyx_ptype_5khmer_5_oxli_7hashset___pyx_scope_struct____iter__, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { +@@ -2678,6 +2916,9 @@ static PyObject *__pyx_gb_5khmer_5_oxli_7hashset_7HashSet_18generator(__pyx_Coro + std::set *__pyx_t_2; + oxli::HashIntoType __pyx_t_3; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__iter__", 0); + switch (__pyx_generator->resume_label) { +@@ -2785,6 +3026,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashset_7HashSet_5ksize___get__(struct + 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("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_oxli_3a__3a_WordLength(__pyx_v_self->ksize); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 12, __pyx_L1_error) +@@ -2821,6 +3065,9 @@ static int __pyx_pf_5khmer_5_oxli_7hashset_7HashSet_5ksize_2__set__(struct __pyx + int __pyx_r; + __Pyx_RefNannyDeclarations + oxli::WordLength __pyx_t_1; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 0); + __pyx_t_1 = __Pyx_PyInt_As_oxli_3a__3a_WordLength(__pyx_v_value); if (unlikely((__pyx_t_1 == ((oxli::WordLength)-1)) && PyErr_Occurred())) __PYX_ERR(2, 12, __pyx_L1_error) + __pyx_v_self->ksize = __pyx_t_1; +@@ -2844,7 +3091,6 @@ static int __pyx_pf_5khmer_5_oxli_7hashset_7HashSet_5ksize_2__set__(struct __pyx + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_20__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_7hashset_7HashSet_19__reduce_cython__[] = "HashSet.__reduce_cython__(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_20__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -2860,6 +3106,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashset_7HashSet_19__reduce_cython__(CY + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -2899,7 +3148,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashset_7HashSet_19__reduce_cython__(CY + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_22__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_7hashset_7HashSet_21__setstate_cython__[] = "HashSet.__setstate_cython__(self, __pyx_state)"; + static PyObject *__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_22__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -2915,6 +3163,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7hashset_7HashSet_21__setstate_cython__( + 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)":4 +@@ -2991,16 +3242,16 @@ static int __pyx_setprop_5khmer_5_oxli_7hashset_7HashSet_ksize(PyObject *o, PyOb + } + + static PyMethodDef __pyx_methods_5khmer_5_oxli_7hashset_HashSet[] = { +- {"update", (PyCFunction)__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_3update, METH_O, __pyx_doc_5khmer_5_oxli_7hashset_7HashSet_2update}, +- {"add", (PyCFunction)__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_5add, METH_O, __pyx_doc_5khmer_5_oxli_7hashset_7HashSet_4add}, +- {"remove", (PyCFunction)__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_7remove, METH_O, __pyx_doc_5khmer_5_oxli_7hashset_7HashSet_6remove}, +- {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_20__reduce_cython__, METH_NOARGS, __pyx_doc_5khmer_5_oxli_7hashset_7HashSet_19__reduce_cython__}, +- {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_22__setstate_cython__, METH_O, __pyx_doc_5khmer_5_oxli_7hashset_7HashSet_21__setstate_cython__}, ++ {"update", (PyCFunction)__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_3update, METH_O, 0}, ++ {"add", (PyCFunction)__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_5add, METH_O, 0}, ++ {"remove", (PyCFunction)__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_7remove, METH_O, 0}, ++ {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_20__reduce_cython__, METH_NOARGS, 0}, ++ {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_7hashset_7HashSet_22__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} + }; + + static struct PyGetSetDef __pyx_getsets_5khmer_5_oxli_7hashset_HashSet[] = { +- {(char *)"ksize", __pyx_getprop_5khmer_5_oxli_7hashset_7HashSet_ksize, __pyx_setprop_5khmer_5_oxli_7hashset_7HashSet_ksize, (char *)"ksize: 'WordLength'", 0}, ++ {(char *)"ksize", __pyx_getprop_5khmer_5_oxli_7hashset_7HashSet_ksize, __pyx_setprop_5khmer_5_oxli_7hashset_7HashSet_ksize, (char *)0, 0}, + {0, 0, 0, 0, 0} + }; + +@@ -3091,7 +3342,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7hashset_HashSet = { + sizeof(struct __pyx_obj_5khmer_5_oxli_7hashset_HashSet), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_7hashset_HashSet, /*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 +@@ -3141,6 +3397,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7hashset_HashSet = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static struct __pyx_obj_5khmer_5_oxli_7hashset___pyx_scope_struct____iter__ *__pyx_freelist_5khmer_5_oxli_7hashset___pyx_scope_struct____iter__[8]; +@@ -3190,7 +3455,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7hashset___pyx_scope_struct____iter + sizeof(struct __pyx_obj_5khmer_5_oxli_7hashset___pyx_scope_struct____iter__), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_7hashset___pyx_scope_struct____iter__, /*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 +@@ -3240,6 +3510,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7hashset___pyx_scope_struct____iter + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static PyMethodDef __pyx_methods[] = { +@@ -3294,11 +3573,11 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, + {&__pyx_n_s_add, __pyx_k_add, sizeof(__pyx_k_add), 0, 0, 1, 1}, + {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1}, +- {&__pyx_kp_u_cannot_concatenate_HashSets_with, __pyx_k_cannot_concatenate_HashSets_with, sizeof(__pyx_k_cannot_concatenate_HashSets_with), 0, 1, 0, 0}, ++ {&__pyx_kp_s_cannot_concatenate_HashSets_with, __pyx_k_cannot_concatenate_HashSets_with, sizeof(__pyx_k_cannot_concatenate_HashSets_with), 0, 0, 1, 0}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_close, __pyx_k_close, sizeof(__pyx_k_close), 0, 0, 1, 1}, + {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, +- {&__pyx_kp_u_hash_not_in_HashSet_cannot_remov, __pyx_k_hash_not_in_HashSet_cannot_remov, sizeof(__pyx_k_hash_not_in_HashSet_cannot_remov), 0, 1, 0, 0}, ++ {&__pyx_kp_s_hash_not_in_HashSet_cannot_remov, __pyx_k_hash_not_in_HashSet_cannot_remov, sizeof(__pyx_k_hash_not_in_HashSet_cannot_remov), 0, 0, 1, 0}, + {&__pyx_n_s_hashes, __pyx_k_hashes, sizeof(__pyx_k_hashes), 0, 0, 1, 1}, + {&__pyx_n_s_iter, __pyx_k_iter, sizeof(__pyx_k_iter), 0, 0, 1, 1}, + {&__pyx_n_s_khmer__oxli_hashset, __pyx_k_khmer__oxli_hashset, sizeof(__pyx_k_khmer__oxli_hashset), 0, 0, 1, 1}, +@@ -3339,7 +3618,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + * + * def __len__(self): + */ +- __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_hash_not_in_HashSet_cannot_remov); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 22, __pyx_L1_error) ++ __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_hash_not_in_HashSet_cannot_remov); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__2); + __Pyx_GIVEREF(__pyx_tuple__2); + +@@ -3350,7 +3629,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + * no = HashSet(self.ksize) + * no += self + */ +- __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_u_cannot_concatenate_HashSets_with); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 41, __pyx_L1_error) ++ __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_s_cannot_concatenate_HashSets_with); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__3); + __Pyx_GIVEREF(__pyx_tuple__3); + +@@ -3420,13 +3699,18 @@ static int __Pyx_modinit_function_export_code(void) { + + 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_5khmer_5_oxli_7hashset_HashSet = &__pyx_vtable_5khmer_5_oxli_7hashset_HashSet; + __pyx_vtable_5khmer_5_oxli_7hashset_HashSet.add = (PyObject *(*)(struct __pyx_obj_5khmer_5_oxli_7hashset_HashSet *, oxli::HashIntoType, int __pyx_skip_dispatch))__pyx_f_5khmer_5_oxli_7hashset_7HashSet_add; + __pyx_vtable_5khmer_5_oxli_7hashset_HashSet.remove = (PyObject *(*)(struct __pyx_obj_5khmer_5_oxli_7hashset_HashSet *, oxli::HashIntoType, int __pyx_skip_dispatch))__pyx_f_5khmer_5_oxli_7hashset_7HashSet_remove; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_7hashset_HashSet) < 0) __PYX_ERR(0, 7, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_7hashset_HashSet.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_7hashset_HashSet.tp_dictoffset && __pyx_type_5khmer_5_oxli_7hashset_HashSet.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_7hashset_HashSet.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -3435,7 +3719,9 @@ static int __Pyx_modinit_type_init_code(void) { + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_5khmer_5_oxli_7hashset_HashSet) < 0) __PYX_ERR(0, 7, __pyx_L1_error) + __pyx_ptype_5khmer_5_oxli_7hashset_HashSet = &__pyx_type_5khmer_5_oxli_7hashset_HashSet; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_7hashset___pyx_scope_struct____iter__) < 0) __PYX_ERR(0, 57, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_7hashset___pyx_scope_struct____iter__.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_7hashset___pyx_scope_struct____iter__.tp_dictoffset && __pyx_type_5khmer_5_oxli_7hashset___pyx_scope_struct____iter__.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_7hashset___pyx_scope_struct____iter__.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } +@@ -3450,6 +3736,9 @@ static int __Pyx_modinit_type_init_code(void) { + 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("khmer._oxli.hashing"); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 62, __pyx_L1_error) +@@ -3477,13 +3766,17 @@ static int __Pyx_modinit_variable_import_code(void) { + static int __Pyx_modinit_function_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_function_import_code", 0); + /*--- Function import code ---*/ + __pyx_t_1 = PyImport_ImportModule("khmer._oxli.utils"); if (!__pyx_t_1) __PYX_ERR(0, 1, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_1); + if (__Pyx_ImportFunction(__pyx_t_1, "_bstring", (void (**)(void))&__pyx_f_5khmer_5_oxli_5utils__bstring, "PyObject *(PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportFunction(__pyx_t_1, "is_str", (void (**)(void))&__pyx_f_5khmer_5_oxli_5utils_is_str, "bool (PyObject *, int __pyx_skip_dispatch)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportFunction(__pyx_t_1, "is_num", (void (**)(void))&__pyx_f_5khmer_5_oxli_5utils_is_num, "bool (PyObject *, int __pyx_skip_dispatch)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) +- Py_DECREF(__pyx_t_1); __pyx_t_1 = 0; ++ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; +@@ -3493,17 +3786,19 @@ static int __Pyx_modinit_function_import_code(void) { + } + + +-#if PY_MAJOR_VERSION < 3 +-#ifdef CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC void +-#else ++#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 CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC PyObject * ++#ifdef __cplusplus ++#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * + #else +-#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC ++#define __Pyx_PyMODINIT_FUNC PyObject * + #endif + #endif + +@@ -3585,6 +3880,9 @@ static CYTHON_SMALL_CODE int __pyx_pymod_exec_hashset(PyObject *__pyx_pyinit_mod + #endif + { + PyObject *__pyx_t_1 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { +@@ -3632,11 +3930,9 @@ if (!__Pyx_RefNanny) { + #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? */ ++ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif +- #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; +@@ -3652,10 +3948,9 @@ if (!__Pyx_RefNanny) { + __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) +- __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) +- #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); +- #endif ++ __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) +@@ -3681,10 +3976,10 @@ if (!__Pyx_RefNanny) { + (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)) goto __pyx_L1_error; +- if (unlikely(__Pyx_modinit_type_import_code() != 0)) goto __pyx_L1_error; ++ 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(); +- if (unlikely(__Pyx_modinit_function_import_code() != 0)) goto __pyx_L1_error; ++ if (unlikely(__Pyx_modinit_function_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) +@@ -3819,7 +4114,7 @@ static int __Pyx_ParseOptionalKeywords( + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 +- if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { ++ if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { +@@ -3846,7 +4141,7 @@ static int __Pyx_ParseOptionalKeywords( + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -3862,7 +4157,7 @@ static int __Pyx_ParseOptionalKeywords( + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -3979,7 +4274,7 @@ static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args + return result; + } + #if 1 || PY_VERSION_HEX < 0x030600B1 +-static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs) { ++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); +@@ -4050,12 +4345,12 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + } + #if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); + #else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); + #endif +@@ -4071,7 +4366,7 @@ done: + #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; ++ ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) +@@ -4158,7 +4453,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec + 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) { ++ } else if (__Pyx_PyFastCFunction_Check(func)) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); + #endif + } +@@ -4176,6 +4471,32 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec + } + #endif + ++/* 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 ++ + /* PyErrFetchRestore */ + #if CYTHON_FAST_THREAD_STATE + static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { +@@ -4448,6 +4769,53 @@ bad: + return -1; + } + ++/* 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; icurexc_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 ++ ++/* 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; +@@ -4468,53 +4836,81 @@ static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; ++ PyObject *object_getstate = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; ++ PyObject *getstate = NULL; + #if CYTHON_USE_PYTYPE_LOOKUP +- if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto GOOD; ++ getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); + #else +- if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto GOOD; ++ getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); ++ if (!getstate && PyErr_Occurred()) { ++ goto __PYX_BAD; ++ } + #endif ++ if (getstate) { + #if CYTHON_USE_PYTYPE_LOOKUP +- object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; ++ object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); + #else +- object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; ++ object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); ++ if (!object_getstate && PyErr_Occurred()) { ++ goto __PYX_BAD; ++ } + #endif +- reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto BAD; ++ if (object_getstate != getstate) { ++ goto __PYX_GOOD; ++ } ++ } ++#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 BAD; ++ 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 BAD; ++ 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 BAD; ++ 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_GetAttrStr(type_obj, __pyx_n_s_reduce_cython); if (unlikely(!reduce_cython)) goto BAD; +- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto BAD; +- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto BAD; ++ 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_GetAttrStr(type_obj, __pyx_n_s_setstate_cython); if (unlikely(!setstate_cython)) goto BAD; +- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto BAD; +- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto BAD; ++ 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 GOOD; +-BAD: ++ 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; +-GOOD: ++__PYX_GOOD: + #if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); ++ Py_XDECREF(object_getstate); ++ Py_XDECREF(getstate); + #endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); +@@ -4607,7 +5003,7 @@ bad: + + /* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +-static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { ++static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; + #if CYTHON_COMPILING_IN_CPYTHON +@@ -4637,7 +5033,7 @@ static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + } + if (!use_cline) { + c_line = 0; +- PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); ++ (void) 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; +@@ -4711,7 +5107,7 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + 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)); ++ __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } +@@ -4731,33 +5127,40 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + #include "compile.h" + #include "frameobject.h" + #include "traceback.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + 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; ++ PyCodeObject *py_code = NULL; ++ PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 ++ PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); +- #else +- py_srcfile = PyUnicode_FromString(filename); +- #endif + if (!py_srcfile) goto bad; ++ #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; ++ funcname = PyUnicode_AsUTF8(py_funcname); ++ if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); +- #else +- py_funcname = PyUnicode_FromString(funcname); ++ if (!py_funcname) goto bad; + #endif + } +- if (!py_funcname) goto bad; ++ #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, +@@ -4776,11 +5179,16 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); +- Py_DECREF(py_funcname); ++ #else ++ py_code = PyCode_NewEmpty(filename, funcname, py_line); ++ #endif ++ Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline + return py_code; + bad: +- Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); ++ #if PY_MAJOR_VERSION < 3 ++ Py_XDECREF(py_srcfile); ++ #endif + return NULL; + } + static void __Pyx_AddTraceback(const char *funcname, int c_line, +@@ -4788,14 +5196,24 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; ++ PyObject *ptype, *pvalue, *ptraceback; + 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) { ++ __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); +- if (!py_code) goto bad; ++ if (!py_code) { ++ /* If the code object creation fails, then we should clear the ++ fetched exception references and propagate the new exception */ ++ Py_XDECREF(ptype); ++ Py_XDECREF(pvalue); ++ Py_XDECREF(ptraceback); ++ goto bad; ++ } ++ __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( +@@ -4834,71 +5252,16 @@ bad: + return (target_type) value;\ + } + +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_HashIntoType(oxli::HashIntoType value) { +- const oxli::HashIntoType neg_one = (oxli::HashIntoType) ((oxli::HashIntoType) 0 - (oxli::HashIntoType) 1), const_zero = (oxli::HashIntoType) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(oxli::HashIntoType) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(oxli::HashIntoType) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::HashIntoType) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif +- } +- } else { +- if (sizeof(oxli::HashIntoType) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::HashIntoType) <= 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(oxli::HashIntoType), +- little, !is_unsigned); +- } +-} +- +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_WordLength(oxli::WordLength value) { +- const oxli::WordLength neg_one = (oxli::WordLength) ((oxli::WordLength) 0 - (oxli::WordLength) 1), const_zero = (oxli::WordLength) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(oxli::WordLength) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(oxli::WordLength) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::WordLength) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif +- } +- } else { +- if (sizeof(oxli::WordLength) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::WordLength) <= 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(oxli::WordLength), +- little, !is_unsigned); +- } +-} +- + /* CIntFromPy */ + static CYTHON_INLINE oxli::HashIntoType __Pyx_PyInt_As_oxli_3a__3a_HashIntoType(PyObject *x) { +- const oxli::HashIntoType neg_one = (oxli::HashIntoType) ((oxli::HashIntoType) 0 - (oxli::HashIntoType) 1), const_zero = (oxli::HashIntoType) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::HashIntoType neg_one = (oxli::HashIntoType) -1, const_zero = (oxli::HashIntoType) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -5087,7 +5450,14 @@ raise_neg_overflow: + + /* CIntFromPy */ + static CYTHON_INLINE oxli::WordLength __Pyx_PyInt_As_oxli_3a__3a_WordLength(PyObject *x) { +- const oxli::WordLength neg_one = (oxli::WordLength) ((oxli::WordLength) 0 - (oxli::WordLength) 1), const_zero = (oxli::WordLength) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::WordLength neg_one = (oxli::WordLength) -1, const_zero = (oxli::WordLength) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -5274,9 +5644,92 @@ raise_neg_overflow: + return (oxli::WordLength) -1; + } + ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_HashIntoType(oxli::HashIntoType value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::HashIntoType neg_one = (oxli::HashIntoType) -1, const_zero = (oxli::HashIntoType) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(oxli::HashIntoType) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(oxli::HashIntoType) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::HashIntoType) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(oxli::HashIntoType) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::HashIntoType) <= 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(oxli::HashIntoType), ++ little, !is_unsigned); ++ } ++} ++ ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_WordLength(oxli::WordLength value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::WordLength neg_one = (oxli::WordLength) -1, const_zero = (oxli::WordLength) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(oxli::WordLength) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(oxli::WordLength) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::WordLength) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(oxli::WordLength) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::WordLength) <= 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(oxli::WordLength), ++ 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; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { +@@ -5307,7 +5760,14 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + + /* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -5496,7 +5956,14 @@ raise_neg_overflow: + + /* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +- const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const int neg_one = (int) -1, const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -6030,6 +6497,12 @@ static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name + /* CoroutineBase */ + #include + #include ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + #define __Pyx_Coroutine_Undelegate(gen) Py_CLEAR((gen)->yieldfrom) + static int __Pyx_PyGen__FetchStopIterationValue(CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject **pvalue) { + PyObject *et, *ev, *tb; +@@ -6201,9 +6674,13 @@ PyObject *__Pyx_Coroutine_SendEx(__pyx_CoroutineObject *self, PyObject *value, i + if (exc_state->exc_traceback) { + PyTracebackObject *tb = (PyTracebackObject *) exc_state->exc_traceback; + PyFrameObject *f = tb->tb_frame; +- Py_XINCREF(tstate->frame); + assert(f->f_back == NULL); ++ #if PY_VERSION_HEX >= 0x030B00A1 ++ f->f_back = PyThreadState_GetFrame(tstate); ++ #else ++ Py_XINCREF(tstate->frame); + f->f_back = tstate->frame; ++ #endif + } + #endif + } +@@ -6256,6 +6733,30 @@ PyObject *__Pyx_Coroutine_MethodReturn(CYTHON_UNUSED PyObject* gen, PyObject *re + } + return retval; + } ++#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) ++static CYTHON_INLINE ++PyObject *__Pyx_PyGen_Send(PyGenObject *gen, PyObject *arg) { ++#if PY_VERSION_HEX <= 0x030A00A1 ++ return _PyGen_Send(gen, arg); ++#else ++ PyObject *result; ++ if (PyIter_Send((PyObject*)gen, arg ? arg : Py_None, &result) == PYGEN_RETURN) { ++ if (PyAsyncGen_CheckExact(gen)) { ++ assert(result == Py_None); ++ PyErr_SetNone(PyExc_StopAsyncIteration); ++ } ++ else if (result == Py_None) { ++ PyErr_SetNone(PyExc_StopIteration); ++ } ++ else { ++ _PyGen_SetStopIterationValue(result); ++ } ++ Py_CLEAR(result); ++ } ++ return result; ++#endif ++} ++#endif + static CYTHON_INLINE + PyObject *__Pyx_Coroutine_FinishDelegation(__pyx_CoroutineObject *gen) { + PyObject *ret; +@@ -6292,12 +6793,12 @@ static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) { + #endif + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) + if (PyGen_CheckExact(yf)) { +- ret = _PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); ++ ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); + } else + #endif + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03050000 && defined(PyCoro_CheckExact) && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) + if (PyCoro_CheckExact(yf)) { +- ret = _PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); ++ ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); + } else + #endif + { +@@ -6381,7 +6882,7 @@ static PyObject *__Pyx_Generator_Next(PyObject *self) { + #endif + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) + if (PyGen_CheckExact(yf)) { +- ret = _PyGen_Send((PyGenObject*)yf, NULL); ++ ret = __Pyx_PyGen_Send((PyGenObject*)yf, NULL); + } else + #endif + #ifdef __Pyx_Coroutine_USED +@@ -6541,6 +7042,7 @@ static int __Pyx_Coroutine_clear(PyObject *self) { + } + #endif + Py_CLEAR(gen->gi_code); ++ Py_CLEAR(gen->gi_frame); + Py_CLEAR(gen->gi_name); + Py_CLEAR(gen->gi_qualname); + Py_CLEAR(gen->gi_modulename); +@@ -6557,7 +7059,7 @@ static void __Pyx_Coroutine_dealloc(PyObject *self) { + if (PyObject_CallFinalizerFromDealloc(self)) + #else + Py_TYPE(gen)->tp_del(self); +- if (self->ob_refcnt > 0) ++ if (Py_REFCNT(self) > 0) + #endif + { + return; +@@ -6584,7 +7086,7 @@ static void __Pyx_Coroutine_del(PyObject *self) { + } + #if !CYTHON_USE_TP_FINALIZE + assert(self->ob_refcnt == 0); +- self->ob_refcnt = 1; ++ __Pyx_SET_REFCNT(self, 1); + #endif + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&error_type, &error_value, &error_traceback); +@@ -6651,17 +7153,17 @@ static void __Pyx_Coroutine_del(PyObject *self) { + } + __Pyx_ErrRestore(error_type, error_value, error_traceback); + #if !CYTHON_USE_TP_FINALIZE +- assert(self->ob_refcnt > 0); ++ assert(Py_REFCNT(self) > 0); + if (--self->ob_refcnt == 0) { + return; + } + { +- Py_ssize_t refcnt = self->ob_refcnt; ++ Py_ssize_t refcnt = Py_REFCNT(self); + _Py_NewReference(self); +- self->ob_refcnt = refcnt; ++ __Pyx_SET_REFCNT(self, refcnt); + } + #if CYTHON_COMPILING_IN_CPYTHON +- assert(PyType_IS_GC(self->ob_type) && ++ assert(PyType_IS_GC(Py_TYPE(self)) && + _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED); + _Py_DEC_REFTOTAL; + #endif +@@ -6727,6 +7229,27 @@ __Pyx_Coroutine_set_qualname(__pyx_CoroutineObject *self, PyObject *value, CYTHO + Py_XDECREF(tmp); + return 0; + } ++static PyObject * ++__Pyx_Coroutine_get_frame(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context) ++{ ++ PyObject *frame = self->gi_frame; ++ if (!frame) { ++ if (unlikely(!self->gi_code)) { ++ Py_RETURN_NONE; ++ } ++ frame = (PyObject *) PyFrame_New( ++ PyThreadState_Get(), /*PyThreadState *tstate,*/ ++ (PyCodeObject*) self->gi_code, /*PyCodeObject *code,*/ ++ __pyx_d, /*PyObject *globals,*/ ++ 0 /*PyObject *locals*/ ++ ); ++ if (unlikely(!frame)) ++ return NULL; ++ self->gi_frame = frame; ++ } ++ Py_INCREF(frame); ++ return frame; ++} + static __pyx_CoroutineObject *__Pyx__Coroutine_New( + PyTypeObject* type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, + PyObject *name, PyObject *qualname, PyObject *module_name) { +@@ -6760,6 +7283,7 @@ static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit( + gen->gi_modulename = module_name; + Py_XINCREF(code); + gen->gi_code = code; ++ gen->gi_frame = NULL; + PyObject_GC_Track(gen); + return gen; + } +@@ -6883,6 +7407,8 @@ static PyGetSetDef __pyx_Generator_getsets[] = { + (char*) PyDoc_STR("name of the generator"), 0}, + {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname, + (char*) PyDoc_STR("qualified name of the generator"), 0}, ++ {(char *) "gi_frame", (getter)__Pyx_Coroutine_get_frame, NULL, ++ (char*) PyDoc_STR("Frame of the generator"), 0}, + {0, 0, 0, 0, 0} + }; + static PyTypeObject __pyx_GeneratorType_type = { +@@ -6942,6 +7468,15 @@ static PyTypeObject __pyx_GeneratorType_type = { + #elif PY_VERSION_HEX >= 0x030400a1 + 0, + #endif ++#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, ++#endif ++#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, ++#endif ++#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, ++#endif + }; + static int __pyx_Generator_init(void) { + __pyx_GeneratorType_type.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; +@@ -6955,11 +7490,33 @@ static int __pyx_Generator_init(void) { + + /* 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 ctversion[5]; ++ int same=1, i, found_dot; ++ const char* rt_from_call = Py_GetVersion(); ++ PyOS_snprintf(ctversion, 5, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); ++ found_dot = 0; ++ for (i = 0; i < 4; i++) { ++ if (!ctversion[i]) { ++ same = (rt_from_call[i] < '0' || rt_from_call[i] > '9'); ++ break; ++ } ++ if (rt_from_call[i] != ctversion[i]) { ++ same = 0; ++ break; ++ } ++ } ++ if (!same) { ++ char rtversion[5] = {'\0'}; + char message[200]; ++ for (i=0; i<4; ++i) { ++ if (rt_from_call[i] == '.') { ++ if (found_dot) break; ++ found_dot = 1; ++ } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') { ++ break; ++ } ++ rtversion[i] = rt_from_call[i]; ++ } + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", +@@ -7271,6 +7828,23 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_DECREF(x); + return ival; + } ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { ++ if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { ++ return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); ++#if PY_MAJOR_VERSION < 3 ++ } else if (likely(PyInt_CheckExact(o))) { ++ return PyInt_AS_LONG(o); ++#endif ++ } else { ++ Py_ssize_t ival; ++ PyObject *x; ++ x = PyNumber_Index(o); ++ if (!x) return -1; ++ ival = PyInt_AsLong(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); + } +diff --git a/khmer/_oxli/hllcounter.cpp b/khmer/_oxli/hllcounter.cpp +index 8761432e..221454ae 100644 +--- a/khmer/_oxli/hllcounter.cpp ++++ b/khmer/_oxli/hllcounter.cpp +@@ -1,15 +1,17 @@ +-/* Generated by Cython 0.29.2 */ ++/* Generated by Cython 0.29.32 */ + ++#ifndef PY_SSIZE_T_CLEAN + #define PY_SSIZE_T_CLEAN ++#endif /* 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_2" +-#define CYTHON_HEX_VERSION 0x001D02F0 +-#define CYTHON_FUTURE_DIVISION 1 ++#define CYTHON_ABI "0_29_32" ++#define CYTHON_HEX_VERSION 0x001D20F0 ++#define CYTHON_FUTURE_DIVISION 0 + #include + #ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +@@ -47,6 +49,7 @@ + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP +@@ -83,10 +86,14 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC (PYPY_VERSION_HEX >= 0x07030900) ++ #endif + #elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -124,10 +131,59 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 ++ #endif ++#elif defined(PY_NOGIL) ++ #define CYTHON_COMPILING_IN_PYPY 0 ++ #define CYTHON_COMPILING_IN_PYSTON 0 ++ #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 1 ++ #ifndef CYTHON_USE_TYPE_SLOTS ++ #define CYTHON_USE_TYPE_SLOTS 1 ++ #endif ++ #undef CYTHON_USE_PYTYPE_LOOKUP ++ #define CYTHON_USE_PYTYPE_LOOKUP 0 ++ #ifndef CYTHON_USE_ASYNC_SLOTS ++ #define CYTHON_USE_ASYNC_SLOTS 1 ++ #endif ++ #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 ++ #ifndef CYTHON_PEP489_MULTI_PHASE_INIT ++ #define CYTHON_PEP489_MULTI_PHASE_INIT 1 ++ #endif ++ #ifndef CYTHON_USE_TP_FINALIZE ++ #define CYTHON_USE_TP_FINALIZE 1 ++ #endif ++ #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 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -155,7 +211,7 @@ + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif +- #if PY_VERSION_HEX < 0x030300F0 ++ #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) +@@ -170,11 +226,14 @@ + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif +- #ifndef CYTHON_FAST_THREAD_STATE ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_FAST_THREAD_STATE ++ #define CYTHON_FAST_THREAD_STATE 0 ++ #elif !defined(CYTHON_FAST_THREAD_STATE) + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL +- #define CYTHON_FAST_PYCALL 1 ++ #define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030A0000) + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) +@@ -185,15 +244,23 @@ + #ifndef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) + #endif +- #ifndef CYTHON_USE_EXC_INFO_STACK ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_USE_EXC_INFO_STACK ++ #define CYTHON_USE_EXC_INFO_STACK 0 ++ #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) + #endif ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 ++ #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" ++ #if PY_MAJOR_VERSION < 3 ++ #include "longintrepr.h" ++ #endif + #undef SHIFT + #undef BASE + #undef MASK +@@ -324,8 +391,72 @@ class __Pyx_FakeReference { + #define __Pyx_DefaultClassType PyClass_Type + #else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" ++ #define __Pyx_DefaultClassType PyType_Type ++#if PY_VERSION_HEX >= 0x030B00A1 ++ static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int k, int l, int s, int f, ++ PyObject *code, PyObject *c, PyObject* n, PyObject *v, ++ PyObject *fv, PyObject *cell, PyObject* fn, ++ PyObject *name, int fline, PyObject *lnos) { ++ PyObject *kwds=NULL, *argcount=NULL, *posonlyargcount=NULL, *kwonlyargcount=NULL; ++ PyObject *nlocals=NULL, *stacksize=NULL, *flags=NULL, *replace=NULL, *call_result=NULL, *empty=NULL; ++ const char *fn_cstr=NULL; ++ const char *name_cstr=NULL; ++ PyCodeObject* co=NULL; ++ PyObject *type, *value, *traceback; ++ PyErr_Fetch(&type, &value, &traceback); ++ if (!(kwds=PyDict_New())) goto end; ++ if (!(argcount=PyLong_FromLong(a))) goto end; ++ if (PyDict_SetItemString(kwds, "co_argcount", argcount) != 0) goto end; ++ if (!(posonlyargcount=PyLong_FromLong(0))) goto end; ++ if (PyDict_SetItemString(kwds, "co_posonlyargcount", posonlyargcount) != 0) goto end; ++ if (!(kwonlyargcount=PyLong_FromLong(k))) goto end; ++ if (PyDict_SetItemString(kwds, "co_kwonlyargcount", kwonlyargcount) != 0) goto end; ++ if (!(nlocals=PyLong_FromLong(l))) goto end; ++ if (PyDict_SetItemString(kwds, "co_nlocals", nlocals) != 0) goto end; ++ if (!(stacksize=PyLong_FromLong(s))) goto end; ++ if (PyDict_SetItemString(kwds, "co_stacksize", stacksize) != 0) goto end; ++ if (!(flags=PyLong_FromLong(f))) goto end; ++ if (PyDict_SetItemString(kwds, "co_flags", flags) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_code", code) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_consts", c) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_names", n) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_varnames", v) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_freevars", fv) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_cellvars", cell) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_linetable", lnos) != 0) goto end; ++ if (!(fn_cstr=PyUnicode_AsUTF8AndSize(fn, NULL))) goto end; ++ if (!(name_cstr=PyUnicode_AsUTF8AndSize(name, NULL))) goto end; ++ if (!(co = PyCode_NewEmpty(fn_cstr, name_cstr, fline))) goto end; ++ if (!(replace = PyObject_GetAttrString((PyObject*)co, "replace"))) goto cleanup_code_too; ++ if (!(empty = PyTuple_New(0))) goto cleanup_code_too; // unfortunately __pyx_empty_tuple isn't available here ++ if (!(call_result = PyObject_Call(replace, empty, kwds))) goto cleanup_code_too; ++ Py_XDECREF((PyObject*)co); ++ co = (PyCodeObject*)call_result; ++ call_result = NULL; ++ if (0) { ++ cleanup_code_too: ++ Py_XDECREF((PyObject*)co); ++ co = NULL; ++ } ++ end: ++ Py_XDECREF(kwds); ++ Py_XDECREF(argcount); ++ Py_XDECREF(posonlyargcount); ++ Py_XDECREF(kwonlyargcount); ++ Py_XDECREF(nlocals); ++ Py_XDECREF(stacksize); ++ Py_XDECREF(replace); ++ Py_XDECREF(call_result); ++ Py_XDECREF(empty); ++ if (type) { ++ PyErr_Restore(type, value, traceback); ++ } ++ return co; ++ } ++#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 +@@ -360,26 +491,6 @@ class __Pyx_FakeReference { + #else + #define __Pyx_PyFastCFunction_Check(func) 0 + #endif +-#if CYTHON_USE_DICT_VERSIONS +-#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);\ +- }\ +- } +-#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 + #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) +@@ -412,7 +523,7 @@ class __Pyx_FakeReference { + typedef int Py_tss_t; + static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); +- return 0; // PyThread_create_key reports success always ++ 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)); +@@ -435,7 +546,7 @@ static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); + } +-#endif // TSS (Thread Specific Storage) API ++#endif + #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) + #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) + #else +@@ -455,8 +566,12 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #endif + #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 ++ #if defined(PyUnicode_IS_READY) + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) ++ #else ++ #define __Pyx_PyUnicode_READY(op) (0) ++ #endif + #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) +@@ -464,7 +579,15 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) ++ #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) ++ #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) ++ #endif ++ #else ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) ++ #endif + #else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 +@@ -513,8 +636,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) +@@ -525,6 +650,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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 +@@ -558,13 +690,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong +- #define __Pyx_PyInt_AsHash_t PyInt_AsLong ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t + #else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t +- #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t + #endif + #if PY_MAJOR_VERSION >= 3 +- #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func)) ++ #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 +@@ -586,8 +718,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + } __Pyx_PyAsyncMethodsStruct; + #endif + +-#if defined(WIN32) || defined(MS_WINDOWS) +- #define _USE_MATH_DEFINES ++#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) ++ #if !defined(_USE_MATH_DEFINES) ++ #define _USE_MATH_DEFINES ++ #endif + #endif + #include + #ifdef NAN +@@ -605,11 +739,10 @@ static CYTHON_INLINE float __PYX_NAN() { + #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_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ +-} ++ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + + #ifndef __PYX_EXTERN_C + #ifdef __cplusplus +@@ -632,6 +765,18 @@ static CYTHON_INLINE float __PYX_NAN() { + #include + #include + #include ++ ++ #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600) ++ // move should be defined for these versions of MSVC, but __cplusplus isn't set usefully ++ #include ++ ++ namespace cython_std { ++ template typename std::remove_reference::type&& move(T& t) noexcept { return std::move(t); } ++ template typename std::remove_reference::type&& move(T&& t) noexcept { return std::move(t); } ++ } ++ ++ #endif ++ + #include + #include + #include +@@ -656,10 +801,11 @@ typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* enc + 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_DEFAULT 0 +-#define __PYX_DEFAULT_STRING_ENCODING "utf8" +-#define __Pyx_PyObject_FromString __Pyx_PyUnicode_FromString +-#define __Pyx_PyObject_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize ++#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) (\ +@@ -739,6 +885,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); + (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); ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); + #if CYTHON_ASSUME_SAFE_MACROS + #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) + #else +@@ -1185,7 +1332,7 @@ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + #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, int nargs, PyObject *kwargs); ++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 +@@ -1194,13 +1341,21 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + #ifndef Py_MEMBER_SIZE + #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) + #endif ++#if CYTHON_FAST_PYCALL + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + #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 // CYTHON_FAST_PYCALL + #endif + + /* PyObjectCall.proto */ +@@ -1232,6 +1387,32 @@ static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObje + /* PyObjectCallOneArg.proto */ + static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + ++/* 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 ++ + /* ArgTypeTest.proto */ + #define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ + ((likely((Py_TYPE(obj) == type) | (none_allowed && (obj == Py_None)))) ? 1 :\ +@@ -1322,7 +1503,7 @@ static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { + if (likely(L->allocated > len)) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); +- Py_SIZE(list) = len+1; ++ __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +@@ -1391,6 +1572,14 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + /* None.proto */ + #include + ++/* GCCDiagnostics.proto */ ++#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) ++#define __Pyx_HAS_GCC_DIAGNOSTIC ++#endif ++ ++/* CIntFromPy.proto */ ++static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); ++ + /* CIntToPy.proto */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +@@ -1406,9 +1595,6 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_PY_LONG_LONG(unsigned P + /* CIntToPy.proto */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint8_t(uint8_t value); + +-/* CIntFromPy.proto */ +-static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); +- + /* CIntFromPy.proto */ + static CYTHON_INLINE uint8_t __Pyx_PyInt_As_uint8_t(PyObject *); + +@@ -1515,11 +1701,11 @@ static const char __pyx_k_estimate_cardinality[] = "estimate_cardinality"; + static const char __pyx_k_Cannot_delete_attribute[] = "Cannot delete attribute"; + static const char __pyx_k_Please_use_an_integer_value_for[] = "Please use an integer value for k-mer size"; + static const char __pyx_k_Please_set_k_mer_size_to_a_value[] = "Please set k-mer size to a value greater than zero"; +-static PyObject *__pyx_kp_u_Cannot_delete_attribute; ++static PyObject *__pyx_kp_s_Cannot_delete_attribute; + static PyObject *__pyx_n_s_HLLCounter; + static PyObject *__pyx_n_s_NotImplemented; +-static PyObject *__pyx_kp_u_Please_set_k_mer_size_to_a_value; +-static PyObject *__pyx_kp_u_Please_use_an_integer_value_for; ++static PyObject *__pyx_kp_s_Please_set_k_mer_size_to_a_value; ++static PyObject *__pyx_kp_s_Please_use_an_integer_value_for; + static PyObject *__pyx_n_s_TypeError; + static PyObject *__pyx_n_s_ValueError; + static PyObject *__pyx_n_s_cline_in_traceback; +@@ -1577,6 +1763,9 @@ static int __pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_1__cinit__(PyObject + static int __pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + double __pyx_v_error_rate; + int __pyx_v_ksize; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -1651,6 +1840,9 @@ static int __pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter___cinit__(struct __p + int __pyx_r; + __Pyx_RefNannyDeclarations + oxli::HLLCounter *__pyx_t_1; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "khmer/_oxli/hllcounter.pyx":25 +@@ -1698,7 +1890,7 @@ static int __pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter___cinit__(struct __p + /* Python wrapper */ + static Py_ssize_t __pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_3__len__(PyObject *__pyx_v_self); /*proto*/ + static char __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_2__len__[] = "Return the cardinality estimate."; +-#if CYTHON_COMPILING_IN_CPYTHON ++#if CYTHON_UPDATE_DESCRIPTOR_DOC + struct wrapperbase __pyx_wrapperbase_5khmer_5_oxli_10hllcounter_10HLLCounter_2__len__; + #endif + static Py_ssize_t __pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_3__len__(PyObject *__pyx_v_self) { +@@ -1719,6 +1911,9 @@ static Py_ssize_t __pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_2__len__(stru + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t __pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__len__", 0); + + /* "khmer/_oxli/hllcounter.pyx":29 +@@ -1780,7 +1975,7 @@ static Py_ssize_t __pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_2__len__(stru + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_5add(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_4add[] = "HLLCounter.add(self, kmer)\nAdd a k-mer to the counter."; ++static char __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_4add[] = "Add a k-mer to the counter."; + static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_5add(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -1797,6 +1992,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_4add(struct __ + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("add", 0); + + /* "khmer/_oxli/hllcounter.pyx":33 +@@ -1843,7 +2041,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_4add(struct __ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_7estimate_cardinality(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_6estimate_cardinality[] = "HLLCounter.estimate_cardinality(self)\nReturn the current estimative."; ++static char __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_6estimate_cardinality[] = "Return the current estimative."; + static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_7estimate_cardinality(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -1859,6 +2057,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_6estimate_card + 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("estimate_cardinality", 0); + + /* "khmer/_oxli/hllcounter.pyx":37 +@@ -1904,7 +2105,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_6estimate_card + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_9consume_string(PyObject *__pyx_v_self, PyObject *__pyx_v_seq); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_8consume_string[] = "HLLCounter.consume_string(self, seq)\nBreak a sequence into k-mers and add each k-mer to the counter."; ++static char __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_8consume_string[] = "Break a sequence into k-mers and add each k-mer to the counter."; + static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_9consume_string(PyObject *__pyx_v_self, PyObject *__pyx_v_seq) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -1921,6 +2122,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_8consume_strin + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("consume_string", 0); + + /* "khmer/_oxli/hllcounter.pyx":41 +@@ -1983,6 +2187,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_10hllcounter_10HLLCounter_consume_seqfile + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + std::string __pyx_t_8; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("consume_seqfile", 0); + if (__pyx_optional_args) { + if (__pyx_optional_args->__pyx_n > 0) { +@@ -1993,11 +2200,10 @@ static PyObject *__pyx_f_5khmer_5_oxli_10hllcounter_10HLLCounter_consume_seqfile + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overridden in Python */ + else if (unlikely((Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0) || (Py_TYPE(((PyObject *)__pyx_v_self))->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) { +- #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP +- static PY_UINT64_T tp_dict_version = 0, obj_dict_version = 0; +- if (likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict && tp_dict_version == __PYX_GET_DICT_VERSION(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) && (!Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset || obj_dict_version == __PYX_GET_DICT_VERSION(_PyObject_GetDictPtr(((PyObject *)__pyx_v_self)))))); +- else { +- PY_UINT64_T type_dict_guard = (likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict)) ? __PYX_GET_DICT_VERSION(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) : 0; ++ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS ++ static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; ++ if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) { ++ PY_UINT64_T __pyx_type_dict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); + #endif + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_consume_seqfile); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 43, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); +@@ -2059,15 +2265,15 @@ static PyObject *__pyx_f_5khmer_5_oxli_10hllcounter_10HLLCounter_consume_seqfile + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } +- #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP +- tp_dict_version = likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) ? __PYX_GET_DICT_VERSION(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) : 0; +- obj_dict_version = likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset) ? __PYX_GET_DICT_VERSION(_PyObject_GetDictPtr(((PyObject *)__pyx_v_self))) : 0; +- if (unlikely(type_dict_guard != tp_dict_version)) { +- tp_dict_version = obj_dict_version = 0; ++ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS ++ __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); ++ __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self)); ++ if (unlikely(__pyx_type_dict_guard != __pyx_tp_dict_version)) { ++ __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; + } + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; +- #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP ++ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + } + #endif + } +@@ -2166,10 +2372,13 @@ static PyObject *__pyx_f_5khmer_5_oxli_10hllcounter_10HLLCounter_consume_seqfile + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_11consume_seqfile(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_10consume_seqfile[] = "HLLCounter.consume_seqfile(self, filename, bool stream_records=False) -> tuple\nRead sequences from file, break into k-mers, "; ++static char __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_10consume_seqfile[] = "Read sequences from file, break into k-mers, "; + static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_11consume_seqfile(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_filename = 0; + bool __pyx_v_stream_records; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("consume_seqfile (wrapper)", 0); +@@ -2238,6 +2447,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_10consume_seqf + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + struct __pyx_opt_args_5khmer_5_oxli_10hllcounter_10HLLCounter_consume_seqfile __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("consume_seqfile", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_2.__pyx_n = 1; +@@ -2269,8 +2481,11 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_10consume_seqf + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_13merge(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_12merge[] = "HLLCounter.merge(self, HLLCounter other)\nMerge other counter into this one."; ++static char __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_12merge[] = "Merge other counter into this one."; + static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_13merge(PyObject *__pyx_v_self, PyObject *__pyx_v_other) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("merge (wrapper)", 0); +@@ -2289,6 +2504,9 @@ static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_13merge(PyObje + static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_12merge(struct __pyx_obj_5khmer_5_oxli_10hllcounter_HLLCounter *__pyx_v_self, struct __pyx_obj_5khmer_5_oxli_10hllcounter_HLLCounter *__pyx_v_other) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("merge", 0); + + /* "khmer/_oxli/hllcounter.pyx":58 +@@ -2350,6 +2568,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_5alpha___get__ + 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("__get__", 0); + + /* "khmer/_oxli/hllcounter.pyx":63 +@@ -2410,6 +2631,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_10error_rate__ + 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("__get__", 0); + + /* "khmer/_oxli/hllcounter.pyx":70 +@@ -2470,6 +2694,9 @@ static int __pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_10error_rate_2__set_ + int __pyx_r; + __Pyx_RefNannyDeclarations + double __pyx_t_1; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 0); + + /* "khmer/_oxli/hllcounter.pyx":74 +@@ -2531,6 +2758,9 @@ static int __pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_10error_rate_4__del_ + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__del__", 0); + + /* "khmer/_oxli/hllcounter.pyx":78 +@@ -2588,6 +2818,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_5ksize___get__ + 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("__get__", 0); + + /* "khmer/_oxli/hllcounter.pyx":85 +@@ -2651,6 +2884,9 @@ static int __pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_5ksize_2__set__(stru + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 0); + + /* "khmer/_oxli/hllcounter.pyx":89 +@@ -2780,6 +3016,9 @@ static int __pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_5ksize_4__del__(CYTH + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__del__", 0); + + /* "khmer/_oxli/hllcounter.pyx":98 +@@ -2837,6 +3076,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_8counters___ge + 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("__get__", 0); + + /* "khmer/_oxli/hllcounter.pyx":103 +@@ -2883,6 +3125,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_8counters___ge + /* Python wrapper */ + static int __pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_8counters_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_values); /*proto*/ + static int __pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_8counters_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_values) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); +@@ -2902,6 +3147,9 @@ static int __pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_8counters_2__set__(s + int __pyx_r; + __Pyx_RefNannyDeclarations + std::vector __pyx_t_1; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 0); + + /* "khmer/_oxli/hllcounter.pyx":107 +@@ -2948,7 +3196,6 @@ static int __pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_8counters_2__set__(s + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_15__getstate__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_14__getstate__[] = "HLLCounter.__getstate__(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_15__getstate__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -2967,6 +3214,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_14__getstate__ + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__getstate__", 0); + + /* "khmer/_oxli/hllcounter.pyx":110 +@@ -3030,7 +3280,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_14__getstate__ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_17__setstate__(PyObject *__pyx_v_self, PyObject *__pyx_v_tup); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_16__setstate__[] = "HLLCounter.__setstate__(self, tup)"; + static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_17__setstate__(PyObject *__pyx_v_self, PyObject *__pyx_v_tup) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -3053,6 +3302,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_16__setstate__ + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *(*__pyx_t_5)(PyObject *); ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate__", 0); + + /* "khmer/_oxli/hllcounter.pyx":113 +@@ -3184,7 +3436,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_16__setstate__ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_19__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_18__reduce__[] = "HLLCounter.__reduce__(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_19__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -3203,6 +3454,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_18__reduce__(s + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce__", 0); + + /* "khmer/_oxli/hllcounter.pyx":119 +@@ -3315,6 +3569,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_18__reduce__(s + static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_21__richcmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other, int __pyx_arg_op); /*proto*/ + static PyObject *__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_21__richcmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other, int __pyx_arg_op) { + PyObject *__pyx_v_op = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__richcmp__ (wrapper)", 0); +@@ -3342,6 +3599,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_20__richcmp__( + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__richcmp__", 0); + + /* "khmer/_oxli/hllcounter.pyx":124 +@@ -3450,7 +3710,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_10hllcounter_10HLLCounter_20__richcmp__( + * + * @cname("__pyx_convert_string_from_py_std__in_string") + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: # <<<<<<<<<<<<<< +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + */ + +@@ -3460,11 +3720,23 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + std::string __pyx_r; + __Pyx_RefNannyDeclarations + char const *__pyx_t_1; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_string_from_py_std__in_string", 0); + ++ /* "string.from_py":14 ++ * @cname("__pyx_convert_string_from_py_std__in_string") ++ * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: ++ * cdef Py_ssize_t length = 0 # <<<<<<<<<<<<<< ++ * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) ++ * return string(data, length) ++ */ ++ __pyx_v_length = 0; ++ + /* "string.from_py":15 + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) # <<<<<<<<<<<<<< + * return string(data, length) + * +@@ -3473,7 +3745,7 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + __pyx_v_data = __pyx_t_1; + + /* "string.from_py":16 +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + * return string(data, length) # <<<<<<<<<<<<<< + * +@@ -3486,7 +3758,7 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + * + * @cname("__pyx_convert_string_from_py_std__in_string") + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: # <<<<<<<<<<<<<< +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + */ + +@@ -3516,6 +3788,9 @@ static PyObject *__pyx_convert_vector_to_py_uint8_t(const std::vector + size_t __pyx_t_3; + size_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_vector_to_py_uint8_t", 0); + + /* "vector.to_py":61 +@@ -3579,6 +3854,9 @@ static std::vector __pyx_convert_vector_from_py_uint8_t(PyObject *__py + PyObject *(*__pyx_t_3)(PyObject *); + PyObject *__pyx_t_4 = NULL; + uint8_t __pyx_t_5; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_vector_from_py_uint8_t", 0); + + /* "vector.from_py":47 +@@ -3761,9 +4039,9 @@ static PyMethodDef __pyx_methods_5khmer_5_oxli_10hllcounter_HLLCounter[] = { + {"consume_string", (PyCFunction)__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_9consume_string, METH_O, __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_8consume_string}, + {"consume_seqfile", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_11consume_seqfile, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_10consume_seqfile}, + {"merge", (PyCFunction)__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_13merge, METH_O, __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_12merge}, +- {"__getstate__", (PyCFunction)__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_15__getstate__, METH_NOARGS, __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_14__getstate__}, +- {"__setstate__", (PyCFunction)__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_17__setstate__, METH_O, __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_16__setstate__}, +- {"__reduce__", (PyCFunction)__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_19__reduce__, METH_NOARGS, __pyx_doc_5khmer_5_oxli_10hllcounter_10HLLCounter_18__reduce__}, ++ {"__getstate__", (PyCFunction)__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_15__getstate__, METH_NOARGS, 0}, ++ {"__setstate__", (PyCFunction)__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_17__setstate__, METH_O, 0}, ++ {"__reduce__", (PyCFunction)__pyx_pw_5khmer_5_oxli_10hllcounter_10HLLCounter_19__reduce__, METH_NOARGS, 0}, + {0, 0, 0, 0} + }; + +@@ -3800,7 +4078,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_10hllcounter_HLLCounter = { + sizeof(struct __pyx_obj_5khmer_5_oxli_10hllcounter_HLLCounter), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_10hllcounter_HLLCounter, /*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 +@@ -3850,6 +4133,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_10hllcounter_HLLCounter = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static PyMethodDef __pyx_methods[] = { +@@ -3898,11 +4190,11 @@ static struct PyModuleDef __pyx_moduledef = { + #endif + + static __Pyx_StringTabEntry __pyx_string_tab[] = { +- {&__pyx_kp_u_Cannot_delete_attribute, __pyx_k_Cannot_delete_attribute, sizeof(__pyx_k_Cannot_delete_attribute), 0, 1, 0, 0}, ++ {&__pyx_kp_s_Cannot_delete_attribute, __pyx_k_Cannot_delete_attribute, sizeof(__pyx_k_Cannot_delete_attribute), 0, 0, 1, 0}, + {&__pyx_n_s_HLLCounter, __pyx_k_HLLCounter, sizeof(__pyx_k_HLLCounter), 0, 0, 1, 1}, + {&__pyx_n_s_NotImplemented, __pyx_k_NotImplemented, sizeof(__pyx_k_NotImplemented), 0, 0, 1, 1}, +- {&__pyx_kp_u_Please_set_k_mer_size_to_a_value, __pyx_k_Please_set_k_mer_size_to_a_value, sizeof(__pyx_k_Please_set_k_mer_size_to_a_value), 0, 1, 0, 0}, +- {&__pyx_kp_u_Please_use_an_integer_value_for, __pyx_k_Please_use_an_integer_value_for, sizeof(__pyx_k_Please_use_an_integer_value_for), 0, 1, 0, 0}, ++ {&__pyx_kp_s_Please_set_k_mer_size_to_a_value, __pyx_k_Please_set_k_mer_size_to_a_value, sizeof(__pyx_k_Please_set_k_mer_size_to_a_value), 0, 0, 1, 0}, ++ {&__pyx_kp_s_Please_use_an_integer_value_for, __pyx_k_Please_use_an_integer_value_for, sizeof(__pyx_k_Please_use_an_integer_value_for), 0, 0, 1, 0}, + {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, + {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 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}, +@@ -3942,7 +4234,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + * + * @property + */ +- __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_Cannot_delete_attribute); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 78, __pyx_L1_error) ++ __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_s_Cannot_delete_attribute); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple_); + __Pyx_GIVEREF(__pyx_tuple_); + +@@ -3953,7 +4245,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + * "than zero") + * if isinstance(new_k, float): + */ +- __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_Please_set_k_mer_size_to_a_value); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 90, __pyx_L1_error) ++ __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_Please_set_k_mer_size_to_a_value); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 90, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__2); + __Pyx_GIVEREF(__pyx_tuple__2); + +@@ -3964,7 +4256,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + * deref(self._this).set_ksize(new_k) + * + */ +- __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_u_Please_use_an_integer_value_for); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 93, __pyx_L1_error) ++ __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_s_Please_use_an_integer_value_for); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 93, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__3); + __Pyx_GIVEREF(__pyx_tuple__3); + __Pyx_RefNannyFinishContext(); +@@ -4017,16 +4309,21 @@ static int __Pyx_modinit_function_export_code(void) { + + 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_5khmer_5_oxli_10hllcounter_HLLCounter = &__pyx_vtable_5khmer_5_oxli_10hllcounter_HLLCounter; + __pyx_vtable_5khmer_5_oxli_10hllcounter_HLLCounter.consume_seqfile = (PyObject *(*)(struct __pyx_obj_5khmer_5_oxli_10hllcounter_HLLCounter *, PyObject *, int __pyx_skip_dispatch, struct __pyx_opt_args_5khmer_5_oxli_10hllcounter_10HLLCounter_consume_seqfile *__pyx_optional_args))__pyx_f_5khmer_5_oxli_10hllcounter_10HLLCounter_consume_seqfile; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_10hllcounter_HLLCounter) < 0) __PYX_ERR(0, 7, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_10hllcounter_HLLCounter.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_10hllcounter_HLLCounter.tp_dictoffset && __pyx_type_5khmer_5_oxli_10hllcounter_HLLCounter.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_10hllcounter_HLLCounter.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +- #if CYTHON_COMPILING_IN_CPYTHON ++ #if CYTHON_UPDATE_DESCRIPTOR_DOC + { + PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_5khmer_5_oxli_10hllcounter_HLLCounter, "__len__"); if (unlikely(!wrapper)) __PYX_ERR(0, 7, __pyx_L1_error) + if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) { +@@ -4049,6 +4346,9 @@ static int __Pyx_modinit_type_init_code(void) { + 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("khmer._oxli.parsing"); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 109, __pyx_L1_error) +@@ -4093,12 +4393,16 @@ static int __Pyx_modinit_variable_import_code(void) { + static int __Pyx_modinit_function_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_function_import_code", 0); + /*--- Function import code ---*/ + __pyx_t_1 = PyImport_ImportModule("khmer._oxli.utils"); if (!__pyx_t_1) __PYX_ERR(0, 1, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_1); + if (__Pyx_ImportFunction(__pyx_t_1, "_bstring", (void (**)(void))&__pyx_f_5khmer_5_oxli_5utils__bstring, "PyObject *(PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportFunction(__pyx_t_1, "_ustring", (void (**)(void))&__pyx_f_5khmer_5_oxli_5utils__ustring, "PyObject *(PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) +- Py_DECREF(__pyx_t_1); __pyx_t_1 = 0; ++ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; +@@ -4108,17 +4412,19 @@ static int __Pyx_modinit_function_import_code(void) { + } + + +-#if PY_MAJOR_VERSION < 3 +-#ifdef CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC void +-#else ++#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 CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC PyObject * ++#ifdef __cplusplus ++#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * + #else +-#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC ++#define __Pyx_PyMODINIT_FUNC PyObject * + #endif + #endif + +@@ -4200,6 +4506,9 @@ static CYTHON_SMALL_CODE int __pyx_pymod_exec_hllcounter(PyObject *__pyx_pyinit_ + #endif + { + PyObject *__pyx_t_1 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { +@@ -4247,11 +4556,9 @@ if (!__Pyx_RefNanny) { + #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? */ ++ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif +- #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; +@@ -4267,10 +4574,9 @@ if (!__Pyx_RefNanny) { + __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) +- __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) +- #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); +- #endif ++ __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) +@@ -4296,10 +4602,10 @@ if (!__Pyx_RefNanny) { + (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)) goto __pyx_L1_error; +- if (unlikely(__Pyx_modinit_type_import_code() != 0)) goto __pyx_L1_error; ++ 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(); +- if (unlikely(__Pyx_modinit_function_import_code() != 0)) goto __pyx_L1_error; ++ if (unlikely(__Pyx_modinit_function_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) +@@ -4429,7 +4735,7 @@ static int __Pyx_ParseOptionalKeywords( + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 +- if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { ++ if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { +@@ -4456,7 +4762,7 @@ static int __Pyx_ParseOptionalKeywords( + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -4472,7 +4778,7 @@ static int __Pyx_ParseOptionalKeywords( + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -4566,7 +4872,7 @@ static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args + return result; + } + #if 1 || PY_VERSION_HEX < 0x030600B1 +-static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs) { ++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); +@@ -4637,12 +4943,12 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + } + #if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); + #else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); + #endif +@@ -4658,7 +4964,7 @@ done: + #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; ++ ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) +@@ -4761,7 +5067,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec + 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) { ++ } else if (__Pyx_PyFastCFunction_Check(func)) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); + #endif + } +@@ -4779,6 +5085,32 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec + } + #endif + ++/* 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 ++ + /* ArgTypeTest */ + static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) + { +@@ -5315,7 +5647,7 @@ bad: + + /* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +-static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { ++static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; + #if CYTHON_COMPILING_IN_CPYTHON +@@ -5345,7 +5677,7 @@ static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + } + if (!use_cline) { + c_line = 0; +- PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); ++ (void) 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; +@@ -5419,7 +5751,7 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + 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)); ++ __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } +@@ -5439,33 +5771,40 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + #include "compile.h" + #include "frameobject.h" + #include "traceback.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + 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; ++ PyCodeObject *py_code = NULL; ++ PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 ++ PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); +- #else +- py_srcfile = PyUnicode_FromString(filename); +- #endif + if (!py_srcfile) goto bad; ++ #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; ++ funcname = PyUnicode_AsUTF8(py_funcname); ++ if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); +- #else +- py_funcname = PyUnicode_FromString(funcname); ++ if (!py_funcname) goto bad; + #endif + } +- if (!py_funcname) goto bad; ++ #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, +@@ -5484,11 +5823,16 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); +- Py_DECREF(py_funcname); ++ #else ++ py_code = PyCode_NewEmpty(filename, funcname, py_line); ++ #endif ++ Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline + return py_code; + bad: +- Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); ++ #if PY_MAJOR_VERSION < 3 ++ Py_XDECREF(py_srcfile); ++ #endif + return NULL; + } + static void __Pyx_AddTraceback(const char *funcname, int c_line, +@@ -5496,14 +5840,24 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; ++ PyObject *ptype, *pvalue, *ptraceback; + 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) { ++ __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); +- if (!py_code) goto bad; ++ if (!py_code) { ++ /* If the code object creation fails, then we should clear the ++ fetched exception references and propagate the new exception */ ++ Py_XDECREF(ptype); ++ Py_XDECREF(pvalue); ++ Py_XDECREF(ptraceback); ++ goto bad; ++ } ++ __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( +@@ -5542,164 +5896,16 @@ bad: + 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_uint64_t(uint64_t value) { +- 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 (is_unsigned) { +- if (sizeof(uint64_t) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(uint64_t) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(uint64_t) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif +- } +- } else { +- if (sizeof(uint64_t) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(uint64_t) <= 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(uint64_t), +- little, !is_unsigned); +- } +-} +- +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value) { +- const unsigned int neg_one = (unsigned int) ((unsigned int) 0 - (unsigned int) 1), const_zero = (unsigned int) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(unsigned int) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(unsigned int) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif +- } +- } else { +- if (sizeof(unsigned int) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned 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(unsigned int), +- little, !is_unsigned); +- } +-} +- +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_PY_LONG_LONG(unsigned PY_LONG_LONG value) { +- const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG) ((unsigned PY_LONG_LONG) 0 - (unsigned PY_LONG_LONG) 1), const_zero = (unsigned PY_LONG_LONG) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(unsigned PY_LONG_LONG) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif +- } +- } else { +- if (sizeof(unsigned PY_LONG_LONG) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned PY_LONG_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(unsigned PY_LONG_LONG), +- little, !is_unsigned); +- } +-} +- +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint8_t(uint8_t value) { +- 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 (is_unsigned) { +- if (sizeof(uint8_t) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(uint8_t) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(uint8_t) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif +- } +- } else { +- if (sizeof(uint8_t) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(uint8_t) <= 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(uint8_t), +- little, !is_unsigned); +- } +-} +- + /* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +- const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const int neg_one = (int) -1, const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -5886,9 +6092,206 @@ raise_neg_overflow: + return (int) -1; + } + ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const int neg_one = (int) -1, const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ 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_uint64_t(uint64_t value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const uint64_t neg_one = (uint64_t) -1, const_zero = (uint64_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(uint64_t) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(uint64_t) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(uint64_t) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(uint64_t) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(uint64_t) <= 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(uint64_t), ++ little, !is_unsigned); ++ } ++} ++ ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const unsigned int neg_one = (unsigned int) -1, const_zero = (unsigned int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(unsigned int) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(unsigned int) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(unsigned int) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(unsigned 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(unsigned int), ++ little, !is_unsigned); ++ } ++} ++ ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_PY_LONG_LONG(unsigned PY_LONG_LONG value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG) -1, const_zero = (unsigned PY_LONG_LONG) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(unsigned PY_LONG_LONG) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(unsigned PY_LONG_LONG) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(unsigned PY_LONG_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(unsigned PY_LONG_LONG), ++ little, !is_unsigned); ++ } ++} ++ ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint8_t(uint8_t value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const uint8_t neg_one = (uint8_t) -1, const_zero = (uint8_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(uint8_t) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(uint8_t) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(uint8_t) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(uint8_t) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(uint8_t) <= 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(uint8_t), ++ little, !is_unsigned); ++ } ++} ++ + /* 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; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const uint8_t neg_one = (uint8_t) -1, const_zero = (uint8_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -6077,7 +6480,14 @@ raise_neg_overflow: + + /* CIntFromPy */ + static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *x) { +- const size_t neg_one = (size_t) ((size_t) 0 - (size_t) 1), const_zero = (size_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const size_t neg_one = (size_t) -1, const_zero = (size_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -6266,7 +6676,14 @@ raise_neg_overflow: + + /* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { +@@ -6297,7 +6714,14 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + + /* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -6586,11 +7010,33 @@ static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObj + + /* 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 ctversion[5]; ++ int same=1, i, found_dot; ++ const char* rt_from_call = Py_GetVersion(); ++ PyOS_snprintf(ctversion, 5, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); ++ found_dot = 0; ++ for (i = 0; i < 4; i++) { ++ if (!ctversion[i]) { ++ same = (rt_from_call[i] < '0' || rt_from_call[i] > '9'); ++ break; ++ } ++ if (rt_from_call[i] != ctversion[i]) { ++ same = 0; ++ break; ++ } ++ } ++ if (!same) { ++ char rtversion[5] = {'\0'}; + char message[200]; ++ for (i=0; i<4; ++i) { ++ if (rt_from_call[i] == '.') { ++ if (found_dot) break; ++ found_dot = 1; ++ } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') { ++ break; ++ } ++ rtversion[i] = rt_from_call[i]; ++ } + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", +@@ -6902,6 +7348,23 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_DECREF(x); + return ival; + } ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { ++ if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { ++ return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); ++#if PY_MAJOR_VERSION < 3 ++ } else if (likely(PyInt_CheckExact(o))) { ++ return PyInt_AS_LONG(o); ++#endif ++ } else { ++ Py_ssize_t ival; ++ PyObject *x; ++ x = PyNumber_Index(o); ++ if (!x) return -1; ++ ival = PyInt_AsLong(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); + } +diff --git a/khmer/_oxli/labeling.cpp b/khmer/_oxli/labeling.cpp +index 57218249..0d6379b1 100644 +--- a/khmer/_oxli/labeling.cpp ++++ b/khmer/_oxli/labeling.cpp +@@ -1,15 +1,17 @@ +-/* Generated by Cython 0.29.2 */ ++/* Generated by Cython 0.29.32 */ + ++#ifndef PY_SSIZE_T_CLEAN + #define PY_SSIZE_T_CLEAN ++#endif /* 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_2" +-#define CYTHON_HEX_VERSION 0x001D02F0 +-#define CYTHON_FUTURE_DIVISION 1 ++#define CYTHON_ABI "0_29_32" ++#define CYTHON_HEX_VERSION 0x001D20F0 ++#define CYTHON_FUTURE_DIVISION 0 + #include + #ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +@@ -47,6 +49,7 @@ + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP +@@ -83,10 +86,14 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC (PYPY_VERSION_HEX >= 0x07030900) ++ #endif + #elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -124,10 +131,59 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 ++ #endif ++#elif defined(PY_NOGIL) ++ #define CYTHON_COMPILING_IN_PYPY 0 ++ #define CYTHON_COMPILING_IN_PYSTON 0 ++ #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 1 ++ #ifndef CYTHON_USE_TYPE_SLOTS ++ #define CYTHON_USE_TYPE_SLOTS 1 ++ #endif ++ #undef CYTHON_USE_PYTYPE_LOOKUP ++ #define CYTHON_USE_PYTYPE_LOOKUP 0 ++ #ifndef CYTHON_USE_ASYNC_SLOTS ++ #define CYTHON_USE_ASYNC_SLOTS 1 ++ #endif ++ #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 ++ #ifndef CYTHON_PEP489_MULTI_PHASE_INIT ++ #define CYTHON_PEP489_MULTI_PHASE_INIT 1 ++ #endif ++ #ifndef CYTHON_USE_TP_FINALIZE ++ #define CYTHON_USE_TP_FINALIZE 1 ++ #endif ++ #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 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -155,7 +211,7 @@ + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif +- #if PY_VERSION_HEX < 0x030300F0 ++ #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) +@@ -170,11 +226,14 @@ + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif +- #ifndef CYTHON_FAST_THREAD_STATE ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_FAST_THREAD_STATE ++ #define CYTHON_FAST_THREAD_STATE 0 ++ #elif !defined(CYTHON_FAST_THREAD_STATE) + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL +- #define CYTHON_FAST_PYCALL 1 ++ #define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030A0000) + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) +@@ -185,15 +244,23 @@ + #ifndef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) + #endif +- #ifndef CYTHON_USE_EXC_INFO_STACK ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_USE_EXC_INFO_STACK ++ #define CYTHON_USE_EXC_INFO_STACK 0 ++ #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) + #endif ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 ++ #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" ++ #if PY_MAJOR_VERSION < 3 ++ #include "longintrepr.h" ++ #endif + #undef SHIFT + #undef BASE + #undef MASK +@@ -324,8 +391,72 @@ class __Pyx_FakeReference { + #define __Pyx_DefaultClassType PyClass_Type + #else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" ++ #define __Pyx_DefaultClassType PyType_Type ++#if PY_VERSION_HEX >= 0x030B00A1 ++ static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int k, int l, int s, int f, ++ PyObject *code, PyObject *c, PyObject* n, PyObject *v, ++ PyObject *fv, PyObject *cell, PyObject* fn, ++ PyObject *name, int fline, PyObject *lnos) { ++ PyObject *kwds=NULL, *argcount=NULL, *posonlyargcount=NULL, *kwonlyargcount=NULL; ++ PyObject *nlocals=NULL, *stacksize=NULL, *flags=NULL, *replace=NULL, *call_result=NULL, *empty=NULL; ++ const char *fn_cstr=NULL; ++ const char *name_cstr=NULL; ++ PyCodeObject* co=NULL; ++ PyObject *type, *value, *traceback; ++ PyErr_Fetch(&type, &value, &traceback); ++ if (!(kwds=PyDict_New())) goto end; ++ if (!(argcount=PyLong_FromLong(a))) goto end; ++ if (PyDict_SetItemString(kwds, "co_argcount", argcount) != 0) goto end; ++ if (!(posonlyargcount=PyLong_FromLong(0))) goto end; ++ if (PyDict_SetItemString(kwds, "co_posonlyargcount", posonlyargcount) != 0) goto end; ++ if (!(kwonlyargcount=PyLong_FromLong(k))) goto end; ++ if (PyDict_SetItemString(kwds, "co_kwonlyargcount", kwonlyargcount) != 0) goto end; ++ if (!(nlocals=PyLong_FromLong(l))) goto end; ++ if (PyDict_SetItemString(kwds, "co_nlocals", nlocals) != 0) goto end; ++ if (!(stacksize=PyLong_FromLong(s))) goto end; ++ if (PyDict_SetItemString(kwds, "co_stacksize", stacksize) != 0) goto end; ++ if (!(flags=PyLong_FromLong(f))) goto end; ++ if (PyDict_SetItemString(kwds, "co_flags", flags) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_code", code) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_consts", c) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_names", n) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_varnames", v) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_freevars", fv) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_cellvars", cell) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_linetable", lnos) != 0) goto end; ++ if (!(fn_cstr=PyUnicode_AsUTF8AndSize(fn, NULL))) goto end; ++ if (!(name_cstr=PyUnicode_AsUTF8AndSize(name, NULL))) goto end; ++ if (!(co = PyCode_NewEmpty(fn_cstr, name_cstr, fline))) goto end; ++ if (!(replace = PyObject_GetAttrString((PyObject*)co, "replace"))) goto cleanup_code_too; ++ if (!(empty = PyTuple_New(0))) goto cleanup_code_too; // unfortunately __pyx_empty_tuple isn't available here ++ if (!(call_result = PyObject_Call(replace, empty, kwds))) goto cleanup_code_too; ++ Py_XDECREF((PyObject*)co); ++ co = (PyCodeObject*)call_result; ++ call_result = NULL; ++ if (0) { ++ cleanup_code_too: ++ Py_XDECREF((PyObject*)co); ++ co = NULL; ++ } ++ end: ++ Py_XDECREF(kwds); ++ Py_XDECREF(argcount); ++ Py_XDECREF(posonlyargcount); ++ Py_XDECREF(kwonlyargcount); ++ Py_XDECREF(nlocals); ++ Py_XDECREF(stacksize); ++ Py_XDECREF(replace); ++ Py_XDECREF(call_result); ++ Py_XDECREF(empty); ++ if (type) { ++ PyErr_Restore(type, value, traceback); ++ } ++ return co; ++ } ++#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 +@@ -360,26 +491,6 @@ class __Pyx_FakeReference { + #else + #define __Pyx_PyFastCFunction_Check(func) 0 + #endif +-#if CYTHON_USE_DICT_VERSIONS +-#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);\ +- }\ +- } +-#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 + #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) +@@ -412,7 +523,7 @@ class __Pyx_FakeReference { + typedef int Py_tss_t; + static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); +- return 0; // PyThread_create_key reports success always ++ 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)); +@@ -435,7 +546,7 @@ static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); + } +-#endif // TSS (Thread Specific Storage) API ++#endif + #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) + #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) + #else +@@ -455,8 +566,12 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #endif + #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 ++ #if defined(PyUnicode_IS_READY) + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) ++ #else ++ #define __Pyx_PyUnicode_READY(op) (0) ++ #endif + #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) +@@ -464,7 +579,15 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) ++ #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) ++ #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) ++ #endif ++ #else ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) ++ #endif + #else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 +@@ -513,8 +636,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) +@@ -525,6 +650,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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 +@@ -558,13 +690,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong +- #define __Pyx_PyInt_AsHash_t PyInt_AsLong ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t + #else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t +- #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t + #endif + #if PY_MAJOR_VERSION >= 3 +- #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func)) ++ #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 +@@ -586,8 +718,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + } __Pyx_PyAsyncMethodsStruct; + #endif + +-#if defined(WIN32) || defined(MS_WINDOWS) +- #define _USE_MATH_DEFINES ++#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) ++ #if !defined(_USE_MATH_DEFINES) ++ #define _USE_MATH_DEFINES ++ #endif + #endif + #include + #ifdef NAN +@@ -605,11 +739,10 @@ static CYTHON_INLINE float __PYX_NAN() { + #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_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ +-} ++ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + + #ifndef __PYX_EXTERN_C + #ifdef __cplusplus +@@ -623,13 +756,25 @@ static CYTHON_INLINE float __PYX_NAN() { + #define __PYX_HAVE_API__khmer___oxli__labeling + /* Early includes */ + #include ++#include + #include "ios" + #include "new" + #include "stdexcept" + #include "typeinfo" +-#include + #include + #include ++ ++ #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600) ++ // move should be defined for these versions of MSVC, but __cplusplus isn't set usefully ++ #include ++ ++ namespace cython_std { ++ template typename std::remove_reference::type&& move(T& t) noexcept { return std::move(t); } ++ template typename std::remove_reference::type&& move(T&& t) noexcept { return std::move(t); } ++ } ++ ++ #endif ++ + #include + #include + #include +@@ -661,10 +806,11 @@ typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* enc + 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_DEFAULT 0 +-#define __PYX_DEFAULT_STRING_ENCODING "utf8" +-#define __Pyx_PyObject_FromString __Pyx_PyUnicode_FromString +-#define __Pyx_PyObject_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize ++#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) (\ +@@ -744,6 +890,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); + (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); ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); + #if CYTHON_ASSUME_SAFE_MACROS + #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) + #else +@@ -1659,9 +1806,9 @@ static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *nam + + /* PyIntBinop.proto */ + #if !CYTHON_COMPILING_IN_PYPY +-static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace); ++static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check); + #else +-#define __Pyx_PyInt_AddObjC(op1, op2, intval, inplace)\ ++#define __Pyx_PyInt_AddObjC(op1, op2, intval, inplace, zerodivision_check)\ + (inplace ? PyNumber_InPlaceAdd(op1, op2) : PyNumber_Add(op1, op2)) + #endif + +@@ -1670,7 +1817,7 @@ static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, + #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, int nargs, PyObject *kwargs); ++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 +@@ -1679,13 +1826,21 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + #ifndef Py_MEMBER_SIZE + #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) + #endif ++#if CYTHON_FAST_PYCALL + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + #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 // CYTHON_FAST_PYCALL + #endif + + /* PyObjectCall.proto */ +@@ -1759,6 +1914,32 @@ static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject + /* RaiseException.proto */ + static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + ++/* 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) {\ +@@ -1800,6 +1981,17 @@ static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_nam + #define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr + #endif + ++/* 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 ++ ++/* PyObjectGetAttrStrNoError.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); ++ + /* SetupReduce.proto */ + static int __Pyx_setup_reduce(PyObject* type_obj); + +@@ -1823,14 +2015,6 @@ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + /* ImportFrom.proto */ + static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +-/* 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 +- + /* GetNameInClass.proto */ + #define __Pyx_GetNameInClass(var, nmspace, name) (var) = __Pyx__GetNameInClass(nmspace, name) + static PyObject *__Pyx__GetNameInClass(PyObject *nmspace, PyObject *name); +@@ -1864,6 +2048,11 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + /* None.proto */ + #include + ++/* GCCDiagnostics.proto */ ++#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) ++#define __Pyx_HAS_GCC_DIAGNOSTIC ++#endif ++ + /* CppExceptionConversion.proto */ + #ifndef __Pyx_CppExn2PyErr + #include +@@ -1906,21 +2095,6 @@ static void __Pyx_CppExn2PyErr() { + } + #endif + +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value); +- +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_PY_LONG_LONG(unsigned PY_LONG_LONG value); +- +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_Label(oxli::Label value); +- +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); +- +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint64_t(uint64_t value); +- + /* CIntFromPy.proto */ + static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_As_unsigned_PY_LONG_LONG(PyObject *); + +@@ -1933,9 +2107,24 @@ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + /* CIntFromPy.proto */ + static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *); + ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value); ++ ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_PY_LONG_LONG(unsigned PY_LONG_LONG value); ++ + /* CIntFromPy.proto */ + static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *); + ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_Label(oxli::Label value); ++ ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); ++ ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint64_t(uint64_t value); ++ + /* CIntToPy.proto */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +@@ -2014,6 +2203,7 @@ typedef struct { + PyObject *gi_qualname; + PyObject *gi_modulename; + PyObject *gi_code; ++ PyObject *gi_frame; + int resume_label; + char is_running; + } __pyx_CoroutineObject; +@@ -2329,6 +2519,9 @@ static int __pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_1__cinit__(PyObject *_ + struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *__pyx_v_graph = 0; + CYTHON_UNUSED PyObject *__pyx_v_args = 0; + CYTHON_UNUSED PyObject *__pyx_v_kwargs = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -2402,6 +2595,9 @@ static int __pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels___cinit__(struct __pyx + int __pyx_r; + __Pyx_RefNannyDeclarations + std::shared_ptr __pyx_t_1; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "khmer/_oxli/labeling.pyx":13 +@@ -2477,6 +2673,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_21_default_sweep + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "khmer/_oxli/labeling.pyx":18 +@@ -2492,7 +2691,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_21_default_sweep + __pyx_t_2 = PyNumber_Multiply(__pyx_int_2, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 18, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; +- __pyx_t_1 = __Pyx_PyInt_AddObjC(__pyx_t_2, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 18, __pyx_L1_error) ++ __pyx_t_1 = __Pyx_PyInt_AddObjC(__pyx_t_2, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 18, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; +@@ -2529,12 +2728,14 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_21_default_sweep + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_3consume_seqfile_and_tag_with_labels(PyObject *__pyx_v_self, PyObject *__pyx_v_filename); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_2consume_seqfile_and_tag_with_labels[] = "GraphLabels.consume_seqfile_and_tag_with_labels(self, unicode filename)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_3consume_seqfile_and_tag_with_labels(PyObject *__pyx_v_self, PyObject *__pyx_v_filename) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("consume_seqfile_and_tag_with_labels (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyUnicode_Type), 1, "filename", 1))) __PYX_ERR(0, 20, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyString_Type), 1, "filename", 1))) __PYX_ERR(0, 20, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_2consume_seqfile_and_tag_with_labels(((struct __pyx_obj_5khmer_5_oxli_8labeling_GraphLabels *)__pyx_v_self), ((PyObject*)__pyx_v_filename)); + + /* function exit code */ +@@ -2556,6 +2757,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_2consume_seqfile + std::string __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("consume_seqfile_and_tag_with_labels", 0); + + /* "khmer/_oxli/labeling.pyx":21 +@@ -2659,12 +2863,14 @@ static PyObject *__pyx_gb_5khmer_5_oxli_8labeling_11GraphLabels_6generator(__pyx + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_5sweep_label_neighborhood(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_4sweep_label_neighborhood[] = "GraphLabels.sweep_label_neighborhood(self, unicode sequence, radius=0, bool break_on_stoptags=False, bool stop_big_traversals=False)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_5sweep_label_neighborhood(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_sequence = 0; + PyObject *__pyx_v_radius = 0; + bool __pyx_v_break_on_stoptags; + bool __pyx_v_stop_big_traversals; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("sweep_label_neighborhood (wrapper)", 0); +@@ -2764,7 +2970,7 @@ static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_5sweep_label_nei + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(0, 29, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(0, 29, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_4sweep_label_neighborhood(((struct __pyx_obj_5khmer_5_oxli_8labeling_GraphLabels *)__pyx_v_self), __pyx_v_sequence, __pyx_v_radius, __pyx_v_break_on_stoptags, __pyx_v_stop_big_traversals); + + /* "khmer/_oxli/labeling.pyx":29 +@@ -2788,6 +2994,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_4sweep_label_nei + struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct__sweep_label_neighborhood *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("sweep_label_neighborhood", 0); + __pyx_cur_scope = (struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct__sweep_label_neighborhood *)__pyx_tp_new_5khmer_5_oxli_8labeling___pyx_scope_struct__sweep_label_neighborhood(__pyx_ptype_5khmer_5_oxli_8labeling___pyx_scope_struct__sweep_label_neighborhood, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { +@@ -2836,6 +3045,9 @@ static PyObject *__pyx_gb_5khmer_5_oxli_8labeling_11GraphLabels_6generator(__pyx + unsigned int __pyx_t_5; + std::set ::iterator __pyx_t_6; + oxli::Label __pyx_t_7; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("sweep_label_neighborhood", 0); + switch (__pyx_generator->resume_label) { +@@ -3007,12 +3219,14 @@ static PyObject *__pyx_gb_5khmer_5_oxli_8labeling_11GraphLabels_6generator(__pyx + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_8consume_partitioned_fasta_and_tag_with_labels(PyObject *__pyx_v_self, PyObject *__pyx_v_filename); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_7consume_partitioned_fasta_and_tag_with_labels[] = "GraphLabels.consume_partitioned_fasta_and_tag_with_labels(self, unicode filename)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_8consume_partitioned_fasta_and_tag_with_labels(PyObject *__pyx_v_self, PyObject *__pyx_v_filename) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("consume_partitioned_fasta_and_tag_with_labels (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyUnicode_Type), 1, "filename", 1))) __PYX_ERR(0, 47, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyString_Type), 1, "filename", 1))) __PYX_ERR(0, 47, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_7consume_partitioned_fasta_and_tag_with_labels(((struct __pyx_obj_5khmer_5_oxli_8labeling_GraphLabels *)__pyx_v_self), ((PyObject*)__pyx_v_filename)); + + /* function exit code */ +@@ -3034,6 +3248,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_7consume_partiti + std::string __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("consume_partitioned_fasta_and_tag_with_labels", 0); + + /* "khmer/_oxli/labeling.pyx":48 +@@ -3136,12 +3353,14 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_7consume_partiti + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_10sweep_tag_neighborhood(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_9sweep_tag_neighborhood[] = "GraphLabels.sweep_tag_neighborhood(self, unicode sequence, radius=0, bool break_on_stoptags=False, bool stop_big_traversals=False)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_10sweep_tag_neighborhood(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_sequence = 0; + PyObject *__pyx_v_radius = 0; + bool __pyx_v_break_on_stoptags; + bool __pyx_v_stop_big_traversals; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("sweep_tag_neighborhood (wrapper)", 0); +@@ -3241,7 +3460,7 @@ static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_10sweep_tag_neig + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(0, 56, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(0, 56, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_9sweep_tag_neighborhood(((struct __pyx_obj_5khmer_5_oxli_8labeling_GraphLabels *)__pyx_v_self), __pyx_v_sequence, __pyx_v_radius, __pyx_v_break_on_stoptags, __pyx_v_stop_big_traversals); + + /* "khmer/_oxli/labeling.pyx":56 +@@ -3274,6 +3493,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_9sweep_tag_neigh + unsigned int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("sweep_tag_neighborhood", 0); + + /* "khmer/_oxli/labeling.pyx":59 +@@ -3429,7 +3651,6 @@ static PyObject *__pyx_gb_5khmer_5_oxli_8labeling_11GraphLabels_13generator1(__p + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_12get_tag_labels(PyObject *__pyx_v_self, PyObject *__pyx_v_tag); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_11get_tag_labels[] = "GraphLabels.get_tag_labels(self, tag)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_12get_tag_labels(PyObject *__pyx_v_self, PyObject *__pyx_v_tag) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -3445,6 +3666,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_11get_tag_labels + struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct_1_get_tag_labels *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_tag_labels", 0); + __pyx_cur_scope = (struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct_1_get_tag_labels *)__pyx_tp_new_5khmer_5_oxli_8labeling___pyx_scope_struct_1_get_tag_labels(__pyx_ptype_5khmer_5_oxli_8labeling___pyx_scope_struct_1_get_tag_labels, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { +@@ -3485,6 +3709,9 @@ static PyObject *__pyx_gb_5khmer_5_oxli_8labeling_11GraphLabels_13generator1(__p + std::set ::iterator __pyx_t_2; + oxli::Label __pyx_t_3; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_tag_labels", 0); + switch (__pyx_generator->resume_label) { +@@ -3598,12 +3825,15 @@ static PyObject *__pyx_gb_5khmer_5_oxli_8labeling_11GraphLabels_16generator2(__p + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_15get_labels_for_sequence(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_14get_labels_for_sequence[] = "GraphLabels.get_labels_for_sequence(self, unicode sequence)\nReturn labels for all the tags found in this sequence."; ++static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_14get_labels_for_sequence[] = "Return labels for all the tags found in this sequence."; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_15get_labels_for_sequence(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_labels_for_sequence (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(0, 83, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(0, 83, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_14get_labels_for_sequence(((struct __pyx_obj_5khmer_5_oxli_8labeling_GraphLabels *)__pyx_v_self), ((PyObject*)__pyx_v_sequence)); + + /* function exit code */ +@@ -3619,6 +3849,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_14get_labels_for + struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct_2_get_labels_for_sequence *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_labels_for_sequence", 0); + __pyx_cur_scope = (struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct_2_get_labels_for_sequence *)__pyx_tp_new_5khmer_5_oxli_8labeling___pyx_scope_struct_2_get_labels_for_sequence(__pyx_ptype_5khmer_5_oxli_8labeling___pyx_scope_struct_2_get_labels_for_sequence, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { +@@ -3659,6 +3892,9 @@ static PyObject *__pyx_gb_5khmer_5_oxli_8labeling_11GraphLabels_16generator2(__p + std::string __pyx_t_2; + std::set ::iterator __pyx_t_3; + oxli::Label __pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_labels_for_sequence", 0); + switch (__pyx_generator->resume_label) { +@@ -3774,10 +4010,12 @@ static PyObject *__pyx_gb_5khmer_5_oxli_8labeling_11GraphLabels_16generator2(__p + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_18consume_sequence_and_tag_with_labels(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_17consume_sequence_and_tag_with_labels[] = "GraphLabels.consume_sequence_and_tag_with_labels(self, unicode sequence, unsigned long long label)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_18consume_sequence_and_tag_with_labels(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_sequence = 0; + unsigned PY_LONG_LONG __pyx_v_label; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("consume_sequence_and_tag_with_labels (wrapper)", 0); +@@ -3827,7 +4065,7 @@ static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_18consume_sequen + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(0, 92, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(0, 92, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_17consume_sequence_and_tag_with_labels(((struct __pyx_obj_5khmer_5_oxli_8labeling_GraphLabels *)__pyx_v_self), __pyx_v_sequence, __pyx_v_label); + + /* function exit code */ +@@ -3846,6 +4084,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_17consume_sequen + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("consume_sequence_and_tag_with_labels", 0); + + /* "khmer/_oxli/labeling.pyx":93 +@@ -3937,6 +4178,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_8n_labels___get_ + 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("__get__", 0); + + /* "khmer/_oxli/labeling.pyx":102 +@@ -3983,7 +4227,6 @@ static PyObject *__pyx_gb_5khmer_5_oxli_8labeling_11GraphLabels_21generator3(__p + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_20labels(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_19labels[] = "GraphLabels.labels(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_20labels(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -3999,6 +4242,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_19labels(struct + struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct_3_labels *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("labels", 0); + __pyx_cur_scope = (struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct_3_labels *)__pyx_tp_new_5khmer_5_oxli_8labeling___pyx_scope_struct_3_labels(__pyx_ptype_5khmer_5_oxli_8labeling___pyx_scope_struct_3_labels, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { +@@ -4036,6 +4282,9 @@ static PyObject *__pyx_gb_5khmer_5_oxli_8labeling_11GraphLabels_21generator3(__p + oxli::LabelSet *__pyx_t_2; + oxli::Label __pyx_t_3; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("labels", 0); + switch (__pyx_generator->resume_label) { +@@ -4133,7 +4382,7 @@ static PyObject *__pyx_gb_5khmer_5_oxli_8labeling_11GraphLabels_24generator4(__p + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_23tags(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_22tags[] = "GraphLabels.tags(self)\nGet all tagged k-mers as DNA strings."; ++static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_22tags[] = "Get all tagged k-mers as DNA strings."; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_23tags(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -4149,6 +4398,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_22tags(struct __ + struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct_4_tags *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("tags", 0); + __pyx_cur_scope = (struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct_4_tags *)__pyx_tp_new_5khmer_5_oxli_8labeling___pyx_scope_struct_4_tags(__pyx_ptype_5khmer_5_oxli_8labeling___pyx_scope_struct_4_tags, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { +@@ -4187,6 +4439,9 @@ static PyObject *__pyx_gb_5khmer_5_oxli_8labeling_11GraphLabels_24generator4(__p + oxli::HashIntoType __pyx_t_3; + std::string __pyx_t_4; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("tags", 0); + switch (__pyx_generator->resume_label) { +@@ -4227,7 +4482,7 @@ static PyObject *__pyx_gb_5khmer_5_oxli_8labeling_11GraphLabels_24generator4(__p + oxli_raise_py_error(); if (!PyErr_Occurred())PyErr_SetString(PyExc_RuntimeError, "Error converting c++ exception."); + __PYX_ERR(0, 113, __pyx_L1_error) + } +- __pyx_t_5 = __pyx_convert_PyUnicode_string_to_py_std__in_string(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 113, __pyx_L1_error) ++ __pyx_t_5 = __pyx_convert_PyBytes_string_to_py_std__in_string(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 113, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; +@@ -4289,7 +4544,6 @@ static PyObject *__pyx_gb_5khmer_5_oxli_8labeling_11GraphLabels_24generator4(__p + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_26add_tag(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_25add_tag[] = "GraphLabels.add_tag(self, kmer)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_26add_tag(PyObject *__pyx_v_self, PyObject *__pyx_v_kmer) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -4306,6 +4560,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_25add_tag(struct + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + oxli::HashIntoType __pyx_t_1; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("add_tag", 0); + + /* "khmer/_oxli/labeling.pyx":116 +@@ -4357,10 +4614,12 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_25add_tag(struct + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_28link_tag_and_label(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_27link_tag_and_label[] = "GraphLabels.link_tag_and_label(self, tag, Label label)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_28link_tag_and_label(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_tag = 0; + oxli::Label __pyx_v_label; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("link_tag_and_label (wrapper)", 0); +@@ -4422,6 +4681,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_27link_tag_and_l + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + oxli::HashIntoType __pyx_t_1; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("link_tag_and_label", 0); + + /* "khmer/_oxli/labeling.pyx":120 +@@ -4473,11 +4735,13 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_27link_tag_and_l + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_30label_across_high_degree_nodes(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_29label_across_high_degree_nodes[] = "GraphLabels.label_across_high_degree_nodes(self, unicode sequence, HashSet hdns, unsigned long long label=0)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_30label_across_high_degree_nodes(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_sequence = 0; + struct __pyx_obj_5khmer_5_oxli_7hashset_HashSet *__pyx_v_hdns = 0; + unsigned PY_LONG_LONG __pyx_v_label; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("label_across_high_degree_nodes (wrapper)", 0); +@@ -4544,7 +4808,7 @@ static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_30label_across_h + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(0, 123, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(0, 123, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_hdns), __pyx_ptype_5khmer_5_oxli_7hashset_HashSet, 1, "hdns", 0))) __PYX_ERR(0, 123, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_29label_across_high_degree_nodes(((struct __pyx_obj_5khmer_5_oxli_8labeling_GraphLabels *)__pyx_v_self), __pyx_v_sequence, __pyx_v_hdns, __pyx_v_label); + +@@ -4563,6 +4827,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_29label_across_h + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("label_across_high_degree_nodes", 0); + + /* "khmer/_oxli/labeling.pyx":125 +@@ -4618,7 +4885,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_29label_across_h + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_32assemble_labeled_path(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_31assemble_labeled_path[] = "GraphLabels.assemble_labeled_path(self, *args, **kwargs)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_32assemble_labeled_path(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + CYTHON_UNUSED PyObject *__pyx_v_args = 0; + CYTHON_UNUSED PyObject *__pyx_v_kwargs = 0; +@@ -4641,6 +4907,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_31assemble_label + 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("assemble_labeled_path", 0); + + /* "khmer/_oxli/labeling.pyx":129 +@@ -4684,12 +4953,14 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_31assemble_label + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_34save_labels_and_tags(PyObject *__pyx_v_self, PyObject *__pyx_v_filename); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_33save_labels_and_tags[] = "GraphLabels.save_labels_and_tags(self, unicode filename)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_34save_labels_and_tags(PyObject *__pyx_v_self, PyObject *__pyx_v_filename) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("save_labels_and_tags (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyUnicode_Type), 1, "filename", 1))) __PYX_ERR(0, 131, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyString_Type), 1, "filename", 1))) __PYX_ERR(0, 131, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_33save_labels_and_tags(((struct __pyx_obj_5khmer_5_oxli_8labeling_GraphLabels *)__pyx_v_self), ((PyObject*)__pyx_v_filename)); + + /* function exit code */ +@@ -4706,6 +4977,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_33save_labels_an + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("save_labels_and_tags", 0); + + /* "khmer/_oxli/labeling.pyx":132 +@@ -4757,12 +5031,14 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_33save_labels_an + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_36load_labels_and_tags(PyObject *__pyx_v_self, PyObject *__pyx_v_filename); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_35load_labels_and_tags[] = "GraphLabels.load_labels_and_tags(self, unicode filename)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_36load_labels_and_tags(PyObject *__pyx_v_self, PyObject *__pyx_v_filename) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("load_labels_and_tags (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyUnicode_Type), 1, "filename", 1))) __PYX_ERR(0, 134, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyString_Type), 1, "filename", 1))) __PYX_ERR(0, 134, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_35load_labels_and_tags(((struct __pyx_obj_5khmer_5_oxli_8labeling_GraphLabels *)__pyx_v_self), ((PyObject*)__pyx_v_filename)); + + /* function exit code */ +@@ -4779,6 +5055,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_35load_labels_an + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("load_labels_and_tags", 0); + + /* "khmer/_oxli/labeling.pyx":135 +@@ -4830,11 +5109,13 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_35load_labels_an + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_38load(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_37load[] = "GraphLabels.load(unicode filename, Hashgraph graph)"; +-static PyMethodDef __pyx_mdef_5khmer_5_oxli_8labeling_11GraphLabels_38load = {"load", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_38load, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_37load}; ++static PyMethodDef __pyx_mdef_5khmer_5_oxli_8labeling_11GraphLabels_38load = {"load", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_38load, METH_VARARGS|METH_KEYWORDS, 0}; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_38load(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_filename = 0; + struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *__pyx_v_graph = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("load (wrapper)", 0); +@@ -4884,7 +5165,7 @@ static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_38load(CYTHON_UN + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyUnicode_Type), 1, "filename", 1))) __PYX_ERR(0, 138, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyString_Type), 1, "filename", 1))) __PYX_ERR(0, 138, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_graph), __pyx_ptype_5khmer_5_oxli_6graphs_Hashgraph, 1, "graph", 0))) __PYX_ERR(0, 138, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_37load(__pyx_v_filename, __pyx_v_graph); + +@@ -4903,6 +5184,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_37load(PyObject + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("load", 0); + + /* "khmer/_oxli/labeling.pyx":139 +@@ -4977,13 +5261,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_37load(PyObject + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_40NodeGraphLabels(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_39NodeGraphLabels[] = "GraphLabels.NodeGraphLabels(int k, uint64_t starting_size, int n_tables, primes=[])"; +-static PyMethodDef __pyx_mdef_5khmer_5_oxli_8labeling_11GraphLabels_40NodeGraphLabels = {"NodeGraphLabels", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_40NodeGraphLabels, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_39NodeGraphLabels}; ++static PyMethodDef __pyx_mdef_5khmer_5_oxli_8labeling_11GraphLabels_40NodeGraphLabels = {"NodeGraphLabels", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_40NodeGraphLabels, METH_VARARGS|METH_KEYWORDS, 0}; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_40NodeGraphLabels(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + int __pyx_v_k; + uint64_t __pyx_v_starting_size; + int __pyx_v_n_tables; + PyObject *__pyx_v_primes = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("NodeGraphLabels (wrapper)", 0); +@@ -5078,6 +5364,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_39NodeGraphLabel + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("NodeGraphLabels", 0); + + /* "khmer/_oxli/labeling.pyx":146 +@@ -5262,13 +5551,15 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_39NodeGraphLabel + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_42CountGraphLabels(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_41CountGraphLabels[] = "GraphLabels.CountGraphLabels(int k, uint64_t starting_size, int n_tables, primes=[])"; +-static PyMethodDef __pyx_mdef_5khmer_5_oxli_8labeling_11GraphLabels_42CountGraphLabels = {"CountGraphLabels", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_42CountGraphLabels, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_41CountGraphLabels}; ++static PyMethodDef __pyx_mdef_5khmer_5_oxli_8labeling_11GraphLabels_42CountGraphLabels = {"CountGraphLabels", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_42CountGraphLabels, METH_VARARGS|METH_KEYWORDS, 0}; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_42CountGraphLabels(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + int __pyx_v_k; + uint64_t __pyx_v_starting_size; + int __pyx_v_n_tables; + PyObject *__pyx_v_primes = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("CountGraphLabels (wrapper)", 0); +@@ -5363,6 +5654,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_41CountGraphLabe + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("CountGraphLabels", 0); + + /* "khmer/_oxli/labeling.pyx":157 +@@ -5588,6 +5882,9 @@ static int __pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_5graph_2__set__(struct + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 0); + if (!(likely(((__pyx_v_value) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_value, __pyx_ptype_5khmer_5_oxli_6graphs_Hashgraph))))) __PYX_ERR(2, 64, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; +@@ -5647,7 +5944,6 @@ static int __pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_5graph_4__del__(struct + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_44__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_43__reduce_cython__[] = "GraphLabels.__reduce_cython__(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_44__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -5663,6 +5959,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_43__reduce_cytho + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -5702,7 +6001,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_43__reduce_cytho + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_46__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_45__setstate_cython__[] = "GraphLabels.__setstate_cython__(self, __pyx_state)"; + static PyObject *__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_46__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -5718,6 +6016,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_45__setstate_cyt + 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)":4 +@@ -5752,7 +6053,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_8labeling_11GraphLabels_45__setstate_cyt + * + * @cname("__pyx_convert_string_from_py_std__in_string") + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: # <<<<<<<<<<<<<< +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + */ + +@@ -5762,11 +6063,23 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + std::string __pyx_r; + __Pyx_RefNannyDeclarations + char const *__pyx_t_1; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_string_from_py_std__in_string", 0); + ++ /* "string.from_py":14 ++ * @cname("__pyx_convert_string_from_py_std__in_string") ++ * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: ++ * cdef Py_ssize_t length = 0 # <<<<<<<<<<<<<< ++ * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) ++ * return string(data, length) ++ */ ++ __pyx_v_length = 0; ++ + /* "string.from_py":15 + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) # <<<<<<<<<<<<<< + * return string(data, length) + * +@@ -5775,7 +6088,7 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + __pyx_v_data = __pyx_t_1; + + /* "string.from_py":16 +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + * return string(data, length) # <<<<<<<<<<<<<< + * +@@ -5788,7 +6101,7 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + * + * @cname("__pyx_convert_string_from_py_std__in_string") + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: # <<<<<<<<<<<<<< +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + */ + +@@ -5813,6 +6126,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyObject_string_to_py_std__in_strin + 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("__pyx_convert_PyObject_string_to_py_std__in_string", 0); + + /* "string.to_py":32 +@@ -5860,6 +6176,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyUnicode_string_to_py_std__in_stri + 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("__pyx_convert_PyUnicode_string_to_py_std__in_string", 0); + + /* "string.to_py":38 +@@ -5907,6 +6226,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyStr_string_to_py_std__in_string(s + 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("__pyx_convert_PyStr_string_to_py_std__in_string", 0); + + /* "string.to_py":44 +@@ -5954,6 +6276,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyBytes_string_to_py_std__in_string + 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("__pyx_convert_PyBytes_string_to_py_std__in_string", 0); + + /* "string.to_py":50 +@@ -6001,6 +6326,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyByteArray_string_to_py_std__in_st + 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("__pyx_convert_PyByteArray_string_to_py_std__in_string", 0); + + /* "string.to_py":56 +@@ -6053,6 +6381,9 @@ static std::vector __pyx_convert_vector_from_py_uint64_t(PyObject *__ + PyObject *(*__pyx_t_3)(PyObject *); + PyObject *__pyx_t_4 = NULL; + uint64_t __pyx_t_5; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_vector_from_py_uint64_t", 0); + + /* "vector.from_py":47 +@@ -6226,33 +6557,33 @@ static int __pyx_setprop_5khmer_5_oxli_8labeling_11GraphLabels_graph(PyObject *o + } + + static PyMethodDef __pyx_methods_5khmer_5_oxli_8labeling_GraphLabels[] = { +- {"consume_seqfile_and_tag_with_labels", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_3consume_seqfile_and_tag_with_labels, METH_O, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_2consume_seqfile_and_tag_with_labels}, +- {"sweep_label_neighborhood", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_5sweep_label_neighborhood, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_4sweep_label_neighborhood}, +- {"consume_partitioned_fasta_and_tag_with_labels", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_8consume_partitioned_fasta_and_tag_with_labels, METH_O, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_7consume_partitioned_fasta_and_tag_with_labels}, +- {"sweep_tag_neighborhood", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_10sweep_tag_neighborhood, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_9sweep_tag_neighborhood}, +- {"get_tag_labels", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_12get_tag_labels, METH_O, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_11get_tag_labels}, ++ {"consume_seqfile_and_tag_with_labels", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_3consume_seqfile_and_tag_with_labels, METH_O, 0}, ++ {"sweep_label_neighborhood", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_5sweep_label_neighborhood, METH_VARARGS|METH_KEYWORDS, 0}, ++ {"consume_partitioned_fasta_and_tag_with_labels", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_8consume_partitioned_fasta_and_tag_with_labels, METH_O, 0}, ++ {"sweep_tag_neighborhood", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_10sweep_tag_neighborhood, METH_VARARGS|METH_KEYWORDS, 0}, ++ {"get_tag_labels", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_12get_tag_labels, METH_O, 0}, + {"get_labels_for_sequence", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_15get_labels_for_sequence, METH_O, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_14get_labels_for_sequence}, +- {"consume_sequence_and_tag_with_labels", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_18consume_sequence_and_tag_with_labels, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_17consume_sequence_and_tag_with_labels}, +- {"labels", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_20labels, METH_NOARGS, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_19labels}, ++ {"consume_sequence_and_tag_with_labels", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_18consume_sequence_and_tag_with_labels, METH_VARARGS|METH_KEYWORDS, 0}, ++ {"labels", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_20labels, METH_NOARGS, 0}, + {"tags", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_23tags, METH_NOARGS, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_22tags}, +- {"add_tag", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_26add_tag, METH_O, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_25add_tag}, +- {"link_tag_and_label", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_28link_tag_and_label, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_27link_tag_and_label}, +- {"label_across_high_degree_nodes", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_30label_across_high_degree_nodes, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_29label_across_high_degree_nodes}, +- {"assemble_labeled_path", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_32assemble_labeled_path, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_31assemble_labeled_path}, +- {"save_labels_and_tags", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_34save_labels_and_tags, METH_O, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_33save_labels_and_tags}, +- {"load_labels_and_tags", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_36load_labels_and_tags, METH_O, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_35load_labels_and_tags}, +- {"load", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_38load, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_37load}, +- {"NodeGraphLabels", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_40NodeGraphLabels, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_39NodeGraphLabels}, +- {"CountGraphLabels", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_42CountGraphLabels, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_41CountGraphLabels}, +- {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_44__reduce_cython__, METH_NOARGS, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_43__reduce_cython__}, +- {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_46__setstate_cython__, METH_O, __pyx_doc_5khmer_5_oxli_8labeling_11GraphLabels_45__setstate_cython__}, ++ {"add_tag", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_26add_tag, METH_O, 0}, ++ {"link_tag_and_label", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_28link_tag_and_label, METH_VARARGS|METH_KEYWORDS, 0}, ++ {"label_across_high_degree_nodes", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_30label_across_high_degree_nodes, METH_VARARGS|METH_KEYWORDS, 0}, ++ {"assemble_labeled_path", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_32assemble_labeled_path, METH_VARARGS|METH_KEYWORDS, 0}, ++ {"save_labels_and_tags", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_34save_labels_and_tags, METH_O, 0}, ++ {"load_labels_and_tags", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_36load_labels_and_tags, METH_O, 0}, ++ {"load", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_38load, METH_VARARGS|METH_KEYWORDS, 0}, ++ {"NodeGraphLabels", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_40NodeGraphLabels, METH_VARARGS|METH_KEYWORDS, 0}, ++ {"CountGraphLabels", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_42CountGraphLabels, METH_VARARGS|METH_KEYWORDS, 0}, ++ {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_44__reduce_cython__, METH_NOARGS, 0}, ++ {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_8labeling_11GraphLabels_46__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} + }; + + static struct PyGetSetDef __pyx_getsets_5khmer_5_oxli_8labeling_GraphLabels[] = { + {(char *)"_default_sweep_radius", __pyx_getprop_5khmer_5_oxli_8labeling_11GraphLabels__default_sweep_radius, 0, (char *)0, 0}, + {(char *)"n_labels", __pyx_getprop_5khmer_5_oxli_8labeling_11GraphLabels_n_labels, 0, (char *)0, 0}, +- {(char *)"graph", __pyx_getprop_5khmer_5_oxli_8labeling_11GraphLabels_graph, __pyx_setprop_5khmer_5_oxli_8labeling_11GraphLabels_graph, (char *)"graph: khmer._oxli.graphs.Hashgraph", 0}, ++ {(char *)"graph", __pyx_getprop_5khmer_5_oxli_8labeling_11GraphLabels_graph, __pyx_setprop_5khmer_5_oxli_8labeling_11GraphLabels_graph, (char *)0, 0}, + {0, 0, 0, 0, 0} + }; + +@@ -6262,7 +6593,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_8labeling_GraphLabels = { + sizeof(struct __pyx_obj_5khmer_5_oxli_8labeling_GraphLabels), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_8labeling_GraphLabels, /*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 +@@ -6312,6 +6648,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_8labeling_GraphLabels = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct__sweep_label_neighborhood *__pyx_freelist_5khmer_5_oxli_8labeling___pyx_scope_struct__sweep_label_neighborhood[8]; +@@ -6370,7 +6715,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct__sweep + sizeof(struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct__sweep_label_neighborhood), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_8labeling___pyx_scope_struct__sweep_label_neighborhood, /*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 +@@ -6420,6 +6770,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct__sweep + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct_1_get_tag_labels *__pyx_freelist_5khmer_5_oxli_8labeling___pyx_scope_struct_1_get_tag_labels[8]; +@@ -6475,7 +6834,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_1_get_ + sizeof(struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct_1_get_tag_labels), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_8labeling___pyx_scope_struct_1_get_tag_labels, /*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 +@@ -6525,6 +6889,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_1_get_ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct_2_get_labels_for_sequence *__pyx_freelist_5khmer_5_oxli_8labeling___pyx_scope_struct_2_get_labels_for_sequence[8]; +@@ -6579,7 +6952,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_2_get_ + sizeof(struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct_2_get_labels_for_sequence), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_8labeling___pyx_scope_struct_2_get_labels_for_sequence, /*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 +@@ -6629,6 +7007,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_2_get_ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct_3_labels *__pyx_freelist_5khmer_5_oxli_8labeling___pyx_scope_struct_3_labels[8]; +@@ -6678,7 +7065,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_3_labe + sizeof(struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct_3_labels), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_8labeling___pyx_scope_struct_3_labels, /*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 +@@ -6728,6 +7120,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_3_labe + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct_4_tags *__pyx_freelist_5khmer_5_oxli_8labeling___pyx_scope_struct_4_tags[8]; +@@ -6777,7 +7178,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_4_tags + sizeof(struct __pyx_obj_5khmer_5_oxli_8labeling___pyx_scope_struct_4_tags), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_8labeling___pyx_scope_struct_4_tags, /*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 +@@ -6827,6 +7233,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_4_tags + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static PyMethodDef __pyx_methods[] = { +@@ -7051,10 +7466,15 @@ static int __Pyx_modinit_function_export_code(void) { + + 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 ---*/ + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_8labeling_GraphLabels) < 0) __PYX_ERR(0, 10, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_8labeling_GraphLabels.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_8labeling_GraphLabels.tp_dictoffset && __pyx_type_5khmer_5_oxli_8labeling_GraphLabels.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_8labeling_GraphLabels.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -7062,31 +7482,41 @@ static int __Pyx_modinit_type_init_code(void) { + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_5khmer_5_oxli_8labeling_GraphLabels) < 0) __PYX_ERR(0, 10, __pyx_L1_error) + __pyx_ptype_5khmer_5_oxli_8labeling_GraphLabels = &__pyx_type_5khmer_5_oxli_8labeling_GraphLabels; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct__sweep_label_neighborhood) < 0) __PYX_ERR(0, 29, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct__sweep_label_neighborhood.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct__sweep_label_neighborhood.tp_dictoffset && __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct__sweep_label_neighborhood.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct__sweep_label_neighborhood.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } + __pyx_ptype_5khmer_5_oxli_8labeling___pyx_scope_struct__sweep_label_neighborhood = &__pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct__sweep_label_neighborhood; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_1_get_tag_labels) < 0) __PYX_ERR(0, 75, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_1_get_tag_labels.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_1_get_tag_labels.tp_dictoffset && __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_1_get_tag_labels.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_1_get_tag_labels.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } + __pyx_ptype_5khmer_5_oxli_8labeling___pyx_scope_struct_1_get_tag_labels = &__pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_1_get_tag_labels; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_2_get_labels_for_sequence) < 0) __PYX_ERR(0, 83, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_2_get_labels_for_sequence.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_2_get_labels_for_sequence.tp_dictoffset && __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_2_get_labels_for_sequence.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_2_get_labels_for_sequence.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } + __pyx_ptype_5khmer_5_oxli_8labeling___pyx_scope_struct_2_get_labels_for_sequence = &__pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_2_get_labels_for_sequence; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_3_labels) < 0) __PYX_ERR(0, 104, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_3_labels.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_3_labels.tp_dictoffset && __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_3_labels.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_3_labels.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } + __pyx_ptype_5khmer_5_oxli_8labeling___pyx_scope_struct_3_labels = &__pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_3_labels; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_4_tags) < 0) __PYX_ERR(0, 109, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_4_tags.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_4_tags.tp_dictoffset && __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_4_tags.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_8labeling___pyx_scope_struct_4_tags.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } +@@ -7101,6 +7531,9 @@ static int __Pyx_modinit_type_init_code(void) { + 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("khmer._oxli.hashing"); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 62, __pyx_L1_error) +@@ -7198,11 +7631,15 @@ static int __Pyx_modinit_variable_import_code(void) { + static int __Pyx_modinit_function_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_function_import_code", 0); + /*--- Function import code ---*/ + __pyx_t_1 = PyImport_ImportModule("khmer._oxli.utils"); if (!__pyx_t_1) __PYX_ERR(0, 1, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_1); + if (__Pyx_ImportFunction(__pyx_t_1, "_bstring", (void (**)(void))&__pyx_f_5khmer_5_oxli_5utils__bstring, "PyObject *(PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) +- Py_DECREF(__pyx_t_1); __pyx_t_1 = 0; ++ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; +@@ -7212,17 +7649,19 @@ static int __Pyx_modinit_function_import_code(void) { + } + + +-#if PY_MAJOR_VERSION < 3 +-#ifdef CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC void +-#else ++#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 CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC PyObject * ++#ifdef __cplusplus ++#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * + #else +-#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC ++#define __Pyx_PyMODINIT_FUNC PyObject * + #endif + #endif + +@@ -7305,6 +7744,9 @@ static CYTHON_SMALL_CODE int __pyx_pymod_exec_labeling(PyObject *__pyx_pyinit_mo + { + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { +@@ -7352,11 +7794,9 @@ if (!__Pyx_RefNanny) { + #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? */ ++ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif +- #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; +@@ -7372,10 +7812,9 @@ if (!__Pyx_RefNanny) { + __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) +- __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) +- #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); +- #endif ++ __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) +@@ -7401,10 +7840,10 @@ if (!__Pyx_RefNanny) { + (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)) goto __pyx_L1_error; +- if (unlikely(__Pyx_modinit_type_import_code() != 0)) goto __pyx_L1_error; ++ 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(); +- if (unlikely(__Pyx_modinit_function_import_code() != 0)) goto __pyx_L1_error; ++ if (unlikely(__Pyx_modinit_function_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) +@@ -7422,7 +7861,7 @@ if (!__Pyx_RefNanny) { + __Pyx_INCREF(__pyx_n_s_get_n_primes_near_x); + __Pyx_GIVEREF(__pyx_n_s_get_n_primes_near_x); + PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_get_n_primes_near_x); +- __pyx_t_2 = __Pyx_Import(__pyx_n_s_khmer__oxli_utils, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 7, __pyx_L1_error) ++ __pyx_t_2 = __Pyx_Import(__pyx_n_s_khmer__oxli_utils, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 7, __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_get_n_primes_near_x); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 7, __pyx_L1_error) +@@ -7653,7 +8092,7 @@ static int __Pyx_ParseOptionalKeywords( + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 +- if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { ++ if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { +@@ -7680,7 +8119,7 @@ static int __Pyx_ParseOptionalKeywords( + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -7696,7 +8135,7 @@ static int __Pyx_ParseOptionalKeywords( + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -7782,7 +8221,9 @@ static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *nam + + /* PyIntBinop */ + #if !CYTHON_COMPILING_IN_PYPY +-static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED int inplace) { ++static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, int inplace, int zerodivision_check) { ++ (void)inplace; ++ (void)zerodivision_check; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(op1))) { + const long b = intval; +@@ -7933,7 +8374,7 @@ static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args + return result; + } + #if 1 || PY_VERSION_HEX < 0x030600B1 +-static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs) { ++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); +@@ -8004,12 +8445,12 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + } + #if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); + #else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); + #endif +@@ -8025,7 +8466,7 @@ done: + #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; ++ ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) +@@ -8128,7 +8569,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec + 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) { ++ } else if (__Pyx_PyFastCFunction_Check(func)) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); + #endif + } +@@ -8369,6 +8810,32 @@ bad: + } + #endif + ++/* 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) +@@ -8467,73 +8934,148 @@ static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_nam + } + #endif + +-/* 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; ++/* 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; icurexc_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 ++ ++/* 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_getstate = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; ++ PyObject *getstate = NULL; + #if CYTHON_USE_PYTYPE_LOOKUP +- if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto GOOD; ++ getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); + #else +- if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto GOOD; ++ getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); ++ if (!getstate && PyErr_Occurred()) { ++ goto __PYX_BAD; ++ } + #endif ++ if (getstate) { + #if CYTHON_USE_PYTYPE_LOOKUP +- object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; ++ object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); + #else +- object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; ++ object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); ++ if (!object_getstate && PyErr_Occurred()) { ++ goto __PYX_BAD; ++ } + #endif +- reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto BAD; ++ if (object_getstate != getstate) { ++ goto __PYX_GOOD; ++ } ++ } ++#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 BAD; ++ 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 BAD; ++ 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 BAD; ++ 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_GetAttrStr(type_obj, __pyx_n_s_reduce_cython); if (unlikely(!reduce_cython)) goto BAD; +- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto BAD; +- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto BAD; ++ 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_GetAttrStr(type_obj, __pyx_n_s_setstate_cython); if (unlikely(!setstate_cython)) goto BAD; +- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto BAD; +- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto BAD; ++ 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 GOOD; +-BAD: ++ 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; +-GOOD: ++__PYX_GOOD: + #if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); ++ Py_XDECREF(object_getstate); ++ Py_XDECREF(getstate); + #endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); +@@ -8654,7 +9196,7 @@ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { +- if (strchr(__Pyx_MODULE_NAME, '.')) { ++ if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) { + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, 1); + if (!module) { +@@ -8703,31 +9245,6 @@ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + return value; + } + +-/* 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; icurexc_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 +- + /* GetNameInClass */ + static PyObject *__Pyx_GetGlobalNameAfterAttributeLookup(PyObject *name) { + PyObject *result; +@@ -8750,7 +9267,7 @@ static PyObject *__Pyx__GetNameInClass(PyObject *nmspace, PyObject *name) { + + /* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +-static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { ++static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; + #if CYTHON_COMPILING_IN_CPYTHON +@@ -8780,7 +9297,7 @@ static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + } + if (!use_cline) { + c_line = 0; +- PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); ++ (void) 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; +@@ -8854,7 +9371,7 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + 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)); ++ __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } +@@ -8874,33 +9391,40 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + #include "compile.h" + #include "frameobject.h" + #include "traceback.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + 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; ++ PyCodeObject *py_code = NULL; ++ PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 ++ PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); +- #else +- py_srcfile = PyUnicode_FromString(filename); +- #endif + if (!py_srcfile) goto bad; ++ #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; ++ funcname = PyUnicode_AsUTF8(py_funcname); ++ if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); +- #else +- py_funcname = PyUnicode_FromString(funcname); ++ if (!py_funcname) goto bad; + #endif + } +- if (!py_funcname) goto bad; ++ #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, +@@ -8919,11 +9443,16 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); +- Py_DECREF(py_funcname); ++ #else ++ py_code = PyCode_NewEmpty(filename, funcname, py_line); ++ #endif ++ Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline + return py_code; + bad: +- Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); ++ #if PY_MAJOR_VERSION < 3 ++ Py_XDECREF(py_srcfile); ++ #endif + return NULL; + } + static void __Pyx_AddTraceback(const char *funcname, int c_line, +@@ -8931,14 +9460,24 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; ++ PyObject *ptype, *pvalue, *ptraceback; + 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) { ++ __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); +- if (!py_code) goto bad; ++ if (!py_code) { ++ /* If the code object creation fails, then we should clear the ++ fetched exception references and propagate the new exception */ ++ Py_XDECREF(ptype); ++ Py_XDECREF(pvalue); ++ Py_XDECREF(ptraceback); ++ goto bad; ++ } ++ __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( +@@ -8977,164 +9516,16 @@ bad: + return (target_type) value;\ + } + +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value) { +- const unsigned int neg_one = (unsigned int) ((unsigned int) 0 - (unsigned int) 1), const_zero = (unsigned int) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(unsigned int) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(unsigned int) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif +- } +- } else { +- if (sizeof(unsigned int) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned 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(unsigned int), +- little, !is_unsigned); +- } +-} +- +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_PY_LONG_LONG(unsigned PY_LONG_LONG value) { +- const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG) ((unsigned PY_LONG_LONG) 0 - (unsigned PY_LONG_LONG) 1), const_zero = (unsigned PY_LONG_LONG) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(unsigned PY_LONG_LONG) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif +- } +- } else { +- if (sizeof(unsigned PY_LONG_LONG) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned PY_LONG_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(unsigned PY_LONG_LONG), +- little, !is_unsigned); +- } +-} +- +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_Label(oxli::Label value) { +- const oxli::Label neg_one = (oxli::Label) ((oxli::Label) 0 - (oxli::Label) 1), const_zero = (oxli::Label) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(oxli::Label) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(oxli::Label) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::Label) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif +- } +- } else { +- if (sizeof(oxli::Label) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::Label) <= 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(oxli::Label), +- little, !is_unsigned); +- } +-} +- +-/* 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_uint64_t(uint64_t value) { +- 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 (is_unsigned) { +- if (sizeof(uint64_t) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(uint64_t) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(uint64_t) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif +- } +- } else { +- if (sizeof(uint64_t) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(uint64_t) <= 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(uint64_t), +- little, !is_unsigned); +- } +-} +- + /* CIntFromPy */ + static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_As_unsigned_PY_LONG_LONG(PyObject *x) { +- const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG) ((unsigned PY_LONG_LONG) 0 - (unsigned PY_LONG_LONG) 1), const_zero = (unsigned PY_LONG_LONG) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG) -1, const_zero = (unsigned PY_LONG_LONG) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -9323,7 +9714,14 @@ raise_neg_overflow: + + /* CIntFromPy */ + static CYTHON_INLINE oxli::Label __Pyx_PyInt_As_oxli_3a__3a_Label(PyObject *x) { +- const oxli::Label neg_one = (oxli::Label) ((oxli::Label) 0 - (oxli::Label) 1), const_zero = (oxli::Label) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::Label neg_one = (oxli::Label) -1, const_zero = (oxli::Label) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -9512,7 +9910,14 @@ raise_neg_overflow: + + /* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +- const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const int neg_one = (int) -1, const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -9701,7 +10106,14 @@ raise_neg_overflow: + + /* 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; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const uint64_t neg_one = (uint64_t) -1, const_zero = (uint64_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -9888,9 +10300,92 @@ raise_neg_overflow: + return (uint64_t) -1; + } + ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const unsigned int neg_one = (unsigned int) -1, const_zero = (unsigned int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(unsigned int) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(unsigned int) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(unsigned int) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(unsigned 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(unsigned int), ++ little, !is_unsigned); ++ } ++} ++ ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_PY_LONG_LONG(unsigned PY_LONG_LONG value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG) -1, const_zero = (unsigned PY_LONG_LONG) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(unsigned PY_LONG_LONG) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(unsigned PY_LONG_LONG) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(unsigned PY_LONG_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(unsigned PY_LONG_LONG), ++ little, !is_unsigned); ++ } ++} ++ + /* CIntFromPy */ + static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *x) { +- const unsigned int neg_one = (unsigned int) ((unsigned int) 0 - (unsigned int) 1), const_zero = (unsigned int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const unsigned int neg_one = (unsigned int) -1, const_zero = (unsigned int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -10077,9 +10572,130 @@ raise_neg_overflow: + return (unsigned int) -1; + } + ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_Label(oxli::Label value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::Label neg_one = (oxli::Label) -1, const_zero = (oxli::Label) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(oxli::Label) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(oxli::Label) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::Label) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(oxli::Label) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::Label) <= 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(oxli::Label), ++ little, !is_unsigned); ++ } ++} ++ ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const int neg_one = (int) -1, const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ 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_uint64_t(uint64_t value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const uint64_t neg_one = (uint64_t) -1, const_zero = (uint64_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(uint64_t) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(uint64_t) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(uint64_t) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(uint64_t) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(uint64_t) <= 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(uint64_t), ++ 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; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { +@@ -10110,7 +10726,14 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + + /* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -10673,6 +11296,12 @@ static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name + /* CoroutineBase */ + #include + #include ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + #define __Pyx_Coroutine_Undelegate(gen) Py_CLEAR((gen)->yieldfrom) + static int __Pyx_PyGen__FetchStopIterationValue(CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject **pvalue) { + PyObject *et, *ev, *tb; +@@ -10844,9 +11473,13 @@ PyObject *__Pyx_Coroutine_SendEx(__pyx_CoroutineObject *self, PyObject *value, i + if (exc_state->exc_traceback) { + PyTracebackObject *tb = (PyTracebackObject *) exc_state->exc_traceback; + PyFrameObject *f = tb->tb_frame; +- Py_XINCREF(tstate->frame); + assert(f->f_back == NULL); ++ #if PY_VERSION_HEX >= 0x030B00A1 ++ f->f_back = PyThreadState_GetFrame(tstate); ++ #else ++ Py_XINCREF(tstate->frame); + f->f_back = tstate->frame; ++ #endif + } + #endif + } +@@ -10899,6 +11532,30 @@ PyObject *__Pyx_Coroutine_MethodReturn(CYTHON_UNUSED PyObject* gen, PyObject *re + } + return retval; + } ++#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) ++static CYTHON_INLINE ++PyObject *__Pyx_PyGen_Send(PyGenObject *gen, PyObject *arg) { ++#if PY_VERSION_HEX <= 0x030A00A1 ++ return _PyGen_Send(gen, arg); ++#else ++ PyObject *result; ++ if (PyIter_Send((PyObject*)gen, arg ? arg : Py_None, &result) == PYGEN_RETURN) { ++ if (PyAsyncGen_CheckExact(gen)) { ++ assert(result == Py_None); ++ PyErr_SetNone(PyExc_StopAsyncIteration); ++ } ++ else if (result == Py_None) { ++ PyErr_SetNone(PyExc_StopIteration); ++ } ++ else { ++ _PyGen_SetStopIterationValue(result); ++ } ++ Py_CLEAR(result); ++ } ++ return result; ++#endif ++} ++#endif + static CYTHON_INLINE + PyObject *__Pyx_Coroutine_FinishDelegation(__pyx_CoroutineObject *gen) { + PyObject *ret; +@@ -10935,12 +11592,12 @@ static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) { + #endif + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) + if (PyGen_CheckExact(yf)) { +- ret = _PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); ++ ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); + } else + #endif + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03050000 && defined(PyCoro_CheckExact) && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) + if (PyCoro_CheckExact(yf)) { +- ret = _PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); ++ ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); + } else + #endif + { +@@ -11024,7 +11681,7 @@ static PyObject *__Pyx_Generator_Next(PyObject *self) { + #endif + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) + if (PyGen_CheckExact(yf)) { +- ret = _PyGen_Send((PyGenObject*)yf, NULL); ++ ret = __Pyx_PyGen_Send((PyGenObject*)yf, NULL); + } else + #endif + #ifdef __Pyx_Coroutine_USED +@@ -11184,6 +11841,7 @@ static int __Pyx_Coroutine_clear(PyObject *self) { + } + #endif + Py_CLEAR(gen->gi_code); ++ Py_CLEAR(gen->gi_frame); + Py_CLEAR(gen->gi_name); + Py_CLEAR(gen->gi_qualname); + Py_CLEAR(gen->gi_modulename); +@@ -11200,7 +11858,7 @@ static void __Pyx_Coroutine_dealloc(PyObject *self) { + if (PyObject_CallFinalizerFromDealloc(self)) + #else + Py_TYPE(gen)->tp_del(self); +- if (self->ob_refcnt > 0) ++ if (Py_REFCNT(self) > 0) + #endif + { + return; +@@ -11227,7 +11885,7 @@ static void __Pyx_Coroutine_del(PyObject *self) { + } + #if !CYTHON_USE_TP_FINALIZE + assert(self->ob_refcnt == 0); +- self->ob_refcnt = 1; ++ __Pyx_SET_REFCNT(self, 1); + #endif + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&error_type, &error_value, &error_traceback); +@@ -11294,17 +11952,17 @@ static void __Pyx_Coroutine_del(PyObject *self) { + } + __Pyx_ErrRestore(error_type, error_value, error_traceback); + #if !CYTHON_USE_TP_FINALIZE +- assert(self->ob_refcnt > 0); ++ assert(Py_REFCNT(self) > 0); + if (--self->ob_refcnt == 0) { + return; + } + { +- Py_ssize_t refcnt = self->ob_refcnt; ++ Py_ssize_t refcnt = Py_REFCNT(self); + _Py_NewReference(self); +- self->ob_refcnt = refcnt; ++ __Pyx_SET_REFCNT(self, refcnt); + } + #if CYTHON_COMPILING_IN_CPYTHON +- assert(PyType_IS_GC(self->ob_type) && ++ assert(PyType_IS_GC(Py_TYPE(self)) && + _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED); + _Py_DEC_REFTOTAL; + #endif +@@ -11370,6 +12028,27 @@ __Pyx_Coroutine_set_qualname(__pyx_CoroutineObject *self, PyObject *value, CYTHO + Py_XDECREF(tmp); + return 0; + } ++static PyObject * ++__Pyx_Coroutine_get_frame(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context) ++{ ++ PyObject *frame = self->gi_frame; ++ if (!frame) { ++ if (unlikely(!self->gi_code)) { ++ Py_RETURN_NONE; ++ } ++ frame = (PyObject *) PyFrame_New( ++ PyThreadState_Get(), /*PyThreadState *tstate,*/ ++ (PyCodeObject*) self->gi_code, /*PyCodeObject *code,*/ ++ __pyx_d, /*PyObject *globals,*/ ++ 0 /*PyObject *locals*/ ++ ); ++ if (unlikely(!frame)) ++ return NULL; ++ self->gi_frame = frame; ++ } ++ Py_INCREF(frame); ++ return frame; ++} + static __pyx_CoroutineObject *__Pyx__Coroutine_New( + PyTypeObject* type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, + PyObject *name, PyObject *qualname, PyObject *module_name) { +@@ -11403,6 +12082,7 @@ static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit( + gen->gi_modulename = module_name; + Py_XINCREF(code); + gen->gi_code = code; ++ gen->gi_frame = NULL; + PyObject_GC_Track(gen); + return gen; + } +@@ -11526,6 +12206,8 @@ static PyGetSetDef __pyx_Generator_getsets[] = { + (char*) PyDoc_STR("name of the generator"), 0}, + {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname, + (char*) PyDoc_STR("qualified name of the generator"), 0}, ++ {(char *) "gi_frame", (getter)__Pyx_Coroutine_get_frame, NULL, ++ (char*) PyDoc_STR("Frame of the generator"), 0}, + {0, 0, 0, 0, 0} + }; + static PyTypeObject __pyx_GeneratorType_type = { +@@ -11585,6 +12267,15 @@ static PyTypeObject __pyx_GeneratorType_type = { + #elif PY_VERSION_HEX >= 0x030400a1 + 0, + #endif ++#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, ++#endif ++#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, ++#endif ++#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, ++#endif + }; + static int __pyx_Generator_init(void) { + __pyx_GeneratorType_type.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; +@@ -11598,11 +12289,33 @@ static int __pyx_Generator_init(void) { + + /* 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 ctversion[5]; ++ int same=1, i, found_dot; ++ const char* rt_from_call = Py_GetVersion(); ++ PyOS_snprintf(ctversion, 5, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); ++ found_dot = 0; ++ for (i = 0; i < 4; i++) { ++ if (!ctversion[i]) { ++ same = (rt_from_call[i] < '0' || rt_from_call[i] > '9'); ++ break; ++ } ++ if (rt_from_call[i] != ctversion[i]) { ++ same = 0; ++ break; ++ } ++ } ++ if (!same) { ++ char rtversion[5] = {'\0'}; + char message[200]; ++ for (i=0; i<4; ++i) { ++ if (rt_from_call[i] == '.') { ++ if (found_dot) break; ++ found_dot = 1; ++ } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') { ++ break; ++ } ++ rtversion[i] = rt_from_call[i]; ++ } + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", +@@ -11914,6 +12627,23 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_DECREF(x); + return ival; + } ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { ++ if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { ++ return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); ++#if PY_MAJOR_VERSION < 3 ++ } else if (likely(PyInt_CheckExact(o))) { ++ return PyInt_AS_LONG(o); ++#endif ++ } else { ++ Py_ssize_t ival; ++ PyObject *x; ++ x = PyNumber_Index(o); ++ if (!x) return -1; ++ ival = PyInt_AsLong(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); + } +diff --git a/khmer/_oxli/legacy_partitioning.cpp b/khmer/_oxli/legacy_partitioning.cpp +index 2e3638f6..ebb202d1 100644 +--- a/khmer/_oxli/legacy_partitioning.cpp ++++ b/khmer/_oxli/legacy_partitioning.cpp +@@ -1,15 +1,17 @@ +-/* Generated by Cython 0.29.2 */ ++/* Generated by Cython 0.29.32 */ + ++#ifndef PY_SSIZE_T_CLEAN + #define PY_SSIZE_T_CLEAN ++#endif /* 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_2" +-#define CYTHON_HEX_VERSION 0x001D02F0 +-#define CYTHON_FUTURE_DIVISION 1 ++#define CYTHON_ABI "0_29_32" ++#define CYTHON_HEX_VERSION 0x001D20F0 ++#define CYTHON_FUTURE_DIVISION 0 + #include + #ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +@@ -47,6 +49,7 @@ + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP +@@ -83,10 +86,14 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC (PYPY_VERSION_HEX >= 0x07030900) ++ #endif + #elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -124,10 +131,59 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 ++ #endif ++#elif defined(PY_NOGIL) ++ #define CYTHON_COMPILING_IN_PYPY 0 ++ #define CYTHON_COMPILING_IN_PYSTON 0 ++ #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 1 ++ #ifndef CYTHON_USE_TYPE_SLOTS ++ #define CYTHON_USE_TYPE_SLOTS 1 ++ #endif ++ #undef CYTHON_USE_PYTYPE_LOOKUP ++ #define CYTHON_USE_PYTYPE_LOOKUP 0 ++ #ifndef CYTHON_USE_ASYNC_SLOTS ++ #define CYTHON_USE_ASYNC_SLOTS 1 ++ #endif ++ #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 ++ #ifndef CYTHON_PEP489_MULTI_PHASE_INIT ++ #define CYTHON_PEP489_MULTI_PHASE_INIT 1 ++ #endif ++ #ifndef CYTHON_USE_TP_FINALIZE ++ #define CYTHON_USE_TP_FINALIZE 1 ++ #endif ++ #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 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -155,7 +211,7 @@ + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif +- #if PY_VERSION_HEX < 0x030300F0 ++ #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) +@@ -170,11 +226,14 @@ + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif +- #ifndef CYTHON_FAST_THREAD_STATE ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_FAST_THREAD_STATE ++ #define CYTHON_FAST_THREAD_STATE 0 ++ #elif !defined(CYTHON_FAST_THREAD_STATE) + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL +- #define CYTHON_FAST_PYCALL 1 ++ #define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030A0000) + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) +@@ -185,15 +244,23 @@ + #ifndef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) + #endif +- #ifndef CYTHON_USE_EXC_INFO_STACK ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_USE_EXC_INFO_STACK ++ #define CYTHON_USE_EXC_INFO_STACK 0 ++ #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) + #endif ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 ++ #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" ++ #if PY_MAJOR_VERSION < 3 ++ #include "longintrepr.h" ++ #endif + #undef SHIFT + #undef BASE + #undef MASK +@@ -324,8 +391,72 @@ class __Pyx_FakeReference { + #define __Pyx_DefaultClassType PyClass_Type + #else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" ++ #define __Pyx_DefaultClassType PyType_Type ++#if PY_VERSION_HEX >= 0x030B00A1 ++ static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int k, int l, int s, int f, ++ PyObject *code, PyObject *c, PyObject* n, PyObject *v, ++ PyObject *fv, PyObject *cell, PyObject* fn, ++ PyObject *name, int fline, PyObject *lnos) { ++ PyObject *kwds=NULL, *argcount=NULL, *posonlyargcount=NULL, *kwonlyargcount=NULL; ++ PyObject *nlocals=NULL, *stacksize=NULL, *flags=NULL, *replace=NULL, *call_result=NULL, *empty=NULL; ++ const char *fn_cstr=NULL; ++ const char *name_cstr=NULL; ++ PyCodeObject* co=NULL; ++ PyObject *type, *value, *traceback; ++ PyErr_Fetch(&type, &value, &traceback); ++ if (!(kwds=PyDict_New())) goto end; ++ if (!(argcount=PyLong_FromLong(a))) goto end; ++ if (PyDict_SetItemString(kwds, "co_argcount", argcount) != 0) goto end; ++ if (!(posonlyargcount=PyLong_FromLong(0))) goto end; ++ if (PyDict_SetItemString(kwds, "co_posonlyargcount", posonlyargcount) != 0) goto end; ++ if (!(kwonlyargcount=PyLong_FromLong(k))) goto end; ++ if (PyDict_SetItemString(kwds, "co_kwonlyargcount", kwonlyargcount) != 0) goto end; ++ if (!(nlocals=PyLong_FromLong(l))) goto end; ++ if (PyDict_SetItemString(kwds, "co_nlocals", nlocals) != 0) goto end; ++ if (!(stacksize=PyLong_FromLong(s))) goto end; ++ if (PyDict_SetItemString(kwds, "co_stacksize", stacksize) != 0) goto end; ++ if (!(flags=PyLong_FromLong(f))) goto end; ++ if (PyDict_SetItemString(kwds, "co_flags", flags) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_code", code) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_consts", c) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_names", n) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_varnames", v) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_freevars", fv) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_cellvars", cell) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_linetable", lnos) != 0) goto end; ++ if (!(fn_cstr=PyUnicode_AsUTF8AndSize(fn, NULL))) goto end; ++ if (!(name_cstr=PyUnicode_AsUTF8AndSize(name, NULL))) goto end; ++ if (!(co = PyCode_NewEmpty(fn_cstr, name_cstr, fline))) goto end; ++ if (!(replace = PyObject_GetAttrString((PyObject*)co, "replace"))) goto cleanup_code_too; ++ if (!(empty = PyTuple_New(0))) goto cleanup_code_too; // unfortunately __pyx_empty_tuple isn't available here ++ if (!(call_result = PyObject_Call(replace, empty, kwds))) goto cleanup_code_too; ++ Py_XDECREF((PyObject*)co); ++ co = (PyCodeObject*)call_result; ++ call_result = NULL; ++ if (0) { ++ cleanup_code_too: ++ Py_XDECREF((PyObject*)co); ++ co = NULL; ++ } ++ end: ++ Py_XDECREF(kwds); ++ Py_XDECREF(argcount); ++ Py_XDECREF(posonlyargcount); ++ Py_XDECREF(kwonlyargcount); ++ Py_XDECREF(nlocals); ++ Py_XDECREF(stacksize); ++ Py_XDECREF(replace); ++ Py_XDECREF(call_result); ++ Py_XDECREF(empty); ++ if (type) { ++ PyErr_Restore(type, value, traceback); ++ } ++ return co; ++ } ++#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 +@@ -360,26 +491,6 @@ class __Pyx_FakeReference { + #else + #define __Pyx_PyFastCFunction_Check(func) 0 + #endif +-#if CYTHON_USE_DICT_VERSIONS +-#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);\ +- }\ +- } +-#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 + #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) +@@ -412,7 +523,7 @@ class __Pyx_FakeReference { + typedef int Py_tss_t; + static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); +- return 0; // PyThread_create_key reports success always ++ 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)); +@@ -435,7 +546,7 @@ static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); + } +-#endif // TSS (Thread Specific Storage) API ++#endif + #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) + #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) + #else +@@ -455,8 +566,12 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #endif + #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 ++ #if defined(PyUnicode_IS_READY) + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) ++ #else ++ #define __Pyx_PyUnicode_READY(op) (0) ++ #endif + #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) +@@ -464,7 +579,15 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) ++ #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) ++ #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) ++ #endif ++ #else ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) ++ #endif + #else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 +@@ -513,8 +636,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) +@@ -525,6 +650,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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 +@@ -558,13 +690,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong +- #define __Pyx_PyInt_AsHash_t PyInt_AsLong ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t + #else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t +- #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t + #endif + #if PY_MAJOR_VERSION >= 3 +- #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func)) ++ #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 +@@ -586,8 +718,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + } __Pyx_PyAsyncMethodsStruct; + #endif + +-#if defined(WIN32) || defined(MS_WINDOWS) +- #define _USE_MATH_DEFINES ++#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) ++ #if !defined(_USE_MATH_DEFINES) ++ #define _USE_MATH_DEFINES ++ #endif + #endif + #include + #ifdef NAN +@@ -605,11 +739,10 @@ static CYTHON_INLINE float __PYX_NAN() { + #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_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ +-} ++ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + + #ifndef __PYX_EXTERN_C + #ifdef __cplusplus +@@ -623,12 +756,24 @@ static CYTHON_INLINE float __PYX_NAN() { + #define __PYX_HAVE_API__khmer___oxli__legacy_partitioning + /* Early includes */ + #include ++#include + #include "ios" + #include "new" + #include "stdexcept" + #include "typeinfo" +-#include + #include ++ ++ #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600) ++ // move should be defined for these versions of MSVC, but __cplusplus isn't set usefully ++ #include ++ ++ namespace cython_std { ++ template typename std::remove_reference::type&& move(T& t) noexcept { return std::move(t); } ++ template typename std::remove_reference::type&& move(T&& t) noexcept { return std::move(t); } ++ } ++ ++ #endif ++ + #include + #include + #include +@@ -661,10 +806,11 @@ typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* enc + 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_DEFAULT 0 +-#define __PYX_DEFAULT_STRING_ENCODING "utf8" +-#define __Pyx_PyObject_FromString __Pyx_PyUnicode_FromString +-#define __Pyx_PyObject_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize ++#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) (\ +@@ -744,6 +890,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); + (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); ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); + #if CYTHON_ASSUME_SAFE_MACROS + #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) + #else +@@ -1512,7 +1659,7 @@ static PyObject *__Pyx_GetBuiltinName(PyObject *name); + #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, int nargs, PyObject *kwargs); ++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 +@@ -1521,13 +1668,21 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + #ifndef Py_MEMBER_SIZE + #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) + #endif ++#if CYTHON_FAST_PYCALL + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + #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 // CYTHON_FAST_PYCALL + #endif + + /* PyObjectCall.proto */ +@@ -1614,7 +1769,7 @@ static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { + if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); +- Py_SIZE(list) = len+1; ++ __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +@@ -1653,6 +1808,17 @@ static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_nam + /* SetVTable.proto */ + static int __Pyx_SetVtable(PyObject *dict, void *vtable); + ++/* 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 ++ ++/* PyObjectGetAttrStrNoError.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); ++ + /* SetupReduce.proto */ + static int __Pyx_setup_reduce(PyObject* type_obj); + +@@ -1670,12 +1836,30 @@ static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, + /* GetVTable.proto */ + static void* __Pyx_GetVtable(PyObject *dict); + +-/* 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); ++/* 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_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) ++#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 */ +@@ -1732,6 +1916,11 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + /* None.proto */ + #include + ++/* GCCDiagnostics.proto */ ++#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) ++#define __Pyx_HAS_GCC_DIAGNOSTIC ++#endif ++ + /* CppExceptionConversion.proto */ + #ifndef __Pyx_CppExn2PyErr + #include +@@ -1774,6 +1963,9 @@ static void __Pyx_CppExn2PyErr() { + } + #endif + ++/* CIntFromPy.proto */ ++static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *); ++ + /* CIntToPy.proto */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_PY_LONG_LONG(unsigned PY_LONG_LONG value); + +@@ -1783,9 +1975,6 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value) + /* CIntToPy.proto */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_PartitionID(oxli::PartitionID value); + +-/* CIntFromPy.proto */ +-static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *); +- + /* CIntToPy.proto */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +@@ -1969,6 +2158,9 @@ static struct __pyx_obj_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo *__ + struct __pyx_obj_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo *__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("wrap", 0); + + /* "khmer/_oxli/legacy_partitioning.pyx":12 +@@ -2038,6 +2230,9 @@ static struct __pyx_obj_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo *__ + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::shared_ptr __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("create", 0); + + /* "khmer/_oxli/legacy_partitioning.pyx":18 +@@ -2107,7 +2302,6 @@ static struct __pyx_obj_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo *__ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_16PrePartitionInfo_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_19legacy_partitioning_16PrePartitionInfo___reduce_cython__[] = "PrePartitionInfo.__reduce_cython__(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_16PrePartitionInfo_1__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -2123,6 +2317,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_16PrePartitionInfo + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -2162,7 +2359,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_16PrePartitionInfo + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_16PrePartitionInfo_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_19legacy_partitioning_16PrePartitionInfo_2__setstate_cython__[] = "PrePartitionInfo.__setstate_cython__(self, __pyx_state)"; + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_16PrePartitionInfo_3__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -2178,6 +2374,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_16PrePartitionInfo + 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)":4 +@@ -2220,6 +2419,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_16PrePartitionInfo + static int __pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ + static int __pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *__pyx_v_graph = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -2277,6 +2479,9 @@ static int __pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition___cini + int __pyx_t_1; + int __pyx_t_2; + std::shared_ptr __pyx_t_3; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "khmer/_oxli/legacy_partitioning.pyx":26 +@@ -2343,7 +2548,6 @@ static int __pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition___cini + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_3count_partitions(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_2count_partitions[] = "SubsetPartition.count_partitions(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_3count_partitions(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -2363,6 +2567,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("count_partitions", 0); + + /* "khmer/_oxli/legacy_partitioning.pyx":30 +@@ -2447,7 +2654,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_5report_on_partitions(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_4report_on_partitions[] = "SubsetPartition.report_on_partitions(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_5report_on_partitions(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -2498,7 +2704,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_7partition_size_distribution(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_6partition_size_distribution[] = "SubsetPartition.partition_size_distribution(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_7partition_size_distribution(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -2523,6 +2728,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + 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("partition_size_distribution", 0); + + /* "khmer/_oxli/legacy_partitioning.pyx":41 +@@ -2654,9 +2862,11 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_9partition_sizes(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_8partition_sizes[] = "SubsetPartition.partition_sizes(self, unsigned int min_size=0)"; + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_9partition_sizes(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + unsigned int __pyx_v_min_size; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("partition_sizes (wrapper)", 0); +@@ -2726,6 +2936,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("partition_sizes", 0); + + /* "khmer/_oxli/legacy_partitioning.pyx":52 +@@ -2876,8 +3089,10 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_11partition_average_coverages(PyObject *__pyx_v_self, PyObject *__pyx_v_graph); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_10partition_average_coverages[] = "SubsetPartition.partition_average_coverages(self, Countgraph graph)"; + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_11partition_average_coverages(PyObject *__pyx_v_self, PyObject *__pyx_v_graph) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("partition_average_coverages (wrapper)", 0); +@@ -2905,6 +3120,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + 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("partition_average_coverages", 0); + + /* "khmer/_oxli/legacy_partitioning.pyx":64 +@@ -3017,12 +3235,14 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_13save_partitionmap(PyObject *__pyx_v_self, PyObject *__pyx_v_filename); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_12save_partitionmap[] = "SubsetPartition.save_partitionmap(self, unicode filename)"; + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_13save_partitionmap(PyObject *__pyx_v_self, PyObject *__pyx_v_filename) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("save_partitionmap (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyUnicode_Type), 1, "filename", 1))) __PYX_ERR(0, 72, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyString_Type), 1, "filename", 1))) __PYX_ERR(0, 72, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_12save_partitionmap(((struct __pyx_obj_5khmer_5_oxli_19legacy_partitioning_SubsetPartition *)__pyx_v_self), ((PyObject*)__pyx_v_filename)); + + /* function exit code */ +@@ -3040,6 +3260,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("save_partitionmap", 0); + + /* "khmer/_oxli/legacy_partitioning.pyx":73 +@@ -3148,12 +3371,14 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_15load_partitionmap(PyObject *__pyx_v_self, PyObject *__pyx_v_filename); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_14load_partitionmap[] = "SubsetPartition.load_partitionmap(self, unicode filename)"; + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_15load_partitionmap(PyObject *__pyx_v_self, PyObject *__pyx_v_filename) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("load_partitionmap (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyUnicode_Type), 1, "filename", 1))) __PYX_ERR(0, 77, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyString_Type), 1, "filename", 1))) __PYX_ERR(0, 77, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_14load_partitionmap(((struct __pyx_obj_5khmer_5_oxli_19legacy_partitioning_SubsetPartition *)__pyx_v_self), ((PyObject*)__pyx_v_filename)); + + /* function exit code */ +@@ -3171,6 +3396,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("load_partitionmap", 0); + + /* "khmer/_oxli/legacy_partitioning.pyx":78 +@@ -3279,11 +3507,13 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_17load(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_16load[] = "SubsetPartition.load(unicode filename, Hashgraph graph)"; +-static PyMethodDef __pyx_mdef_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_17load = {"load", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_17load, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_16load}; ++static PyMethodDef __pyx_mdef_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_17load = {"load", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_17load, METH_VARARGS|METH_KEYWORDS, 0}; + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_17load(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_filename = 0; + struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *__pyx_v_graph = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("load (wrapper)", 0); +@@ -3333,7 +3563,7 @@ static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyUnicode_Type), 1, "filename", 1))) __PYX_ERR(0, 83, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filename), (&PyString_Type), 1, "filename", 1))) __PYX_ERR(0, 83, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_graph), __pyx_ptype_5khmer_5_oxli_6graphs_Hashgraph, 1, "graph", 0))) __PYX_ERR(0, 83, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_16load(__pyx_v_filename, __pyx_v_graph); + +@@ -3353,6 +3583,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("load", 0); + + /* "khmer/_oxli/legacy_partitioning.pyx":84 +@@ -3436,7 +3669,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_19_validate_partitionmap(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_18_validate_partitionmap[] = "SubsetPartition._validate_partitionmap(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_19_validate_partitionmap(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -3482,7 +3714,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_21__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_20__reduce_cython__[] = "SubsetPartition.__reduce_cython__(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_21__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -3498,6 +3729,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -3537,7 +3771,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_23__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_22__setstate_cython__[] = "SubsetPartition.__setstate_cython__(self, __pyx_state)"; + static PyObject *__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_23__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -3553,6 +3786,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + 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)":4 +@@ -3587,7 +3823,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_ + * + * @cname("__pyx_convert_string_from_py_std__in_string") + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: # <<<<<<<<<<<<<< +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + */ + +@@ -3597,11 +3833,23 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + std::string __pyx_r; + __Pyx_RefNannyDeclarations + char const *__pyx_t_1; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_string_from_py_std__in_string", 0); + ++ /* "string.from_py":14 ++ * @cname("__pyx_convert_string_from_py_std__in_string") ++ * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: ++ * cdef Py_ssize_t length = 0 # <<<<<<<<<<<<<< ++ * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) ++ * return string(data, length) ++ */ ++ __pyx_v_length = 0; ++ + /* "string.from_py":15 + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) # <<<<<<<<<<<<<< + * return string(data, length) + * +@@ -3610,7 +3858,7 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + __pyx_v_data = __pyx_t_1; + + /* "string.from_py":16 +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + * return string(data, length) # <<<<<<<<<<<<<< + * +@@ -3623,7 +3871,7 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + * + * @cname("__pyx_convert_string_from_py_std__in_string") + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: # <<<<<<<<<<<<<< +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + */ + +@@ -3664,8 +3912,8 @@ static void __pyx_tp_dealloc_5khmer_5_oxli_19legacy_partitioning_PrePartitionInf + } + + static PyMethodDef __pyx_methods_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo[] = { +- {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_16PrePartitionInfo_1__reduce_cython__, METH_NOARGS, __pyx_doc_5khmer_5_oxli_19legacy_partitioning_16PrePartitionInfo___reduce_cython__}, +- {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_16PrePartitionInfo_3__setstate_cython__, METH_O, __pyx_doc_5khmer_5_oxli_19legacy_partitioning_16PrePartitionInfo_2__setstate_cython__}, ++ {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_16PrePartitionInfo_1__reduce_cython__, METH_NOARGS, 0}, ++ {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_16PrePartitionInfo_3__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} + }; + +@@ -3675,7 +3923,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_19legacy_partitioning_PrePartitionI + sizeof(struct __pyx_obj_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo, /*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 +@@ -3725,6 +3978,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_19legacy_partitioning_PrePartitionI + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static PyObject *__pyx_tp_new_5khmer_5_oxli_19legacy_partitioning_SubsetPartition(PyTypeObject *t, PyObject *a, PyObject *k) { +@@ -3757,17 +4019,17 @@ static void __pyx_tp_dealloc_5khmer_5_oxli_19legacy_partitioning_SubsetPartition + } + + static PyMethodDef __pyx_methods_5khmer_5_oxli_19legacy_partitioning_SubsetPartition[] = { +- {"count_partitions", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_3count_partitions, METH_NOARGS, __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_2count_partitions}, +- {"report_on_partitions", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_5report_on_partitions, METH_NOARGS, __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_4report_on_partitions}, +- {"partition_size_distribution", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_7partition_size_distribution, METH_NOARGS, __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_6partition_size_distribution}, +- {"partition_sizes", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_9partition_sizes, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_8partition_sizes}, +- {"partition_average_coverages", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_11partition_average_coverages, METH_O, __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_10partition_average_coverages}, +- {"save_partitionmap", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_13save_partitionmap, METH_O, __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_12save_partitionmap}, +- {"load_partitionmap", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_15load_partitionmap, METH_O, __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_14load_partitionmap}, +- {"load", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_17load, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_16load}, +- {"_validate_partitionmap", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_19_validate_partitionmap, METH_NOARGS, __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_18_validate_partitionmap}, +- {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_21__reduce_cython__, METH_NOARGS, __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_20__reduce_cython__}, +- {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_23__setstate_cython__, METH_O, __pyx_doc_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_22__setstate_cython__}, ++ {"count_partitions", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_3count_partitions, METH_NOARGS, 0}, ++ {"report_on_partitions", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_5report_on_partitions, METH_NOARGS, 0}, ++ {"partition_size_distribution", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_7partition_size_distribution, METH_NOARGS, 0}, ++ {"partition_sizes", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_9partition_sizes, METH_VARARGS|METH_KEYWORDS, 0}, ++ {"partition_average_coverages", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_11partition_average_coverages, METH_O, 0}, ++ {"save_partitionmap", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_13save_partitionmap, METH_O, 0}, ++ {"load_partitionmap", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_15load_partitionmap, METH_O, 0}, ++ {"load", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_17load, METH_VARARGS|METH_KEYWORDS, 0}, ++ {"_validate_partitionmap", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_19_validate_partitionmap, METH_NOARGS, 0}, ++ {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_21__reduce_cython__, METH_NOARGS, 0}, ++ {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_19legacy_partitioning_15SubsetPartition_23__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} + }; + +@@ -3777,7 +4039,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_19legacy_partitioning_SubsetPartiti + sizeof(struct __pyx_obj_5khmer_5_oxli_19legacy_partitioning_SubsetPartition), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_19legacy_partitioning_SubsetPartition, /*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 +@@ -3827,6 +4094,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_19legacy_partitioning_SubsetPartiti + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static PyMethodDef __pyx_methods[] = { +@@ -4011,13 +4287,18 @@ static int __Pyx_modinit_function_export_code(void) { + + 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_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo = &__pyx_vtable_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo; + __pyx_vtable_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo.wrap = (struct __pyx_obj_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo *(*)(struct oxli::pre_partition_info *))__pyx_f_5khmer_5_oxli_19legacy_partitioning_16PrePartitionInfo_wrap; + __pyx_vtable_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo.create = (struct __pyx_obj_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo *(*)(oxli::Kmer))__pyx_f_5khmer_5_oxli_19legacy_partitioning_16PrePartitionInfo_create; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo) < 0) __PYX_ERR(0, 8, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo.tp_dictoffset && __pyx_type_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -4026,7 +4307,9 @@ static int __Pyx_modinit_type_init_code(void) { + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo) < 0) __PYX_ERR(0, 8, __pyx_L1_error) + __pyx_ptype_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo = &__pyx_type_5khmer_5_oxli_19legacy_partitioning_PrePartitionInfo; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_19legacy_partitioning_SubsetPartition) < 0) __PYX_ERR(0, 23, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_19legacy_partitioning_SubsetPartition.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_19legacy_partitioning_SubsetPartition.tp_dictoffset && __pyx_type_5khmer_5_oxli_19legacy_partitioning_SubsetPartition.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_19legacy_partitioning_SubsetPartition.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -4043,6 +4326,9 @@ static int __Pyx_modinit_type_init_code(void) { + 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("khmer._oxli.hashing"); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 62, __pyx_L1_error) +@@ -4126,11 +4412,15 @@ static int __Pyx_modinit_variable_import_code(void) { + static int __Pyx_modinit_function_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_function_import_code", 0); + /*--- Function import code ---*/ + __pyx_t_1 = PyImport_ImportModule("khmer._oxli.utils"); if (!__pyx_t_1) __PYX_ERR(0, 1, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_1); + if (__Pyx_ImportFunction(__pyx_t_1, "_bstring", (void (**)(void))&__pyx_f_5khmer_5_oxli_5utils__bstring, "PyObject *(PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) +- Py_DECREF(__pyx_t_1); __pyx_t_1 = 0; ++ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; +@@ -4140,17 +4430,19 @@ static int __Pyx_modinit_function_import_code(void) { + } + + +-#if PY_MAJOR_VERSION < 3 +-#ifdef CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC void +-#else ++#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 CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC PyObject * ++#ifdef __cplusplus ++#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * + #else +-#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC ++#define __Pyx_PyMODINIT_FUNC PyObject * + #endif + #endif + +@@ -4233,6 +4525,9 @@ static CYTHON_SMALL_CODE int __pyx_pymod_exec_legacy_partitioning(PyObject *__py + { + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { +@@ -4280,11 +4575,9 @@ if (!__Pyx_RefNanny) { + #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? */ ++ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif +- #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; +@@ -4300,10 +4593,9 @@ if (!__Pyx_RefNanny) { + __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) +- __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) +- #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); +- #endif ++ __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) +@@ -4329,10 +4621,10 @@ if (!__Pyx_RefNanny) { + (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)) goto __pyx_L1_error; +- if (unlikely(__Pyx_modinit_type_import_code() != 0)) goto __pyx_L1_error; ++ 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(); +- if (unlikely(__Pyx_modinit_function_import_code() != 0)) goto __pyx_L1_error; ++ if (unlikely(__Pyx_modinit_function_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) +@@ -4381,7 +4673,7 @@ if (!__Pyx_RefNanny) { + * + * @cname("__pyx_convert_string_from_py_std__in_string") + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: # <<<<<<<<<<<<<< +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + */ + +@@ -4487,7 +4779,7 @@ static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args + return result; + } + #if 1 || PY_VERSION_HEX < 0x030600B1 +-static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs) { ++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); +@@ -4558,12 +4850,12 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + } + #if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); + #else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); + #endif +@@ -4579,7 +4871,7 @@ done: + #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; ++ ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) +@@ -4856,7 +5148,7 @@ static int __Pyx_ParseOptionalKeywords( + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 +- if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { ++ if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { +@@ -4883,7 +5175,7 @@ static int __Pyx_ParseOptionalKeywords( + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -4899,7 +5191,7 @@ static int __Pyx_ParseOptionalKeywords( + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -5028,7 +5320,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec + 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) { ++ } else if (__Pyx_PyFastCFunction_Check(func)) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); + #endif + } +@@ -5143,6 +5435,53 @@ bad: + return -1; + } + ++/* 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; icurexc_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 ++ ++/* 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; +@@ -5163,53 +5502,81 @@ static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; ++ PyObject *object_getstate = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; ++ PyObject *getstate = NULL; + #if CYTHON_USE_PYTYPE_LOOKUP +- if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto GOOD; ++ getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); + #else +- if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto GOOD; ++ getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); ++ if (!getstate && PyErr_Occurred()) { ++ goto __PYX_BAD; ++ } + #endif ++ if (getstate) { + #if CYTHON_USE_PYTYPE_LOOKUP +- object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; ++ object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); + #else +- object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; ++ object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); ++ if (!object_getstate && PyErr_Occurred()) { ++ goto __PYX_BAD; ++ } + #endif +- reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto BAD; ++ if (object_getstate != getstate) { ++ goto __PYX_GOOD; ++ } ++ } ++#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 BAD; ++ 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 BAD; ++ 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 BAD; ++ 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_GetAttrStr(type_obj, __pyx_n_s_reduce_cython); if (unlikely(!reduce_cython)) goto BAD; +- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto BAD; +- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto BAD; ++ 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_GetAttrStr(type_obj, __pyx_n_s_setstate_cython); if (unlikely(!setstate_cython)) goto BAD; +- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto BAD; +- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto BAD; ++ 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 GOOD; +-BAD: ++ 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; +-GOOD: ++__PYX_GOOD: + #if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); ++ Py_XDECREF(object_getstate); ++ Py_XDECREF(getstate); + #endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); +@@ -5300,28 +5667,29 @@ bad: + return NULL; + } + +-/* 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; itp_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 +- for (i=0; icurexc_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); ++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 + +@@ -5382,7 +5750,7 @@ static PyObject *__Pyx__GetNameInClass(PyObject *nmspace, PyObject *name) { + + /* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +-static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { ++static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; + #if CYTHON_COMPILING_IN_CPYTHON +@@ -5412,7 +5780,7 @@ static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + } + if (!use_cline) { + c_line = 0; +- PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); ++ (void) 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; +@@ -5486,7 +5854,7 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + 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)); ++ __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } +@@ -5506,33 +5874,40 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + #include "compile.h" + #include "frameobject.h" + #include "traceback.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + 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; ++ PyCodeObject *py_code = NULL; ++ PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 ++ PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); +- #else +- py_srcfile = PyUnicode_FromString(filename); +- #endif + if (!py_srcfile) goto bad; ++ #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; ++ funcname = PyUnicode_AsUTF8(py_funcname); ++ if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); +- #else +- py_funcname = PyUnicode_FromString(funcname); ++ if (!py_funcname) goto bad; + #endif + } +- if (!py_funcname) goto bad; ++ #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, +@@ -5551,11 +5926,16 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); +- Py_DECREF(py_funcname); ++ #else ++ py_code = PyCode_NewEmpty(filename, funcname, py_line); ++ #endif ++ Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline + return py_code; + bad: +- Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); ++ #if PY_MAJOR_VERSION < 3 ++ Py_XDECREF(py_srcfile); ++ #endif + return NULL; + } + static void __Pyx_AddTraceback(const char *funcname, int c_line, +@@ -5563,14 +5943,24 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; ++ PyObject *ptype, *pvalue, *ptraceback; + 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) { ++ __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); +- if (!py_code) goto bad; ++ if (!py_code) { ++ /* If the code object creation fails, then we should clear the ++ fetched exception references and propagate the new exception */ ++ Py_XDECREF(ptype); ++ Py_XDECREF(pvalue); ++ Py_XDECREF(ptraceback); ++ goto bad; ++ } ++ __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( +@@ -5609,102 +5999,16 @@ bad: + return (target_type) value;\ + } + +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_PY_LONG_LONG(unsigned PY_LONG_LONG value) { +- const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG) ((unsigned PY_LONG_LONG) 0 - (unsigned PY_LONG_LONG) 1), const_zero = (unsigned PY_LONG_LONG) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(unsigned PY_LONG_LONG) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif +- } +- } else { +- if (sizeof(unsigned PY_LONG_LONG) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned PY_LONG_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(unsigned PY_LONG_LONG), +- little, !is_unsigned); +- } +-} +- +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value) { +- const unsigned int neg_one = (unsigned int) ((unsigned int) 0 - (unsigned int) 1), const_zero = (unsigned int) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(unsigned int) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(unsigned int) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif +- } +- } else { +- if (sizeof(unsigned int) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(unsigned 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(unsigned int), +- little, !is_unsigned); +- } +-} +- +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_PartitionID(oxli::PartitionID value) { +- const oxli::PartitionID neg_one = (oxli::PartitionID) ((oxli::PartitionID) 0 - (oxli::PartitionID) 1), const_zero = (oxli::PartitionID) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(oxli::PartitionID) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(oxli::PartitionID) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::PartitionID) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif +- } +- } else { +- if (sizeof(oxli::PartitionID) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::PartitionID) <= 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(oxli::PartitionID), +- little, !is_unsigned); +- } +-} +- + /* CIntFromPy */ + static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *x) { +- const unsigned int neg_one = (unsigned int) ((unsigned int) 0 - (unsigned int) 1), const_zero = (unsigned int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const unsigned int neg_one = (unsigned int) -1, const_zero = (unsigned int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -5891,9 +6195,130 @@ raise_neg_overflow: + return (unsigned int) -1; + } + ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_PY_LONG_LONG(unsigned PY_LONG_LONG value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG) -1, const_zero = (unsigned PY_LONG_LONG) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(unsigned PY_LONG_LONG) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(unsigned PY_LONG_LONG) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(unsigned PY_LONG_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(unsigned PY_LONG_LONG), ++ little, !is_unsigned); ++ } ++} ++ ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const unsigned int neg_one = (unsigned int) -1, const_zero = (unsigned int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(unsigned int) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(unsigned int) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(unsigned int) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(unsigned 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(unsigned int), ++ little, !is_unsigned); ++ } ++} ++ ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_PartitionID(oxli::PartitionID value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::PartitionID neg_one = (oxli::PartitionID) -1, const_zero = (oxli::PartitionID) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(oxli::PartitionID) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(oxli::PartitionID) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::PartitionID) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(oxli::PartitionID) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::PartitionID) <= 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(oxli::PartitionID), ++ 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; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { +@@ -5924,7 +6349,14 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + + /* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -6113,7 +6545,14 @@ raise_neg_overflow: + + /* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +- const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const int neg_one = (int) -1, const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -6402,11 +6841,33 @@ static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObj + + /* 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 ctversion[5]; ++ int same=1, i, found_dot; ++ const char* rt_from_call = Py_GetVersion(); ++ PyOS_snprintf(ctversion, 5, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); ++ found_dot = 0; ++ for (i = 0; i < 4; i++) { ++ if (!ctversion[i]) { ++ same = (rt_from_call[i] < '0' || rt_from_call[i] > '9'); ++ break; ++ } ++ if (rt_from_call[i] != ctversion[i]) { ++ same = 0; ++ break; ++ } ++ } ++ if (!same) { ++ char rtversion[5] = {'\0'}; + char message[200]; ++ for (i=0; i<4; ++i) { ++ if (rt_from_call[i] == '.') { ++ if (found_dot) break; ++ found_dot = 1; ++ } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') { ++ break; ++ } ++ rtversion[i] = rt_from_call[i]; ++ } + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", +@@ -6718,6 +7179,23 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_DECREF(x); + return ival; + } ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { ++ if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { ++ return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); ++#if PY_MAJOR_VERSION < 3 ++ } else if (likely(PyInt_CheckExact(o))) { ++ return PyInt_AS_LONG(o); ++#endif ++ } else { ++ Py_ssize_t ival; ++ PyObject *x; ++ x = PyNumber_Index(o); ++ if (!x) return -1; ++ ival = PyInt_AsLong(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); + } +diff --git a/khmer/_oxli/parsing.cpp b/khmer/_oxli/parsing.cpp +index 6be564bc..e8c6c550 100644 +--- a/khmer/_oxli/parsing.cpp ++++ b/khmer/_oxli/parsing.cpp +@@ -1,14 +1,16 @@ +-/* Generated by Cython 0.29.2 */ ++/* Generated by Cython 0.29.32 */ + ++#ifndef PY_SSIZE_T_CLEAN + #define PY_SSIZE_T_CLEAN ++#endif /* 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_2" +-#define CYTHON_HEX_VERSION 0x001D02F0 ++#define CYTHON_ABI "0_29_32" ++#define CYTHON_HEX_VERSION 0x001D20F0 + #define CYTHON_FUTURE_DIVISION 1 + #include + #ifndef offsetof +@@ -47,6 +49,7 @@ + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP +@@ -83,10 +86,14 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC (PYPY_VERSION_HEX >= 0x07030900) ++ #endif + #elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -124,10 +131,59 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 ++ #endif ++#elif defined(PY_NOGIL) ++ #define CYTHON_COMPILING_IN_PYPY 0 ++ #define CYTHON_COMPILING_IN_PYSTON 0 ++ #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 1 ++ #ifndef CYTHON_USE_TYPE_SLOTS ++ #define CYTHON_USE_TYPE_SLOTS 1 ++ #endif ++ #undef CYTHON_USE_PYTYPE_LOOKUP ++ #define CYTHON_USE_PYTYPE_LOOKUP 0 ++ #ifndef CYTHON_USE_ASYNC_SLOTS ++ #define CYTHON_USE_ASYNC_SLOTS 1 ++ #endif ++ #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 ++ #ifndef CYTHON_PEP489_MULTI_PHASE_INIT ++ #define CYTHON_PEP489_MULTI_PHASE_INIT 1 ++ #endif ++ #ifndef CYTHON_USE_TP_FINALIZE ++ #define CYTHON_USE_TP_FINALIZE 1 ++ #endif ++ #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 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -155,7 +211,7 @@ + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif +- #if PY_VERSION_HEX < 0x030300F0 ++ #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) +@@ -170,11 +226,14 @@ + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif +- #ifndef CYTHON_FAST_THREAD_STATE ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_FAST_THREAD_STATE ++ #define CYTHON_FAST_THREAD_STATE 0 ++ #elif !defined(CYTHON_FAST_THREAD_STATE) + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL +- #define CYTHON_FAST_PYCALL 1 ++ #define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030A0000) + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) +@@ -185,15 +244,23 @@ + #ifndef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) + #endif +- #ifndef CYTHON_USE_EXC_INFO_STACK ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_USE_EXC_INFO_STACK ++ #define CYTHON_USE_EXC_INFO_STACK 0 ++ #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) + #endif ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 ++ #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" ++ #if PY_MAJOR_VERSION < 3 ++ #include "longintrepr.h" ++ #endif + #undef SHIFT + #undef BASE + #undef MASK +@@ -324,8 +391,72 @@ class __Pyx_FakeReference { + #define __Pyx_DefaultClassType PyClass_Type + #else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" ++ #define __Pyx_DefaultClassType PyType_Type ++#if PY_VERSION_HEX >= 0x030B00A1 ++ static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int k, int l, int s, int f, ++ PyObject *code, PyObject *c, PyObject* n, PyObject *v, ++ PyObject *fv, PyObject *cell, PyObject* fn, ++ PyObject *name, int fline, PyObject *lnos) { ++ PyObject *kwds=NULL, *argcount=NULL, *posonlyargcount=NULL, *kwonlyargcount=NULL; ++ PyObject *nlocals=NULL, *stacksize=NULL, *flags=NULL, *replace=NULL, *call_result=NULL, *empty=NULL; ++ const char *fn_cstr=NULL; ++ const char *name_cstr=NULL; ++ PyCodeObject* co=NULL; ++ PyObject *type, *value, *traceback; ++ PyErr_Fetch(&type, &value, &traceback); ++ if (!(kwds=PyDict_New())) goto end; ++ if (!(argcount=PyLong_FromLong(a))) goto end; ++ if (PyDict_SetItemString(kwds, "co_argcount", argcount) != 0) goto end; ++ if (!(posonlyargcount=PyLong_FromLong(0))) goto end; ++ if (PyDict_SetItemString(kwds, "co_posonlyargcount", posonlyargcount) != 0) goto end; ++ if (!(kwonlyargcount=PyLong_FromLong(k))) goto end; ++ if (PyDict_SetItemString(kwds, "co_kwonlyargcount", kwonlyargcount) != 0) goto end; ++ if (!(nlocals=PyLong_FromLong(l))) goto end; ++ if (PyDict_SetItemString(kwds, "co_nlocals", nlocals) != 0) goto end; ++ if (!(stacksize=PyLong_FromLong(s))) goto end; ++ if (PyDict_SetItemString(kwds, "co_stacksize", stacksize) != 0) goto end; ++ if (!(flags=PyLong_FromLong(f))) goto end; ++ if (PyDict_SetItemString(kwds, "co_flags", flags) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_code", code) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_consts", c) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_names", n) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_varnames", v) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_freevars", fv) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_cellvars", cell) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_linetable", lnos) != 0) goto end; ++ if (!(fn_cstr=PyUnicode_AsUTF8AndSize(fn, NULL))) goto end; ++ if (!(name_cstr=PyUnicode_AsUTF8AndSize(name, NULL))) goto end; ++ if (!(co = PyCode_NewEmpty(fn_cstr, name_cstr, fline))) goto end; ++ if (!(replace = PyObject_GetAttrString((PyObject*)co, "replace"))) goto cleanup_code_too; ++ if (!(empty = PyTuple_New(0))) goto cleanup_code_too; // unfortunately __pyx_empty_tuple isn't available here ++ if (!(call_result = PyObject_Call(replace, empty, kwds))) goto cleanup_code_too; ++ Py_XDECREF((PyObject*)co); ++ co = (PyCodeObject*)call_result; ++ call_result = NULL; ++ if (0) { ++ cleanup_code_too: ++ Py_XDECREF((PyObject*)co); ++ co = NULL; ++ } ++ end: ++ Py_XDECREF(kwds); ++ Py_XDECREF(argcount); ++ Py_XDECREF(posonlyargcount); ++ Py_XDECREF(kwonlyargcount); ++ Py_XDECREF(nlocals); ++ Py_XDECREF(stacksize); ++ Py_XDECREF(replace); ++ Py_XDECREF(call_result); ++ Py_XDECREF(empty); ++ if (type) { ++ PyErr_Restore(type, value, traceback); ++ } ++ return co; ++ } ++#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 +@@ -360,26 +491,6 @@ class __Pyx_FakeReference { + #else + #define __Pyx_PyFastCFunction_Check(func) 0 + #endif +-#if CYTHON_USE_DICT_VERSIONS +-#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);\ +- }\ +- } +-#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 + #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) +@@ -412,7 +523,7 @@ class __Pyx_FakeReference { + typedef int Py_tss_t; + static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); +- return 0; // PyThread_create_key reports success always ++ 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)); +@@ -435,7 +546,7 @@ static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); + } +-#endif // TSS (Thread Specific Storage) API ++#endif + #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) + #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) + #else +@@ -455,8 +566,12 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #endif + #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 ++ #if defined(PyUnicode_IS_READY) + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) ++ #else ++ #define __Pyx_PyUnicode_READY(op) (0) ++ #endif + #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) +@@ -464,7 +579,15 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) ++ #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) ++ #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) ++ #endif ++ #else ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) ++ #endif + #else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 +@@ -513,8 +636,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) +@@ -525,6 +650,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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 +@@ -558,13 +690,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong +- #define __Pyx_PyInt_AsHash_t PyInt_AsLong ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t + #else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t +- #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t + #endif + #if PY_MAJOR_VERSION >= 3 +- #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func)) ++ #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 +@@ -586,8 +718,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + } __Pyx_PyAsyncMethodsStruct; + #endif + +-#if defined(WIN32) || defined(MS_WINDOWS) +- #define _USE_MATH_DEFINES ++#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) ++ #if !defined(_USE_MATH_DEFINES) ++ #define _USE_MATH_DEFINES ++ #endif + #endif + #include + #ifdef NAN +@@ -605,11 +739,10 @@ static CYTHON_INLINE float __PYX_NAN() { + #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_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ +-} ++ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + + #ifndef __PYX_EXTERN_C + #ifdef __cplusplus +@@ -629,6 +762,18 @@ static CYTHON_INLINE float __PYX_NAN() { + #include "typeinfo" + #include + #include ++ ++ #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600) ++ // move should be defined for these versions of MSVC, but __cplusplus isn't set usefully ++ #include ++ ++ namespace cython_std { ++ template typename std::remove_reference::type&& move(T& t) noexcept { return std::move(t); } ++ template typename std::remove_reference::type&& move(T&& t) noexcept { return std::move(t); } ++ } ++ ++ #endif ++ + #include + #include + #include +@@ -651,7 +796,8 @@ typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* enc + 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_DEFAULT 0 ++#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 1 ++#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) + #define __PYX_DEFAULT_STRING_ENCODING "utf8" + #define __Pyx_PyObject_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyObject_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +@@ -734,6 +880,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); + (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); ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); + #if CYTHON_ASSUME_SAFE_MACROS + #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) + #else +@@ -1235,7 +1382,7 @@ static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObje + #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, int nargs, PyObject *kwargs); ++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 +@@ -1244,13 +1391,21 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + #ifndef Py_MEMBER_SIZE + #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) + #endif ++#if CYTHON_FAST_PYCALL + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + #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 // CYTHON_FAST_PYCALL + #endif + + /* PyObjectCall.proto */ +@@ -1329,6 +1484,32 @@ 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) {\ +@@ -1407,7 +1588,7 @@ static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { + if (likely(L->allocated > len)) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); +- Py_SIZE(list) = len+1; ++ __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +@@ -1456,6 +1637,12 @@ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int + static int __Pyx_PyUnicode_Tailmatch( + PyObject* s, PyObject* substr, Py_ssize_t start, Py_ssize_t end, int direction); + ++/* PySequenceContains.proto */ ++static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { ++ int result = PySequence_Contains(seq, item); ++ return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); ++} ++ + /* Import.proto */ + static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +@@ -1479,6 +1666,9 @@ static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_nam + /* 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); + +@@ -1492,7 +1682,7 @@ static PyObject *__Pyx_CalculateMetaclass(PyTypeObject *metaclass, PyObject *bas + /* FetchCommonType.proto */ + static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); + +-/* CythonFunction.proto */ ++/* CythonFunctionShared.proto */ + #define __Pyx_CyFunction_USED 1 + #define __Pyx_CYFUNCTION_STATICMETHOD 0x01 + #define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 +@@ -1520,6 +1710,7 @@ typedef struct { + PyObject *func_classobj; + void *defaults; + int defaults_pyobjects; ++ size_t defaults_size; // used by FusedFunction for copying defaults + int flags; + PyObject *defaults_tuple; + PyObject *defaults_kwdict; +@@ -1528,9 +1719,7 @@ typedef struct { + } __pyx_CyFunctionObject; + static PyTypeObject *__pyx_CyFunctionType = 0; + #define __Pyx_CyFunction_Check(obj) (__Pyx_TypeCheck(obj, __pyx_CyFunctionType)) +-#define __Pyx_CyFunction_NewEx(ml, flags, qualname, self, module, globals, code)\ +- __Pyx_CyFunction_New(__pyx_CyFunctionType, ml, flags, qualname, self, module, globals, code) +-static PyObject *__Pyx_CyFunction_New(PyTypeObject *, PyMethodDef *ml, ++static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, + int flags, PyObject* qualname, + PyObject *self, + PyObject *module, PyObject *globals, +@@ -1546,6 +1735,13 @@ static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, + PyObject *dict); + static int __pyx_CyFunction_init(void); + ++/* CythonFunction.proto */ ++static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, ++ int flags, PyObject* qualname, ++ PyObject *closure, ++ PyObject *module, PyObject *globals, ++ PyObject* code); ++ + /* SetNameInClass.proto */ + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 + #define __Pyx_SetNameInClass(ns, name, value)\ +@@ -1592,8 +1788,10 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + /* None.proto */ + #include + +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); ++/* GCCDiagnostics.proto */ ++#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) ++#define __Pyx_HAS_GCC_DIAGNOSTIC ++#endif + + /* CppExceptionConversion.proto */ + #ifndef __Pyx_CppExn2PyErr +@@ -1638,7 +1836,7 @@ static void __Pyx_CppExn2PyErr() { + #endif + + /* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + + /* CIntFromPy.proto */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); +@@ -1649,6 +1847,9 @@ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + /* CIntFromPy.proto */ + static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *); + ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); ++ + /* FastTypeChecks.proto */ + #if CYTHON_COMPILING_IN_CPYTHON + #define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +@@ -1715,6 +1916,7 @@ typedef struct { + PyObject *gi_qualname; + PyObject *gi_modulename; + PyObject *gi_code; ++ PyObject *gi_frame; + int resume_label; + char is_running; + } __pyx_CoroutineObject; +@@ -1959,7 +2161,7 @@ static const char __pyx_k_SanitizedFastxParser___iter[] = "SanitizedFastxParser. + static const char __pyx_k_force_single_and_require_paired[] = "force_single and require_paired cannot both be set!"; + static const char __pyx_k_records_must_be_same_type_FASTA[] = "records must be same type (FASTA or FASTQ)"; + static const char __pyx_k_Differing_lengths_of_left_and_ri[] = "Differing lengths of left and right files!"; +-static const char __pyx_k_Incompatible_checksums_s_vs_0xd4[] = "Incompatible checksums (%s vs 0xd41d8cd = ())"; ++static const char __pyx_k_Incompatible_checksums_0x_x_vs_0[] = "Incompatible checksums (0x%x vs (0xd41d8cd, 0xe3b0c44, 0xda39a3e) = ())"; + static const char __pyx_k_Uneven_number_of_reads_when_requ[] = "Uneven number of reads when require_paired is set!"; + static const char __pyx_k_Unpaired_reads_when_require_pair[] = "Unpaired reads when require_paired is set!"; + static const char __pyx_k_ValueError_with_refs_to_the_read[] = "ValueError with refs to the read pair in question."; +@@ -1977,7 +2179,7 @@ static PyObject *__pyx_n_u_DNAN_SIMPLE; + static PyObject *__pyx_kp_u_Differing_lengths_of_left_and_ri; + static PyObject *__pyx_n_s_FastxParser; + static PyObject *__pyx_n_s_FastxParser___iter; +-static PyObject *__pyx_kp_s_Incompatible_checksums_s_vs_0xd4; ++static PyObject *__pyx_kp_s_Incompatible_checksums_0x_x_vs_0; + static PyObject *__pyx_kp_u_No_alphabet_with_name_0; + static PyObject *__pyx_n_s_NotImplementedError; + static PyObject *__pyx_kp_u_Operator_not_available; +@@ -2157,6 +2359,8 @@ static PyObject *__pyx_int_0; + static PyObject *__pyx_int_1; + static PyObject *__pyx_int_2; + static PyObject *__pyx_int_222419149; ++static PyObject *__pyx_int_228825662; ++static PyObject *__pyx_int_238750788; + static PyObject *__pyx_int_neg_1; + static PyObject *__pyx_tuple_; + static PyObject *__pyx_tuple__2; +@@ -2177,18 +2381,19 @@ static PyObject *__pyx_tuple__17; + static PyObject *__pyx_tuple__18; + static PyObject *__pyx_tuple__20; + static PyObject *__pyx_tuple__21; +-static PyObject *__pyx_tuple__23; +-static PyObject *__pyx_tuple__25; +-static PyObject *__pyx_tuple__27; ++static PyObject *__pyx_tuple__22; ++static PyObject *__pyx_tuple__24; ++static PyObject *__pyx_tuple__26; + static PyObject *__pyx_tuple__28; +-static PyObject *__pyx_tuple__30; +-static PyObject *__pyx_tuple__32; +-static PyObject *__pyx_codeobj__22; +-static PyObject *__pyx_codeobj__24; +-static PyObject *__pyx_codeobj__26; +-static PyObject *__pyx_codeobj__29; +-static PyObject *__pyx_codeobj__31; +-static PyObject *__pyx_codeobj__33; ++static PyObject *__pyx_tuple__29; ++static PyObject *__pyx_tuple__31; ++static PyObject *__pyx_tuple__33; ++static PyObject *__pyx_codeobj__23; ++static PyObject *__pyx_codeobj__25; ++static PyObject *__pyx_codeobj__27; ++static PyObject *__pyx_codeobj__30; ++static PyObject *__pyx_codeobj__32; ++static PyObject *__pyx_codeobj__34; + /* Late includes */ + + /* "khmer/_oxli/parsing.pyx":17 +@@ -2205,6 +2410,9 @@ static char __pyx_doc_5khmer_5_oxli_7parsing_9Alphabets_get[] = "Alphabets.get(n + static PyMethodDef __pyx_mdef_5khmer_5_oxli_7parsing_9Alphabets_1get = {"get", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_7parsing_9Alphabets_1get, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_7parsing_9Alphabets_get}; + static PyObject *__pyx_pw_5khmer_5_oxli_7parsing_9Alphabets_1get(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_name = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get (wrapper)", 0); +@@ -2261,6 +2469,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_9Alphabets_get(PyObject *__pyx_ + 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("get", 0); + + /* "khmer/_oxli/parsing.pyx":18 +@@ -2380,6 +2591,9 @@ static std::string __pyx_f_5khmer_5_oxli_7parsing_9Alphabets__get(std::string __ + __Pyx_RefNannyDeclarations + int __pyx_t_1; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_get", 0); + + /* "khmer/_oxli/parsing.pyx":25 +@@ -2622,6 +2836,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_9Alphabets_2__reduce_cython__(s + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":5 +@@ -2842,6 +3059,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_9Alphabets_4__setstate_cython__ + 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 +@@ -2890,6 +3110,9 @@ static int __pyx_pw_5khmer_5_oxli_7parsing_8Sequence_1__cinit__(PyObject *__pyx_ + PyObject *__pyx_v_quality = 0; + PyObject *__pyx_v_description = 0; + PyObject *__pyx_v_cleaned_seq = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -3022,6 +3245,9 @@ static int __pyx_pf_5khmer_5_oxli_7parsing_8Sequence___cinit__(struct __pyx_obj_ + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + std::string __pyx_t_5; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "khmer/_oxli/parsing.pyx":48 +@@ -3237,6 +3463,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_8Sequence_2__str__(struct __pyx + 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("__str__", 0); + + /* "khmer/_oxli/parsing.pyx":61 +@@ -3303,6 +3532,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_8Sequence_4__repr__(struct __py + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__repr__", 0); + + /* "khmer/_oxli/parsing.pyx":64 +@@ -3458,6 +3690,9 @@ static Py_ssize_t __pyx_pf_5khmer_5_oxli_7parsing_8Sequence_6__len__(struct __py + static PyObject *__pyx_pw_5khmer_5_oxli_7parsing_8Sequence_9__richcmp__(PyObject *__pyx_v_x, PyObject *__pyx_v_y, int __pyx_arg_op); /*proto*/ + static PyObject *__pyx_pw_5khmer_5_oxli_7parsing_8Sequence_9__richcmp__(PyObject *__pyx_v_x, PyObject *__pyx_v_y, int __pyx_arg_op) { + PyObject *__pyx_v_op = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__richcmp__ (wrapper)", 0); +@@ -3485,6 +3720,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_8Sequence_8__richcmp__(struct _ + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__richcmp__", 0); + + /* "khmer/_oxli/parsing.pyx":70 +@@ -3599,6 +3837,9 @@ static PyObject *__pyx_pw_5khmer_5_oxli_7parsing_8Sequence_11kmers(PyObject *__p + static char __pyx_doc_5khmer_5_oxli_7parsing_8Sequence_10kmers[] = "Sequence.kmers(self, int K)"; + static PyObject *__pyx_pw_5khmer_5_oxli_7parsing_8Sequence_11kmers(PyObject *__pyx_v_self, PyObject *__pyx_arg_K) { + int __pyx_v_K; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("kmers (wrapper)", 0); +@@ -3622,6 +3863,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_8Sequence_10kmers(struct __pyx_ + struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct__kmers *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("kmers", 0); + __pyx_cur_scope = (struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct__kmers *)__pyx_tp_new_5khmer_5_oxli_7parsing___pyx_scope_struct__kmers(__pyx_ptype_5khmer_5_oxli_7parsing___pyx_scope_struct__kmers, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { +@@ -3660,6 +3904,9 @@ static PyObject *__pyx_gb_5khmer_5_oxli_7parsing_8Sequence_12generator(__pyx_Cor + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("kmers", 0); + switch (__pyx_generator->resume_label) { +@@ -3791,6 +4038,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_8Sequence_13__getitem__(struct + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__getitem__", 0); + + /* "khmer/_oxli/parsing.pyx":83 +@@ -3858,6 +4108,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_8Sequence_4name___get__(struct + 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("__get__", 0); + + /* "khmer/_oxli/parsing.pyx":87 +@@ -3943,6 +4196,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_8Sequence_8sequence___get__(str + 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("__get__", 0); + + /* "khmer/_oxli/parsing.pyx":92 +@@ -4027,6 +4283,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_8Sequence_11description___get__ + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "khmer/_oxli/parsing.pyx":97 +@@ -4108,6 +4367,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_8Sequence_7quality___get__(stru + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "khmer/_oxli/parsing.pyx":102 +@@ -4189,6 +4451,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_8Sequence_11cleaned_seq___get__ + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "khmer/_oxli/parsing.pyx":107 +@@ -4257,6 +4522,9 @@ static char __pyx_doc_5khmer_5_oxli_7parsing_8Sequence_15from_screed_record[] = + static PyMethodDef __pyx_mdef_5khmer_5_oxli_7parsing_8Sequence_16from_screed_record = {"from_screed_record", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_7parsing_8Sequence_16from_screed_record, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_7parsing_8Sequence_15from_screed_record}; + static PyObject *__pyx_pw_5khmer_5_oxli_7parsing_8Sequence_16from_screed_record(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_record = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("from_screed_record (wrapper)", 0); +@@ -4315,6 +4583,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_8Sequence_15from_screed_record( + std::string __pyx_t_5; + Py_ssize_t __pyx_t_6; + PyObject *__pyx_t_7 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("from_screed_record", 0); + + /* "khmer/_oxli/parsing.pyx":112 +@@ -4505,6 +4776,9 @@ static struct __pyx_obj_5khmer_5_oxli_7parsing_Sequence *__pyx_f_5khmer_5_oxli_7 + struct __pyx_obj_5khmer_5_oxli_7parsing_Sequence *__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("_wrap", 0); + + /* "khmer/_oxli/parsing.pyx":125 +@@ -4584,6 +4858,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_8Sequence_17__reduce_cython__(C + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -4639,6 +4916,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_8Sequence_19__setstate_cython__ + 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)":4 +@@ -4704,6 +4984,9 @@ static int __pyx_pf_5khmer_5_oxli_7parsing_10ReadBundle___cinit__(struct __pyx_o + Py_ssize_t __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "khmer/_oxli/parsing.pyx":133 +@@ -4795,6 +5078,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_10ReadBundle_9num_reads___get__ + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "khmer/_oxli/parsing.pyx":137 +@@ -4868,6 +5154,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_10ReadBundle_12total_length___g + Py_ssize_t __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + Py_ssize_t __pyx_t_5; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "khmer/_oxli/parsing.pyx":141 +@@ -4966,6 +5255,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_10ReadBundle_2__reduce_cython__ + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -5021,6 +5313,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_10ReadBundle_4__setstate_cython + 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)":4 +@@ -5081,6 +5376,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_print_error(CYTHON_UNUSED PyObj + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("print_error", 0); + + /* "khmer/_oxli/parsing.pyx":147 +@@ -5151,6 +5449,9 @@ static PyObject *__pyx_pw_5khmer_5_oxli_7parsing_18UnpairedReadsError_1__init__( + PyObject *__pyx_v_msg = 0; + PyObject *__pyx_v_r1 = 0; + PyObject *__pyx_v_r2 = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); +@@ -5238,6 +5539,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_18UnpairedReadsError___init__(C + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__init__", 0); + __Pyx_INCREF(__pyx_v_msg); + +@@ -5732,6 +6036,9 @@ static int __pyx_pw_5khmer_5_oxli_7parsing_11FastxParser_1__cinit__(PyObject *__ + PyObject *__pyx_v_filename = 0; + CYTHON_UNUSED PyObject *__pyx_v_args = 0; + CYTHON_UNUSED PyObject *__pyx_v_kwargs = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -5802,6 +6109,9 @@ static int __pyx_pf_5khmer_5_oxli_7parsing_11FastxParser___cinit__(struct __pyx_ + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; + std::shared_ptr > __pyx_t_3; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "khmer/_oxli/parsing.pyx":191 +@@ -5856,6 +6166,9 @@ static struct __pyx_obj_5khmer_5_oxli_7parsing_Sequence *__pyx_f_5khmer_5_oxli_7 + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_next", 0); + + /* "khmer/_oxli/parsing.pyx":194 +@@ -5940,16 +6253,18 @@ static bool __pyx_f_5khmer_5_oxli_7parsing_11FastxParser_is_complete(struct __py + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + bool __pyx_t_5; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_complete", 0); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overridden in Python */ + else if (unlikely((Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0) || (Py_TYPE(((PyObject *)__pyx_v_self))->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) { +- #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP +- static PY_UINT64_T tp_dict_version = 0, obj_dict_version = 0; +- if (likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict && tp_dict_version == __PYX_GET_DICT_VERSION(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) && (!Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset || obj_dict_version == __PYX_GET_DICT_VERSION(_PyObject_GetDictPtr(((PyObject *)__pyx_v_self)))))); +- else { +- PY_UINT64_T type_dict_guard = (likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict)) ? __PYX_GET_DICT_VERSION(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) : 0; ++ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS ++ static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; ++ if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) { ++ PY_UINT64_T __pyx_type_dict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); + #endif + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_is_complete); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 199, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); +@@ -5976,15 +6291,15 @@ static bool __pyx_f_5khmer_5_oxli_7parsing_11FastxParser_is_complete(struct __py + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } +- #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP +- tp_dict_version = likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) ? __PYX_GET_DICT_VERSION(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dict) : 0; +- obj_dict_version = likely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset) ? __PYX_GET_DICT_VERSION(_PyObject_GetDictPtr(((PyObject *)__pyx_v_self))) : 0; +- if (unlikely(type_dict_guard != tp_dict_version)) { +- tp_dict_version = obj_dict_version = 0; ++ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS ++ __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); ++ __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self)); ++ if (unlikely(__pyx_type_dict_guard != __pyx_tp_dict_version)) { ++ __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; + } + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; +- #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP ++ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS + } + #endif + } +@@ -6038,6 +6353,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_11FastxParser_2is_complete(stru + 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("is_complete", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_f_5khmer_5_oxli_7parsing_11FastxParser_is_complete(__pyx_v_self, 1)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 199, __pyx_L1_error) +@@ -6083,6 +6401,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_11FastxParser_4__iter__(struct + struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct_1___iter__ *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__iter__", 0); + __pyx_cur_scope = (struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct_1___iter__ *)__pyx_tp_new_5khmer_5_oxli_7parsing___pyx_scope_struct_1___iter__(__pyx_ptype_5khmer_5_oxli_7parsing___pyx_scope_struct_1___iter__, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { +@@ -6118,6 +6439,9 @@ static PyObject *__pyx_gb_5khmer_5_oxli_7parsing_11FastxParser_6generator1(__pyx + PyObject *__pyx_r = NULL; + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__iter__", 0); + switch (__pyx_generator->resume_label) { +@@ -6224,6 +6548,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_11FastxParser_7__reduce_cython_ + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -6279,6 +6606,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_11FastxParser_9__setstate_cytho + 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)":4 +@@ -6323,6 +6653,9 @@ static int __pyx_pw_5khmer_5_oxli_7parsing_20SanitizedFastxParser_1__cinit__(PyO + CYTHON_UNUSED PyObject *__pyx_v_filename = 0; + PyObject *__pyx_v_alphabet = 0; + bool __pyx_v_convert_n; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -6419,6 +6752,9 @@ static int __pyx_pf_5khmer_5_oxli_7parsing_20SanitizedFastxParser___cinit__(stru + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "khmer/_oxli/parsing.pyx":213 +@@ -6487,6 +6823,9 @@ static struct __pyx_obj_5khmer_5_oxli_7parsing_Sequence *__pyx_f_5khmer_5_oxli_7 + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_next", 0); + + /* "khmer/_oxli/parsing.pyx":221 +@@ -6641,6 +6980,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_20SanitizedFastxParser_2__iter_ + struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct_2___iter__ *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__iter__", 0); + __pyx_cur_scope = (struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct_2___iter__ *)__pyx_tp_new_5khmer_5_oxli_7parsing___pyx_scope_struct_2___iter__(__pyx_ptype_5khmer_5_oxli_7parsing___pyx_scope_struct_2___iter__, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { +@@ -6677,6 +7019,9 @@ static PyObject *__pyx_gb_5khmer_5_oxli_7parsing_20SanitizedFastxParser_4generat + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__iter__", 0); + switch (__pyx_generator->resume_label) { +@@ -6804,6 +7149,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_20SanitizedFastxParser_5n_bad__ + 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("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->n_bad); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 134, __pyx_L1_error) +@@ -6848,6 +7196,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_20SanitizedFastxParser_9_alphab + 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("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_convert_PyUnicode_string_to_py_std__in_string(__pyx_v_self->_alphabet); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 135, __pyx_L1_error) +@@ -6891,6 +7242,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_20SanitizedFastxParser_5__reduc + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -6946,6 +7300,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_20SanitizedFastxParser_7__setst + 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)":4 +@@ -6991,6 +7348,9 @@ static int __pyx_pw_5khmer_5_oxli_7parsing_17SplitPairedReader_1__cinit__(PyObje + struct __pyx_obj_5khmer_5_oxli_7parsing_FastxParser *__pyx_v_right_parser = 0; + int __pyx_v_min_length; + bool __pyx_v_force_name_match; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -7190,6 +7550,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_17SplitPairedReader_2__iter__(s + struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct_3___iter__ *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__iter__", 0); + __pyx_cur_scope = (struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct_3___iter__ *)__pyx_tp_new_5khmer_5_oxli_7parsing___pyx_scope_struct_3___iter__(__pyx_ptype_5khmer_5_oxli_7parsing___pyx_scope_struct_3___iter__, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { +@@ -7232,6 +7595,9 @@ static PyObject *__pyx_gb_5khmer_5_oxli_7parsing_17SplitPairedReader_4generator3 + int __pyx_t_7; + int __pyx_t_8; + Py_ssize_t __pyx_t_9; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__iter__", 0); + switch (__pyx_generator->resume_label) { +@@ -7616,6 +7982,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_7parsing_17SplitPairedReader__next(struct + int __pyx_t_6; + int __pyx_t_7; + PyObject *__pyx_t_8 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_next", 0); + + /* "khmer/_oxli/parsing.pyx":277 +@@ -8048,6 +8417,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_17SplitPairedReader_10min_lengt + 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("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->min_length); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 146, __pyx_L1_error) +@@ -8092,6 +8464,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_17SplitPairedReader_16force_nam + 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("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->force_name_match); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 147, __pyx_L1_error) +@@ -8135,6 +8510,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_17SplitPairedReader_5__reduce_c + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -8190,6 +8568,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_17SplitPairedReader_7__setstate + 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)":4 +@@ -8235,6 +8616,9 @@ static int __pyx_pw_5khmer_5_oxli_7parsing_18BrokenPairedReader_1__cinit__(PyObj + int __pyx_v_min_length; + bool __pyx_v_force_single; + bool __pyx_v_require_paired; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -8363,6 +8747,9 @@ static int __pyx_pf_5khmer_5_oxli_7parsing_18BrokenPairedReader___cinit__(struct + 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("__cinit__", 0); + + /* "khmer/_oxli/parsing.pyx":312 +@@ -8504,6 +8891,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_18BrokenPairedReader_2__iter__( + struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct_4___iter__ *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__iter__", 0); + __pyx_cur_scope = (struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct_4___iter__ *)__pyx_tp_new_5khmer_5_oxli_7parsing___pyx_scope_struct_4___iter__(__pyx_ptype_5khmer_5_oxli_7parsing___pyx_scope_struct_4___iter__, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { +@@ -8547,6 +8937,9 @@ static PyObject *__pyx_gb_5khmer_5_oxli_7parsing_18BrokenPairedReader_4generator + int __pyx_t_8; + int __pyx_t_9; + Py_ssize_t __pyx_t_10; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__iter__", 0); + switch (__pyx_generator->resume_label) { +@@ -9221,6 +9614,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_7parsing_18BrokenPairedReader__next(struc + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_next", 0); + + /* "khmer/_oxli/parsing.pyx":363 +@@ -10036,6 +10432,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_18BrokenPairedReader_10min_leng + 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("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->min_length); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 155, __pyx_L1_error) +@@ -10080,6 +10479,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_18BrokenPairedReader_12force_si + 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("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->force_single); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 156, __pyx_L1_error) +@@ -10124,6 +10526,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_18BrokenPairedReader_14require_ + 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("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->require_paired); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 157, __pyx_L1_error) +@@ -10204,6 +10609,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_18BrokenPairedReader_5__reduce_ + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -10259,6 +10667,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_18BrokenPairedReader_7__setstat + 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)":4 +@@ -10304,6 +10715,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_7parsing__split_left_right(PyObject *__py + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + std::string __pyx_t_2; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_split_left_right", 0); + + /* "khmer/_oxli/parsing.pyx":410 +@@ -10360,6 +10774,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_7parsing__split_left_right(PyObject *__py + static PyObject *__pyx_pw_5khmer_5_oxli_7parsing_3_split_left_right(PyObject *__pyx_self, PyObject *__pyx_v_s); /*proto*/ + static char __pyx_doc_5khmer_5_oxli_7parsing_2_split_left_right[] = "_split_left_right(unicode s) -> tuple"; + static PyObject *__pyx_pw_5khmer_5_oxli_7parsing_3_split_left_right(PyObject *__pyx_self, PyObject *__pyx_v_s) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_split_left_right (wrapper)", 0); +@@ -10379,6 +10796,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_2_split_left_right(CYTHON_UNUSE + 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("_split_left_right", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __pyx_f_5khmer_5_oxli_7parsing__split_left_right(__pyx_v_s, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 409, __pyx_L1_error) +@@ -10422,6 +10842,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_7parsing__cppstring_split_left_right(std: + PyObject *__pyx_t_7 = NULL; + 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("_cppstring_split_left_right", 0); + + /* "khmer/_oxli/parsing.pyx":420 +@@ -10684,6 +11107,9 @@ static int __pyx_f_5khmer_5_oxli_7parsing__check_is_pair(struct __pyx_obj_5khmer + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_check_is_pair", 0); + + /* "khmer/_oxli/parsing.pyx":448 +@@ -11173,6 +11599,9 @@ static PyMethodDef __pyx_mdef_5khmer_5_oxli_7parsing_5check_is_pair = {"check_is + static PyObject *__pyx_pw_5khmer_5_oxli_7parsing_5check_is_pair(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_first = 0; + PyObject *__pyx_v_second = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("check_is_pair (wrapper)", 0); +@@ -11238,6 +11667,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_4check_is_pair(CYTHON_UNUSED Py + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("check_is_pair", 0); + __Pyx_INCREF(__pyx_v_first); + __Pyx_INCREF(__pyx_v_second); +@@ -11434,6 +11866,9 @@ static bool __pyx_f_5khmer_5_oxli_7parsing_check_is_left(PyObject *__pyx_v_s, CY + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("check_is_left", 0); + + /* "khmer/_oxli/parsing.pyx":499 +@@ -11627,6 +12062,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_6check_is_left(CYTHON_UNUSED Py + 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("check_is_left", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_f_5khmer_5_oxli_7parsing_check_is_left(__pyx_v_s, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 491, __pyx_L1_error) +@@ -11664,6 +12102,9 @@ static bool __pyx_f_5khmer_5_oxli_7parsing_check_is_right(PyObject *__pyx_v_s, C + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("check_is_right", 0); + + /* "khmer/_oxli/parsing.pyx":519 +@@ -11856,6 +12297,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_8check_is_right(CYTHON_UNUSED P + 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("check_is_right", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_f_5khmer_5_oxli_7parsing_check_is_right(__pyx_v_s, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 511, __pyx_L1_error) +@@ -11889,6 +12333,9 @@ static PyObject *__pyx_pw_5khmer_5_oxli_7parsing_11__pyx_unpickle_Alphabets(PyOb + 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_Alphabets (wrapper)", 0); +@@ -11960,125 +12407,132 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_10__pyx_unpickle_Alphabets(CYTH + 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_1 = NULL; ++ int __pyx_t_2; ++ int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; +- int __pyx_t_6; ++ PyObject *__pyx_t_6 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_Alphabets", 0); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result +- * if __pyx_checksum != 0xd41d8cd: # <<<<<<<<<<<<<< ++ * if __pyx_checksum not in (0xd41d8cd, 0xe3b0c44, 0xda39a3e): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError +- * raise __pyx_PickleError("Incompatible checksums (%s vs 0xd41d8cd = ())" % __pyx_checksum) ++ * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xd41d8cd, 0xe3b0c44, 0xda39a3e) = ())" % __pyx_checksum) + */ +- __pyx_t_1 = ((__pyx_v___pyx_checksum != 0xd41d8cd) != 0); +- if (__pyx_t_1) { ++ __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_1); ++ __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__21, Py_NE)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(1, 4, __pyx_L1_error) ++ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; ++ __pyx_t_3 = (__pyx_t_2 != 0); ++ if (__pyx_t_3) { + + /* "(tree fragment)":5 + * cdef object __pyx_result +- * if __pyx_checksum != 0xd41d8cd: ++ * if __pyx_checksum not in (0xd41d8cd, 0xe3b0c44, 0xda39a3e): + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< +- * raise __pyx_PickleError("Incompatible checksums (%s vs 0xd41d8cd = ())" % __pyx_checksum) ++ * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xd41d8cd, 0xe3b0c44, 0xda39a3e) = ())" % __pyx_checksum) + * __pyx_result = Alphabets.__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_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_1); + __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; ++ PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError); ++ __pyx_t_4 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 5, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_4); ++ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; ++ __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_4, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_1); ++ __Pyx_INCREF(__pyx_t_1); ++ __pyx_v___pyx_PickleError = __pyx_t_1; ++ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; ++ __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "(tree fragment)":6 +- * if __pyx_checksum != 0xd41d8cd: ++ * if __pyx_checksum not in (0xd41d8cd, 0xe3b0c44, 0xda39a3e): + * from pickle import PickleError as __pyx_PickleError +- * raise __pyx_PickleError("Incompatible checksums (%s vs 0xd41d8cd = ())" % __pyx_checksum) # <<<<<<<<<<<<<< ++ * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xd41d8cd, 0xe3b0c44, 0xda39a3e) = ())" % __pyx_checksum) # <<<<<<<<<<<<<< + * __pyx_result = Alphabets.__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_0xd4, __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_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_1); ++ __pyx_t_5 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 6, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_5); ++ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 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_t_1 = __pyx_v___pyx_PickleError; __pyx_t_6 = NULL; ++ if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { ++ __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1); ++ if (likely(__pyx_t_6)) { ++ PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); ++ __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); +- __Pyx_DECREF_SET(__pyx_t_2, function); ++ __Pyx_DECREF_SET(__pyx_t_1, 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_t_4 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_6, __pyx_t_5) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_5); ++ __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; ++ __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; ++ if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_4); ++ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; ++ __Pyx_Raise(__pyx_t_4, 0, 0, 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 != 0xd41d8cd: # <<<<<<<<<<<<<< ++ * if __pyx_checksum not in (0xd41d8cd, 0xe3b0c44, 0xda39a3e): # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError +- * raise __pyx_PickleError("Incompatible checksums (%s vs 0xd41d8cd = ())" % __pyx_checksum) ++ * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xd41d8cd, 0xe3b0c44, 0xda39a3e) = ())" % __pyx_checksum) + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError +- * raise __pyx_PickleError("Incompatible checksums (%s vs 0xd41d8cd = ())" % __pyx_checksum) ++ * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xd41d8cd, 0xe3b0c44, 0xda39a3e) = ())" % __pyx_checksum) + * __pyx_result = Alphabets.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_Alphabets__set_state( __pyx_result, __pyx_state) + */ +- __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_5khmer_5_oxli_7parsing_Alphabets), __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_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_5khmer_5_oxli_7parsing_Alphabets), __pyx_n_s_new); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 7, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_1); ++ __pyx_t_5 = NULL; ++ if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) { ++ __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_1); ++ if (likely(__pyx_t_5)) { ++ PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); ++ __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); +- __Pyx_DECREF_SET(__pyx_t_2, function); ++ __Pyx_DECREF_SET(__pyx_t_1, 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; ++ __pyx_t_4 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_5, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v___pyx_type); ++ __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; ++ if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 7, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_4); ++ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; ++ __pyx_v___pyx_result = __pyx_t_4; ++ __pyx_t_4 = 0; + + /* "(tree fragment)":8 +- * raise __pyx_PickleError("Incompatible checksums (%s vs 0xd41d8cd = ())" % __pyx_checksum) ++ * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xd41d8cd, 0xe3b0c44, 0xda39a3e) = ())" % __pyx_checksum) + * __pyx_result = Alphabets.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Alphabets__set_state( __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) { ++ __pyx_t_3 = (__pyx_v___pyx_state != Py_None); ++ __pyx_t_2 = (__pyx_t_3 != 0); ++ if (__pyx_t_2) { + + /* "(tree fragment)":9 + * __pyx_result = Alphabets.__new__(__pyx_type) +@@ -12088,12 +12542,12 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_10__pyx_unpickle_Alphabets(CYTH + * cdef __pyx_unpickle_Alphabets__set_state(Alphabets __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_5khmer_5_oxli_7parsing___pyx_unpickle_Alphabets__set_state(((struct __pyx_obj_5khmer_5_oxli_7parsing_Alphabets *)__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; ++ __pyx_t_4 = __pyx_f_5khmer_5_oxli_7parsing___pyx_unpickle_Alphabets__set_state(((struct __pyx_obj_5khmer_5_oxli_7parsing_Alphabets *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 9, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_4); ++ __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "(tree fragment)":8 +- * raise __pyx_PickleError("Incompatible checksums (%s vs 0xd41d8cd = ())" % __pyx_checksum) ++ * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xd41d8cd, 0xe3b0c44, 0xda39a3e) = ())" % __pyx_checksum) + * __pyx_result = Alphabets.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_Alphabets__set_state( __pyx_result, __pyx_state) +@@ -12121,10 +12575,10 @@ static PyObject *__pyx_pf_5khmer_5_oxli_7parsing_10__pyx_unpickle_Alphabets(CYTH + + /* function exit code */ + __pyx_L1_error:; +- __Pyx_XDECREF(__pyx_t_2); +- __Pyx_XDECREF(__pyx_t_3); ++ __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); ++ __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("khmer._oxli.parsing.__pyx_unpickle_Alphabets", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; +@@ -12154,6 +12608,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_7parsing___pyx_unpickle_Alphabets__set_st + 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_Alphabets__set_state", 0); + + /* "(tree fragment)":12 +@@ -12249,7 +12706,7 @@ static PyObject *__pyx_f_5khmer_5_oxli_7parsing___pyx_unpickle_Alphabets__set_st + * + * @cname("__pyx_convert_string_from_py_std__in_string") + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: # <<<<<<<<<<<<<< +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + */ + +@@ -12259,11 +12716,23 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + std::string __pyx_r; + __Pyx_RefNannyDeclarations + char const *__pyx_t_1; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_string_from_py_std__in_string", 0); + ++ /* "string.from_py":14 ++ * @cname("__pyx_convert_string_from_py_std__in_string") ++ * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: ++ * cdef Py_ssize_t length = 0 # <<<<<<<<<<<<<< ++ * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) ++ * return string(data, length) ++ */ ++ __pyx_v_length = 0; ++ + /* "string.from_py":15 + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) # <<<<<<<<<<<<<< + * return string(data, length) + * +@@ -12272,7 +12741,7 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + __pyx_v_data = __pyx_t_1; + + /* "string.from_py":16 +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + * return string(data, length) # <<<<<<<<<<<<<< + * +@@ -12285,7 +12754,7 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + * + * @cname("__pyx_convert_string_from_py_std__in_string") + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: # <<<<<<<<<<<<<< +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + */ + +@@ -12310,6 +12779,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyObject_string_to_py_std__in_strin + 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("__pyx_convert_PyObject_string_to_py_std__in_string", 0); + + /* "string.to_py":32 +@@ -12357,6 +12829,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyUnicode_string_to_py_std__in_stri + 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("__pyx_convert_PyUnicode_string_to_py_std__in_string", 0); + + /* "string.to_py":38 +@@ -12404,6 +12879,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyStr_string_to_py_std__in_string(s + 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("__pyx_convert_PyStr_string_to_py_std__in_string", 0); + + /* "string.to_py":44 +@@ -12451,6 +12929,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyBytes_string_to_py_std__in_string + 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("__pyx_convert_PyBytes_string_to_py_std__in_string", 0); + + /* "string.to_py":50 +@@ -12498,6 +12979,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyByteArray_string_to_py_std__in_st + 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("__pyx_convert_PyByteArray_string_to_py_std__in_string", 0); + + /* "string.to_py":56 +@@ -12569,7 +13053,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing_Alphabets = { + sizeof(struct __pyx_obj_5khmer_5_oxli_7parsing_Alphabets), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_7parsing_Alphabets, /*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 +@@ -12619,6 +13108,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing_Alphabets = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + static struct __pyx_vtabstruct_5khmer_5_oxli_7parsing_Sequence __pyx_vtable_5khmer_5_oxli_7parsing_Sequence; + +@@ -12734,7 +13232,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing_Sequence = { + sizeof(struct __pyx_obj_5khmer_5_oxli_7parsing_Sequence), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_7parsing_Sequence, /*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 +@@ -12784,6 +13287,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing_Sequence = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static PyObject *__pyx_tp_new_5khmer_5_oxli_7parsing_ReadBundle(PyTypeObject *t, PyObject *a, PyObject *k) { +@@ -12860,7 +13372,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing_ReadBundle = { + sizeof(struct __pyx_obj_5khmer_5_oxli_7parsing_ReadBundle), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_7parsing_ReadBundle, /*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 +@@ -12910,6 +13427,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing_ReadBundle = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + static struct __pyx_vtabstruct_5khmer_5_oxli_7parsing_FastxParser __pyx_vtable_5khmer_5_oxli_7parsing_FastxParser; + +@@ -12956,7 +13482,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing_FastxParser = { + sizeof(struct __pyx_obj_5khmer_5_oxli_7parsing_FastxParser), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_7parsing_FastxParser, /*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 +@@ -13006,6 +13537,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing_FastxParser = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + static struct __pyx_vtabstruct_5khmer_5_oxli_7parsing_SanitizedFastxParser __pyx_vtable_5khmer_5_oxli_7parsing_SanitizedFastxParser; + +@@ -13060,7 +13600,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing_SanitizedFastxParser = { + sizeof(struct __pyx_obj_5khmer_5_oxli_7parsing_SanitizedFastxParser), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_7parsing_SanitizedFastxParser, /*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 +@@ -13110,6 +13655,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing_SanitizedFastxParser = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + static struct __pyx_vtabstruct_5khmer_5_oxli_7parsing_SplitPairedReader __pyx_vtable_5khmer_5_oxli_7parsing_SplitPairedReader; + +@@ -13196,7 +13750,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing_SplitPairedReader = { + sizeof(struct __pyx_obj_5khmer_5_oxli_7parsing_SplitPairedReader), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_7parsing_SplitPairedReader, /*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 +@@ -13246,6 +13805,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing_SplitPairedReader = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + static struct __pyx_vtabstruct_5khmer_5_oxli_7parsing_BrokenPairedReader __pyx_vtable_5khmer_5_oxli_7parsing_BrokenPairedReader; + +@@ -13342,7 +13910,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing_BrokenPairedReader = { + sizeof(struct __pyx_obj_5khmer_5_oxli_7parsing_BrokenPairedReader), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_7parsing_BrokenPairedReader, /*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 +@@ -13392,6 +13965,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing_BrokenPairedReader = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct__kmers *__pyx_freelist_5khmer_5_oxli_7parsing___pyx_scope_struct__kmers[8]; +@@ -13438,7 +14020,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct__kmers + sizeof(struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct__kmers), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_7parsing___pyx_scope_struct__kmers, /*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 +@@ -13488,6 +14075,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct__kmers + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct_1___iter__ *__pyx_freelist_5khmer_5_oxli_7parsing___pyx_scope_struct_1___iter__[8]; +@@ -13537,7 +14133,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_1___ite + sizeof(struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct_1___iter__), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_7parsing___pyx_scope_struct_1___iter__, /*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 +@@ -13587,6 +14188,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_1___ite + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct_2___iter__ *__pyx_freelist_5khmer_5_oxli_7parsing___pyx_scope_struct_2___iter__[8]; +@@ -13636,7 +14246,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_2___ite + sizeof(struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct_2___iter__), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_7parsing___pyx_scope_struct_2___iter__, /*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 +@@ -13686,6 +14301,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_2___ite + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct_3___iter__ *__pyx_freelist_5khmer_5_oxli_7parsing___pyx_scope_struct_3___iter__[8]; +@@ -13747,7 +14371,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_3___ite + sizeof(struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct_3___iter__), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_7parsing___pyx_scope_struct_3___iter__, /*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 +@@ -13797,6 +14426,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_3___ite + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct_4___iter__ *__pyx_freelist_5khmer_5_oxli_7parsing___pyx_scope_struct_4___iter__[8]; +@@ -13854,7 +14492,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_4___ite + sizeof(struct __pyx_obj_5khmer_5_oxli_7parsing___pyx_scope_struct_4___iter__), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_7parsing___pyx_scope_struct_4___iter__, /*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 +@@ -13904,6 +14547,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_4___ite + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static PyMethodDef __pyx_methods[] = { +@@ -13967,7 +14619,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_kp_u_Differing_lengths_of_left_and_ri, __pyx_k_Differing_lengths_of_left_and_ri, sizeof(__pyx_k_Differing_lengths_of_left_and_ri), 0, 1, 0, 0}, + {&__pyx_n_s_FastxParser, __pyx_k_FastxParser, sizeof(__pyx_k_FastxParser), 0, 0, 1, 1}, + {&__pyx_n_s_FastxParser___iter, __pyx_k_FastxParser___iter, sizeof(__pyx_k_FastxParser___iter), 0, 0, 1, 1}, +- {&__pyx_kp_s_Incompatible_checksums_s_vs_0xd4, __pyx_k_Incompatible_checksums_s_vs_0xd4, sizeof(__pyx_k_Incompatible_checksums_s_vs_0xd4), 0, 0, 1, 0}, ++ {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_k_Incompatible_checksums_0x_x_vs_0, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0), 0, 0, 1, 0}, + {&__pyx_kp_u_No_alphabet_with_name_0, __pyx_k_No_alphabet_with_name_0, sizeof(__pyx_k_No_alphabet_with_name_0), 0, 1, 0, 0}, + {&__pyx_n_s_NotImplementedError, __pyx_k_NotImplementedError, sizeof(__pyx_k_NotImplementedError), 0, 0, 1, 1}, + {&__pyx_kp_u_Operator_not_available, __pyx_k_Operator_not_available, sizeof(__pyx_k_Operator_not_available), 0, 1, 0, 0}, +@@ -14275,6 +14927,17 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + __Pyx_GOTREF(__pyx_tuple__20); + __Pyx_GIVEREF(__pyx_tuple__20); + ++ /* "(tree fragment)":4 ++ * cdef object __pyx_PickleError ++ * cdef object __pyx_result ++ * if __pyx_checksum not in (0xd41d8cd, 0xe3b0c44, 0xda39a3e): # <<<<<<<<<<<<<< ++ * from pickle import PickleError as __pyx_PickleError ++ * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xd41d8cd, 0xe3b0c44, 0xda39a3e) = ())" % __pyx_checksum) ++ */ ++ __pyx_tuple__21 = PyTuple_Pack(3, __pyx_int_222419149, __pyx_int_238750788, __pyx_int_228825662); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(1, 4, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_tuple__21); ++ __Pyx_GIVEREF(__pyx_tuple__21); ++ + /* "khmer/_oxli/parsing.pyx":17 + * + * @staticmethod +@@ -14282,10 +14945,10 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + * cdef unicode alphabet = _ustring(Alphabets._get(_bstring(name))) + * if not alphabet: + */ +- __pyx_tuple__21 = PyTuple_Pack(2, __pyx_n_s_name, __pyx_n_s_alphabet); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(0, 17, __pyx_L1_error) +- __Pyx_GOTREF(__pyx_tuple__21); +- __Pyx_GIVEREF(__pyx_tuple__21); +- __pyx_codeobj__22 = (PyObject*)__Pyx_PyCode_New(1, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__21, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_khmer__oxli_parsing_pyx, __pyx_n_s_get, 17, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__22)) __PYX_ERR(0, 17, __pyx_L1_error) ++ __pyx_tuple__22 = PyTuple_Pack(2, __pyx_n_s_name, __pyx_n_s_alphabet); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(0, 17, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_tuple__22); ++ __Pyx_GIVEREF(__pyx_tuple__22); ++ __pyx_codeobj__23 = (PyObject*)__Pyx_PyCode_New(1, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__22, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_khmer__oxli_parsing_pyx, __pyx_n_s_get, 17, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__23)) __PYX_ERR(0, 17, __pyx_L1_error) + + /* "khmer/_oxli/parsing.pyx":111 + * +@@ -14294,10 +14957,10 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + * cdef Sequence seq = Sequence(name=record.name, + * sequence=record.sequence) + */ +- __pyx_tuple__23 = PyTuple_Pack(3, __pyx_n_s_record, __pyx_n_s_seq, __pyx_n_s_attr); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(0, 111, __pyx_L1_error) +- __Pyx_GOTREF(__pyx_tuple__23); +- __Pyx_GIVEREF(__pyx_tuple__23); +- __pyx_codeobj__24 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__23, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_khmer__oxli_parsing_pyx, __pyx_n_s_from_screed_record, 111, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__24)) __PYX_ERR(0, 111, __pyx_L1_error) ++ __pyx_tuple__24 = PyTuple_Pack(3, __pyx_n_s_record, __pyx_n_s_seq, __pyx_n_s_attr); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(0, 111, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_tuple__24); ++ __Pyx_GIVEREF(__pyx_tuple__24); ++ __pyx_codeobj__25 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__24, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_khmer__oxli_parsing_pyx, __pyx_n_s_from_screed_record, 111, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__25)) __PYX_ERR(0, 111, __pyx_L1_error) + + /* "khmer/_oxli/parsing.pyx":144 + * +@@ -14306,10 +14969,10 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + * """Print the given message to 'stderr'.""" + * + */ +- __pyx_tuple__25 = PyTuple_Pack(1, __pyx_n_s_msg); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(0, 144, __pyx_L1_error) +- __Pyx_GOTREF(__pyx_tuple__25); +- __Pyx_GIVEREF(__pyx_tuple__25); +- __pyx_codeobj__26 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__25, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_khmer__oxli_parsing_pyx, __pyx_n_s_print_error, 144, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__26)) __PYX_ERR(0, 144, __pyx_L1_error) ++ __pyx_tuple__26 = PyTuple_Pack(1, __pyx_n_s_msg); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(0, 144, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_tuple__26); ++ __Pyx_GIVEREF(__pyx_tuple__26); ++ __pyx_codeobj__27 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_khmer__oxli_parsing_pyx, __pyx_n_s_print_error, 144, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__27)) __PYX_ERR(0, 144, __pyx_L1_error) + + /* "khmer/_oxli/parsing.pyx":150 + * +@@ -14318,9 +14981,9 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + * """ValueError with refs to the read pair in question.""" + * + */ +- __pyx_tuple__27 = PyTuple_Pack(1, __pyx_builtin_ValueError); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(0, 150, __pyx_L1_error) +- __Pyx_GOTREF(__pyx_tuple__27); +- __Pyx_GIVEREF(__pyx_tuple__27); ++ __pyx_tuple__28 = PyTuple_Pack(1, __pyx_builtin_ValueError); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(0, 150, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_tuple__28); ++ __Pyx_GIVEREF(__pyx_tuple__28); + + /* "khmer/_oxli/parsing.pyx":153 + * """ValueError with refs to the read pair in question.""" +@@ -14329,10 +14992,10 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + * r1_name = "" + * r2_name = "" + */ +- __pyx_tuple__28 = PyTuple_Pack(6, __pyx_n_s_self, __pyx_n_s_msg, __pyx_n_s_r1, __pyx_n_s_r2, __pyx_n_s_r1_name, __pyx_n_s_r2_name); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(0, 153, __pyx_L1_error) +- __Pyx_GOTREF(__pyx_tuple__28); +- __Pyx_GIVEREF(__pyx_tuple__28); +- __pyx_codeobj__29 = (PyObject*)__Pyx_PyCode_New(4, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_khmer__oxli_parsing_pyx, __pyx_n_s_init, 153, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__29)) __PYX_ERR(0, 153, __pyx_L1_error) ++ __pyx_tuple__29 = PyTuple_Pack(6, __pyx_n_s_self, __pyx_n_s_msg, __pyx_n_s_r1, __pyx_n_s_r2, __pyx_n_s_r1_name, __pyx_n_s_r2_name); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(0, 153, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_tuple__29); ++ __Pyx_GIVEREF(__pyx_tuple__29); ++ __pyx_codeobj__30 = (PyObject*)__Pyx_PyCode_New(4, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__29, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_khmer__oxli_parsing_pyx, __pyx_n_s_init, 153, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__30)) __PYX_ERR(0, 153, __pyx_L1_error) + + /* "khmer/_oxli/parsing.pyx":480 + * +@@ -14341,20 +15004,20 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + * if type(first) is not Sequence: + * first = Sequence.from_screed_record(first) + */ +- __pyx_tuple__30 = PyTuple_Pack(3, __pyx_n_s_first, __pyx_n_s_second, __pyx_n_s_ret); if (unlikely(!__pyx_tuple__30)) __PYX_ERR(0, 480, __pyx_L1_error) +- __Pyx_GOTREF(__pyx_tuple__30); +- __Pyx_GIVEREF(__pyx_tuple__30); +- __pyx_codeobj__31 = (PyObject*)__Pyx_PyCode_New(2, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_khmer__oxli_parsing_pyx, __pyx_n_s_check_is_pair, 480, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__31)) __PYX_ERR(0, 480, __pyx_L1_error) ++ __pyx_tuple__31 = PyTuple_Pack(3, __pyx_n_s_first, __pyx_n_s_second, __pyx_n_s_ret); if (unlikely(!__pyx_tuple__31)) __PYX_ERR(0, 480, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_tuple__31); ++ __Pyx_GIVEREF(__pyx_tuple__31); ++ __pyx_codeobj__32 = (PyObject*)__Pyx_PyCode_New(2, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__31, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_khmer__oxli_parsing_pyx, __pyx_n_s_check_is_pair, 480, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__32)) __PYX_ERR(0, 480, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __pyx_unpickle_Alphabets(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ +- __pyx_tuple__32 = 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__32)) __PYX_ERR(1, 1, __pyx_L1_error) +- __Pyx_GOTREF(__pyx_tuple__32); +- __Pyx_GIVEREF(__pyx_tuple__32); +- __pyx_codeobj__33 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__32, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_Alphabets, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__33)) __PYX_ERR(1, 1, __pyx_L1_error) ++ __pyx_tuple__33 = 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__33)) __PYX_ERR(1, 1, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_tuple__33); ++ __Pyx_GIVEREF(__pyx_tuple__33); ++ __pyx_codeobj__34 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__33, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_Alphabets, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__34)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; +@@ -14368,6 +15031,8 @@ static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __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_222419149 = PyInt_FromLong(222419149L); if (unlikely(!__pyx_int_222419149)) __PYX_ERR(0, 1, __pyx_L1_error) ++ __pyx_int_228825662 = PyInt_FromLong(228825662L); if (unlikely(!__pyx_int_228825662)) __PYX_ERR(0, 1, __pyx_L1_error) ++ __pyx_int_238750788 = PyInt_FromLong(238750788L); if (unlikely(!__pyx_int_238750788)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; +@@ -14400,6 +15065,9 @@ static int __Pyx_modinit_variable_export_code(void) { + + static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + if (__Pyx_ExportFunction("_split_left_right", (void (*)(void))__pyx_f_5khmer_5_oxli_7parsing__split_left_right, "PyObject *(PyObject *, int __pyx_skip_dispatch)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) +@@ -14418,12 +15086,17 @@ static int __Pyx_modinit_function_export_code(void) { + + 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_5khmer_5_oxli_7parsing_Alphabets = &__pyx_vtable_5khmer_5_oxli_7parsing_Alphabets; + __pyx_vtable_5khmer_5_oxli_7parsing_Alphabets._get = (std::string (*)(std::string))__pyx_f_5khmer_5_oxli_7parsing_9Alphabets__get; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_7parsing_Alphabets) < 0) __PYX_ERR(0, 14, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_7parsing_Alphabets.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_7parsing_Alphabets.tp_dictoffset && __pyx_type_5khmer_5_oxli_7parsing_Alphabets.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_7parsing_Alphabets.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -14434,7 +15107,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtabptr_5khmer_5_oxli_7parsing_Sequence = &__pyx_vtable_5khmer_5_oxli_7parsing_Sequence; + __pyx_vtable_5khmer_5_oxli_7parsing_Sequence._wrap = (struct __pyx_obj_5khmer_5_oxli_7parsing_Sequence *(*)(oxli::read_parsers::Read))__pyx_f_5khmer_5_oxli_7parsing_8Sequence__wrap; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_7parsing_Sequence) < 0) __PYX_ERR(0, 42, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_7parsing_Sequence.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_7parsing_Sequence.tp_dictoffset && __pyx_type_5khmer_5_oxli_7parsing_Sequence.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_7parsing_Sequence.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -14443,7 +15118,9 @@ static int __Pyx_modinit_type_init_code(void) { + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_5khmer_5_oxli_7parsing_Sequence) < 0) __PYX_ERR(0, 42, __pyx_L1_error) + __pyx_ptype_5khmer_5_oxli_7parsing_Sequence = &__pyx_type_5khmer_5_oxli_7parsing_Sequence; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_7parsing_ReadBundle) < 0) __PYX_ERR(0, 130, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_7parsing_ReadBundle.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_7parsing_ReadBundle.tp_dictoffset && __pyx_type_5khmer_5_oxli_7parsing_ReadBundle.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_7parsing_ReadBundle.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -14454,7 +15131,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtable_5khmer_5_oxli_7parsing_FastxParser.is_complete = (bool (*)(struct __pyx_obj_5khmer_5_oxli_7parsing_FastxParser *, int __pyx_skip_dispatch))__pyx_f_5khmer_5_oxli_7parsing_11FastxParser_is_complete; + __pyx_vtable_5khmer_5_oxli_7parsing_FastxParser._next = (struct __pyx_obj_5khmer_5_oxli_7parsing_Sequence *(*)(struct __pyx_obj_5khmer_5_oxli_7parsing_FastxParser *))__pyx_f_5khmer_5_oxli_7parsing_11FastxParser__next; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_7parsing_FastxParser) < 0) __PYX_ERR(0, 188, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_7parsing_FastxParser.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_7parsing_FastxParser.tp_dictoffset && __pyx_type_5khmer_5_oxli_7parsing_FastxParser.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_7parsing_FastxParser.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -14467,7 +15146,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtable_5khmer_5_oxli_7parsing_SanitizedFastxParser.__pyx_base._next = (struct __pyx_obj_5khmer_5_oxli_7parsing_Sequence *(*)(struct __pyx_obj_5khmer_5_oxli_7parsing_FastxParser *))__pyx_f_5khmer_5_oxli_7parsing_20SanitizedFastxParser__next; + __pyx_type_5khmer_5_oxli_7parsing_SanitizedFastxParser.tp_base = __pyx_ptype_5khmer_5_oxli_7parsing_FastxParser; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_7parsing_SanitizedFastxParser) < 0) __PYX_ERR(0, 209, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_7parsing_SanitizedFastxParser.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_7parsing_SanitizedFastxParser.tp_dictoffset && __pyx_type_5khmer_5_oxli_7parsing_SanitizedFastxParser.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_7parsing_SanitizedFastxParser.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -14478,7 +15159,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtabptr_5khmer_5_oxli_7parsing_SplitPairedReader = &__pyx_vtable_5khmer_5_oxli_7parsing_SplitPairedReader; + __pyx_vtable_5khmer_5_oxli_7parsing_SplitPairedReader._next = (PyObject *(*)(struct __pyx_obj_5khmer_5_oxli_7parsing_SplitPairedReader *))__pyx_f_5khmer_5_oxli_7parsing_17SplitPairedReader__next; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_7parsing_SplitPairedReader) < 0) __PYX_ERR(0, 242, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_7parsing_SplitPairedReader.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_7parsing_SplitPairedReader.tp_dictoffset && __pyx_type_5khmer_5_oxli_7parsing_SplitPairedReader.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_7parsing_SplitPairedReader.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -14489,7 +15172,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtabptr_5khmer_5_oxli_7parsing_BrokenPairedReader = &__pyx_vtable_5khmer_5_oxli_7parsing_BrokenPairedReader; + __pyx_vtable_5khmer_5_oxli_7parsing_BrokenPairedReader._next = (PyObject *(*)(struct __pyx_obj_5khmer_5_oxli_7parsing_BrokenPairedReader *))__pyx_f_5khmer_5_oxli_7parsing_18BrokenPairedReader__next; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_7parsing_BrokenPairedReader) < 0) __PYX_ERR(0, 305, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_7parsing_BrokenPairedReader.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_7parsing_BrokenPairedReader.tp_dictoffset && __pyx_type_5khmer_5_oxli_7parsing_BrokenPairedReader.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_7parsing_BrokenPairedReader.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -14498,31 +15183,41 @@ static int __Pyx_modinit_type_init_code(void) { + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_5khmer_5_oxli_7parsing_BrokenPairedReader) < 0) __PYX_ERR(0, 305, __pyx_L1_error) + __pyx_ptype_5khmer_5_oxli_7parsing_BrokenPairedReader = &__pyx_type_5khmer_5_oxli_7parsing_BrokenPairedReader; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct__kmers) < 0) __PYX_ERR(0, 75, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct__kmers.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct__kmers.tp_dictoffset && __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct__kmers.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct__kmers.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } + __pyx_ptype_5khmer_5_oxli_7parsing___pyx_scope_struct__kmers = &__pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct__kmers; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_1___iter__) < 0) __PYX_ERR(0, 202, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_1___iter__.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_1___iter__.tp_dictoffset && __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_1___iter__.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_1___iter__.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } + __pyx_ptype_5khmer_5_oxli_7parsing___pyx_scope_struct_1___iter__ = &__pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_1___iter__; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_2___iter__) < 0) __PYX_ERR(0, 234, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_2___iter__.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_2___iter__.tp_dictoffset && __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_2___iter__.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_2___iter__.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } + __pyx_ptype_5khmer_5_oxli_7parsing___pyx_scope_struct_2___iter__ = &__pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_2___iter__; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_3___iter__) < 0) __PYX_ERR(0, 254, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_3___iter__.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_3___iter__.tp_dictoffset && __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_3___iter__.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_3___iter__.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } + __pyx_ptype_5khmer_5_oxli_7parsing___pyx_scope_struct_3___iter__ = &__pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_3___iter__; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_4___iter__) < 0) __PYX_ERR(0, 322, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_4___iter__.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_4___iter__.tp_dictoffset && __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_4___iter__.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_7parsing___pyx_scope_struct_4___iter__.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } +@@ -14553,12 +15248,16 @@ static int __Pyx_modinit_variable_import_code(void) { + static int __Pyx_modinit_function_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_function_import_code", 0); + /*--- Function import code ---*/ + __pyx_t_1 = PyImport_ImportModule("khmer._oxli.utils"); if (!__pyx_t_1) __PYX_ERR(0, 1, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_1); + if (__Pyx_ImportFunction(__pyx_t_1, "_bstring", (void (**)(void))&__pyx_f_5khmer_5_oxli_5utils__bstring, "PyObject *(PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportFunction(__pyx_t_1, "_ustring", (void (**)(void))&__pyx_f_5khmer_5_oxli_5utils__ustring, "PyObject *(PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) +- Py_DECREF(__pyx_t_1); __pyx_t_1 = 0; ++ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; +@@ -14568,17 +15267,19 @@ static int __Pyx_modinit_function_import_code(void) { + } + + +-#if PY_MAJOR_VERSION < 3 +-#ifdef CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC void +-#else ++#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 CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC PyObject * ++#ifdef __cplusplus ++#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * + #else +-#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC ++#define __Pyx_PyMODINIT_FUNC PyObject * + #endif + #endif + +@@ -14662,6 +15363,9 @@ static CYTHON_SMALL_CODE int __pyx_pymod_exec_parsing(PyObject *__pyx_pyinit_mod + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { +@@ -14709,11 +15413,9 @@ if (!__Pyx_RefNanny) { + #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? */ ++ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif +- #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; +@@ -14729,10 +15431,9 @@ if (!__Pyx_RefNanny) { + __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) +- __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) +- #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); +- #endif ++ __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) +@@ -14757,11 +15458,11 @@ if (!__Pyx_RefNanny) { + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); +- if (unlikely(__Pyx_modinit_function_export_code() != 0)) goto __pyx_L1_error; +- if (unlikely(__Pyx_modinit_type_init_code() != 0)) goto __pyx_L1_error; ++ if (unlikely(__Pyx_modinit_function_export_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) ++ if (unlikely(__Pyx_modinit_type_init_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + (void)__Pyx_modinit_type_import_code(); + (void)__Pyx_modinit_variable_import_code(); +- if (unlikely(__Pyx_modinit_function_import_code() != 0)) goto __pyx_L1_error; ++ if (unlikely(__Pyx_modinit_function_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) +@@ -14856,9 +15557,9 @@ if (!__Pyx_RefNanny) { + * """ValueError with refs to the read pair in question.""" + * + */ +- __pyx_t_1 = __Pyx_CalculateMetaclass(NULL, __pyx_tuple__27); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 150, __pyx_L1_error) ++ __pyx_t_1 = __Pyx_CalculateMetaclass(NULL, __pyx_tuple__28); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 150, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); +- __pyx_t_2 = __Pyx_Py3MetaclassPrepare(__pyx_t_1, __pyx_tuple__27, __pyx_n_s_UnpairedReadsError, __pyx_n_s_UnpairedReadsError, (PyObject *) NULL, __pyx_n_s_khmer__oxli_parsing, __pyx_kp_s_ValueError_with_refs_to_the_read); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 150, __pyx_L1_error) ++ __pyx_t_2 = __Pyx_Py3MetaclassPrepare(__pyx_t_1, __pyx_tuple__28, __pyx_n_s_UnpairedReadsError, __pyx_n_s_UnpairedReadsError, (PyObject *) NULL, __pyx_n_s_khmer__oxli_parsing, __pyx_kp_s_ValueError_with_refs_to_the_read); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 150, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + + /* "khmer/_oxli/parsing.pyx":153 +@@ -14868,7 +15569,7 @@ if (!__Pyx_RefNanny) { + * r1_name = "" + * r2_name = "" + */ +- __pyx_t_3 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5khmer_5_oxli_7parsing_18UnpairedReadsError_1__init__, 0, __pyx_n_s_UnpairedReadsError___init, NULL, __pyx_n_s_khmer__oxli_parsing, __pyx_d, ((PyObject *)__pyx_codeobj__29)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 153, __pyx_L1_error) ++ __pyx_t_3 = __Pyx_CyFunction_New(&__pyx_mdef_5khmer_5_oxli_7parsing_18UnpairedReadsError_1__init__, 0, __pyx_n_s_UnpairedReadsError___init, NULL, __pyx_n_s_khmer__oxli_parsing, __pyx_d, ((PyObject *)__pyx_codeobj__30)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 153, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (__Pyx_SetNameInClass(__pyx_t_2, __pyx_n_s_init, __pyx_t_3) < 0) __PYX_ERR(0, 153, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; +@@ -14880,7 +15581,7 @@ if (!__Pyx_RefNanny) { + * """ValueError with refs to the read pair in question.""" + * + */ +- __pyx_t_3 = __Pyx_Py3ClassCreate(__pyx_t_1, __pyx_n_s_UnpairedReadsError, __pyx_tuple__27, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 150, __pyx_L1_error) ++ __pyx_t_3 = __Pyx_Py3ClassCreate(__pyx_t_1, __pyx_n_s_UnpairedReadsError, __pyx_tuple__28, __pyx_t_2, NULL, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 150, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_UnpairedReadsError, __pyx_t_3) < 0) __PYX_ERR(0, 150, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; +@@ -15035,7 +15736,7 @@ static int __Pyx_ParseOptionalKeywords( + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 +- if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { ++ if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { +@@ -15062,7 +15763,7 @@ static int __Pyx_ParseOptionalKeywords( + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -15078,7 +15779,7 @@ static int __Pyx_ParseOptionalKeywords( + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -15195,7 +15896,7 @@ static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args + return result; + } + #if 1 || PY_VERSION_HEX < 0x030600B1 +-static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs) { ++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); +@@ -15266,12 +15967,12 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + } + #if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); + #else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); + #endif +@@ -15287,7 +15988,7 @@ done: + #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; ++ ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) +@@ -15374,7 +16075,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec + 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) { ++ } else if (__Pyx_PyFastCFunction_Check(func)) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); + #endif + } +@@ -15670,6 +16371,32 @@ static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject + 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) +@@ -15787,9 +16514,8 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring( + stop += length; + else if (stop > length) + stop = length; +- length = stop - start; +- if (length <= 0) +- return PyUnicode_FromUnicode(NULL, 0); ++ 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); +@@ -16080,7 +16806,7 @@ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int eq + return (equals == Py_EQ); + } else { + int result; +-#if CYTHON_USE_UNICODE_INTERNALS ++#if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) + Py_hash_t hash1, hash2; + hash1 = ((PyBytesObject*)s1)->ob_shash; + hash2 = ((PyBytesObject*)s2)->ob_shash; +@@ -16268,7 +16994,7 @@ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { +- if (strchr(__Pyx_MODULE_NAME, '.')) { ++ if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) { + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, 1); + if (!module) { +@@ -16385,6 +17111,28 @@ bad: + 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; +@@ -16405,53 +17153,81 @@ static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; ++ PyObject *object_getstate = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; ++ PyObject *getstate = NULL; ++#if CYTHON_USE_PYTYPE_LOOKUP ++ getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); ++#else ++ getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); ++ if (!getstate && PyErr_Occurred()) { ++ goto __PYX_BAD; ++ } ++#endif ++ if (getstate) { + #if CYTHON_USE_PYTYPE_LOOKUP +- if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto GOOD; ++ object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); + #else +- if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto GOOD; ++ object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); ++ if (!object_getstate && PyErr_Occurred()) { ++ goto __PYX_BAD; ++ } + #endif ++ if (object_getstate != getstate) { ++ goto __PYX_GOOD; ++ } ++ } + #if CYTHON_USE_PYTYPE_LOOKUP +- object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; ++ 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 BAD; ++ 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 BAD; ++ 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 BAD; ++ 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 BAD; ++ 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 BAD; ++ 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_GetAttrStr(type_obj, __pyx_n_s_reduce_cython); if (unlikely(!reduce_cython)) goto BAD; +- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto BAD; +- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto BAD; ++ 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_GetAttrStr(type_obj, __pyx_n_s_setstate_cython); if (unlikely(!setstate_cython)) goto BAD; +- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto BAD; +- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto BAD; ++ 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 GOOD; +-BAD: ++ 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; +-GOOD: ++__PYX_GOOD: + #if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); ++ Py_XDECREF(object_getstate); ++ Py_XDECREF(getstate); + #endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); +@@ -16559,7 +17335,7 @@ bad: + goto done; + } + +-/* CythonFunction */ ++/* CythonFunctionShared */ + #include + static PyObject * + __Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *closure) +@@ -16852,7 +17628,8 @@ static PyObject * + __Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, CYTHON_UNUSED PyObject *args) + { + #if PY_MAJOR_VERSION >= 3 +- return PyUnicode_FromString(m->func.m_ml->ml_name); ++ Py_INCREF(m->func_qualname); ++ return m->func_qualname; + #else + return PyString_FromString(m->func.m_ml->ml_name); + #endif +@@ -16866,10 +17643,9 @@ static PyMethodDef __pyx_CyFunction_methods[] = { + #else + #define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func.m_weakreflist) + #endif +-static PyObject *__Pyx_CyFunction_New(PyTypeObject *type, PyMethodDef *ml, int flags, PyObject* qualname, +- PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { +- __pyx_CyFunctionObject *op = PyObject_GC_New(__pyx_CyFunctionObject, type); +- if (op == NULL) ++static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, ++ PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { ++ if (unlikely(op == NULL)) + return NULL; + op->flags = flags; + __Pyx_CyFunction_weakreflist(op) = NULL; +@@ -16890,12 +17666,12 @@ static PyObject *__Pyx_CyFunction_New(PyTypeObject *type, PyMethodDef *ml, int f + Py_XINCREF(code); + op->func_code = code; + op->defaults_pyobjects = 0; ++ op->defaults_size = 0; + op->defaults = NULL; + op->defaults_tuple = NULL; + op->defaults_kwdict = NULL; + op->defaults_getter = NULL; + op->func_annotations = NULL; +- PyObject_GC_Track(op); + return (PyObject *) op; + } + static int +@@ -16958,6 +17734,7 @@ static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, + } + static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObject *type) + { ++#if PY_MAJOR_VERSION < 3 + __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; + if (m->flags & __Pyx_CYFUNCTION_STATICMETHOD) { + Py_INCREF(func); +@@ -16970,6 +17747,7 @@ static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObj + } + if (obj == Py_None) + obj = NULL; ++#endif + return __Pyx_PyMethod_New(func, obj, type); + } + static PyObject* +@@ -17054,6 +17832,9 @@ static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, P + self = PyTuple_GetItem(args, 0); + if (unlikely(!self)) { + Py_DECREF(new_args); ++ PyErr_Format(PyExc_TypeError, ++ "unbound method %.200S() needs an argument", ++ cyfunc->func_qualname); + return NULL; + } + result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); +@@ -17122,6 +17903,15 @@ static PyTypeObject __pyx_CyFunctionType_type = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, + #endif ++#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, ++#endif ++#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, ++#endif ++#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, ++#endif + }; + static int __pyx_CyFunction_init(void) { + __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); +@@ -17137,6 +17927,7 @@ static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t + return PyErr_NoMemory(); + memset(m->defaults, 0, size); + m->defaults_pyobjects = pyobjects; ++ m->defaults_size = size; + return m->defaults; + } + static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { +@@ -17155,6 +17946,19 @@ static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, Py + Py_INCREF(dict); + } + ++/* CythonFunction */ ++static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, ++ PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { ++ PyObject *op = __Pyx_CyFunction_Init( ++ PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), ++ ml, flags, qualname, closure, module, globals, code ++ ); ++ if (likely(op)) { ++ PyObject_GC_Track(op); ++ } ++ return op; ++} ++ + /* Py3ClassCreate */ + static PyObject *__Pyx_Py3MetaclassPrepare(PyObject *metaclass, PyObject *bases, PyObject *name, + PyObject *qualname, PyObject *mkw, PyObject *modname, PyObject *doc) { +@@ -17224,7 +18028,7 @@ static PyObject *__Pyx_Py3ClassCreate(PyObject *metaclass, PyObject *name, PyObj + + /* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +-static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { ++static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; + #if CYTHON_COMPILING_IN_CPYTHON +@@ -17254,7 +18058,7 @@ static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + } + if (!use_cline) { + c_line = 0; +- PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); ++ (void) 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; +@@ -17328,7 +18132,7 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + 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)); ++ __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } +@@ -17348,33 +18152,40 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + #include "compile.h" + #include "frameobject.h" + #include "traceback.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + 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; ++ PyCodeObject *py_code = NULL; ++ PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 ++ PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); +- #else +- py_srcfile = PyUnicode_FromString(filename); +- #endif + if (!py_srcfile) goto bad; ++ #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; ++ funcname = PyUnicode_AsUTF8(py_funcname); ++ if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); +- #else +- py_funcname = PyUnicode_FromString(funcname); ++ if (!py_funcname) goto bad; + #endif + } +- if (!py_funcname) goto bad; ++ #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, +@@ -17393,11 +18204,16 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); +- Py_DECREF(py_funcname); ++ #else ++ py_code = PyCode_NewEmpty(filename, funcname, py_line); ++ #endif ++ Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline + return py_code; + bad: +- Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); ++ #if PY_MAJOR_VERSION < 3 ++ Py_XDECREF(py_srcfile); ++ #endif + return NULL; + } + static void __Pyx_AddTraceback(const char *funcname, int c_line, +@@ -17405,14 +18221,24 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; ++ PyObject *ptype, *pvalue, *ptraceback; + 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) { ++ __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); +- if (!py_code) goto bad; ++ if (!py_code) { ++ /* If the code object creation fails, then we should clear the ++ fetched exception references and propagate the new exception */ ++ Py_XDECREF(ptype); ++ Py_XDECREF(pvalue); ++ Py_XDECREF(ptraceback); ++ goto bad; ++ } ++ __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( +@@ -17429,37 +18255,6 @@ bad: + Py_XDECREF(py_frame); + } + +-/* 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); +- } +-} +- + /* CIntFromPyVerify */ + #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +@@ -17483,24 +18278,31 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { + } + + /* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const int neg_one = (int) -1, const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { +- if (sizeof(long) < sizeof(long)) { ++ if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); +- } else if (sizeof(long) <= sizeof(unsigned long)) { ++ } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); + #ifdef HAVE_LONG_LONG +- } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { ++ } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + #endif + } + } else { +- if (sizeof(long) <= sizeof(long)) { ++ if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); + #ifdef HAVE_LONG_LONG +- } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { ++ } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); + #endif + } +@@ -17508,14 +18310,21 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; +- return _PyLong_FromByteArray(bytes, sizeof(long), ++ return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); + } + } + + /* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +- const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const int neg_one = (int) -1, const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -17704,7 +18513,14 @@ raise_neg_overflow: + + /* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -17893,7 +18709,14 @@ raise_neg_overflow: + + /* CIntFromPy */ + static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *x) { +- const unsigned int neg_one = (unsigned int) ((unsigned int) 0 - (unsigned int) 1), const_zero = (unsigned int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const unsigned int neg_one = (unsigned int) -1, const_zero = (unsigned int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -18080,6 +18903,44 @@ raise_neg_overflow: + return (unsigned int) -1; + } + ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ 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); ++ } ++} ++ + /* FastTypeChecks */ + #if CYTHON_COMPILING_IN_CPYTHON + static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { +@@ -18388,6 +19249,12 @@ static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name + /* CoroutineBase */ + #include + #include ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + #define __Pyx_Coroutine_Undelegate(gen) Py_CLEAR((gen)->yieldfrom) + static int __Pyx_PyGen__FetchStopIterationValue(CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject **pvalue) { + PyObject *et, *ev, *tb; +@@ -18559,9 +19426,13 @@ PyObject *__Pyx_Coroutine_SendEx(__pyx_CoroutineObject *self, PyObject *value, i + if (exc_state->exc_traceback) { + PyTracebackObject *tb = (PyTracebackObject *) exc_state->exc_traceback; + PyFrameObject *f = tb->tb_frame; +- Py_XINCREF(tstate->frame); + assert(f->f_back == NULL); ++ #if PY_VERSION_HEX >= 0x030B00A1 ++ f->f_back = PyThreadState_GetFrame(tstate); ++ #else ++ Py_XINCREF(tstate->frame); + f->f_back = tstate->frame; ++ #endif + } + #endif + } +@@ -18614,6 +19485,30 @@ PyObject *__Pyx_Coroutine_MethodReturn(CYTHON_UNUSED PyObject* gen, PyObject *re + } + return retval; + } ++#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) ++static CYTHON_INLINE ++PyObject *__Pyx_PyGen_Send(PyGenObject *gen, PyObject *arg) { ++#if PY_VERSION_HEX <= 0x030A00A1 ++ return _PyGen_Send(gen, arg); ++#else ++ PyObject *result; ++ if (PyIter_Send((PyObject*)gen, arg ? arg : Py_None, &result) == PYGEN_RETURN) { ++ if (PyAsyncGen_CheckExact(gen)) { ++ assert(result == Py_None); ++ PyErr_SetNone(PyExc_StopAsyncIteration); ++ } ++ else if (result == Py_None) { ++ PyErr_SetNone(PyExc_StopIteration); ++ } ++ else { ++ _PyGen_SetStopIterationValue(result); ++ } ++ Py_CLEAR(result); ++ } ++ return result; ++#endif ++} ++#endif + static CYTHON_INLINE + PyObject *__Pyx_Coroutine_FinishDelegation(__pyx_CoroutineObject *gen) { + PyObject *ret; +@@ -18650,12 +19545,12 @@ static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) { + #endif + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) + if (PyGen_CheckExact(yf)) { +- ret = _PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); ++ ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); + } else + #endif + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03050000 && defined(PyCoro_CheckExact) && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) + if (PyCoro_CheckExact(yf)) { +- ret = _PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); ++ ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); + } else + #endif + { +@@ -18739,7 +19634,7 @@ static PyObject *__Pyx_Generator_Next(PyObject *self) { + #endif + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) + if (PyGen_CheckExact(yf)) { +- ret = _PyGen_Send((PyGenObject*)yf, NULL); ++ ret = __Pyx_PyGen_Send((PyGenObject*)yf, NULL); + } else + #endif + #ifdef __Pyx_Coroutine_USED +@@ -18899,6 +19794,7 @@ static int __Pyx_Coroutine_clear(PyObject *self) { + } + #endif + Py_CLEAR(gen->gi_code); ++ Py_CLEAR(gen->gi_frame); + Py_CLEAR(gen->gi_name); + Py_CLEAR(gen->gi_qualname); + Py_CLEAR(gen->gi_modulename); +@@ -18915,7 +19811,7 @@ static void __Pyx_Coroutine_dealloc(PyObject *self) { + if (PyObject_CallFinalizerFromDealloc(self)) + #else + Py_TYPE(gen)->tp_del(self); +- if (self->ob_refcnt > 0) ++ if (Py_REFCNT(self) > 0) + #endif + { + return; +@@ -18942,7 +19838,7 @@ static void __Pyx_Coroutine_del(PyObject *self) { + } + #if !CYTHON_USE_TP_FINALIZE + assert(self->ob_refcnt == 0); +- self->ob_refcnt = 1; ++ __Pyx_SET_REFCNT(self, 1); + #endif + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&error_type, &error_value, &error_traceback); +@@ -19009,17 +19905,17 @@ static void __Pyx_Coroutine_del(PyObject *self) { + } + __Pyx_ErrRestore(error_type, error_value, error_traceback); + #if !CYTHON_USE_TP_FINALIZE +- assert(self->ob_refcnt > 0); ++ assert(Py_REFCNT(self) > 0); + if (--self->ob_refcnt == 0) { + return; + } + { +- Py_ssize_t refcnt = self->ob_refcnt; ++ Py_ssize_t refcnt = Py_REFCNT(self); + _Py_NewReference(self); +- self->ob_refcnt = refcnt; ++ __Pyx_SET_REFCNT(self, refcnt); + } + #if CYTHON_COMPILING_IN_CPYTHON +- assert(PyType_IS_GC(self->ob_type) && ++ assert(PyType_IS_GC(Py_TYPE(self)) && + _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED); + _Py_DEC_REFTOTAL; + #endif +@@ -19085,6 +19981,27 @@ __Pyx_Coroutine_set_qualname(__pyx_CoroutineObject *self, PyObject *value, CYTHO + Py_XDECREF(tmp); + return 0; + } ++static PyObject * ++__Pyx_Coroutine_get_frame(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context) ++{ ++ PyObject *frame = self->gi_frame; ++ if (!frame) { ++ if (unlikely(!self->gi_code)) { ++ Py_RETURN_NONE; ++ } ++ frame = (PyObject *) PyFrame_New( ++ PyThreadState_Get(), /*PyThreadState *tstate,*/ ++ (PyCodeObject*) self->gi_code, /*PyCodeObject *code,*/ ++ __pyx_d, /*PyObject *globals,*/ ++ 0 /*PyObject *locals*/ ++ ); ++ if (unlikely(!frame)) ++ return NULL; ++ self->gi_frame = frame; ++ } ++ Py_INCREF(frame); ++ return frame; ++} + static __pyx_CoroutineObject *__Pyx__Coroutine_New( + PyTypeObject* type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, + PyObject *name, PyObject *qualname, PyObject *module_name) { +@@ -19118,6 +20035,7 @@ static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit( + gen->gi_modulename = module_name; + Py_XINCREF(code); + gen->gi_code = code; ++ gen->gi_frame = NULL; + PyObject_GC_Track(gen); + return gen; + } +@@ -19241,6 +20159,8 @@ static PyGetSetDef __pyx_Generator_getsets[] = { + (char*) PyDoc_STR("name of the generator"), 0}, + {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname, + (char*) PyDoc_STR("qualified name of the generator"), 0}, ++ {(char *) "gi_frame", (getter)__Pyx_Coroutine_get_frame, NULL, ++ (char*) PyDoc_STR("Frame of the generator"), 0}, + {0, 0, 0, 0, 0} + }; + static PyTypeObject __pyx_GeneratorType_type = { +@@ -19300,6 +20220,15 @@ static PyTypeObject __pyx_GeneratorType_type = { + #elif PY_VERSION_HEX >= 0x030400a1 + 0, + #endif ++#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, ++#endif ++#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, ++#endif ++#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, ++#endif + }; + static int __pyx_Generator_init(void) { + __pyx_GeneratorType_type.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; +@@ -19313,11 +20242,33 @@ static int __pyx_Generator_init(void) { + + /* 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 ctversion[5]; ++ int same=1, i, found_dot; ++ const char* rt_from_call = Py_GetVersion(); ++ PyOS_snprintf(ctversion, 5, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); ++ found_dot = 0; ++ for (i = 0; i < 4; i++) { ++ if (!ctversion[i]) { ++ same = (rt_from_call[i] < '0' || rt_from_call[i] > '9'); ++ break; ++ } ++ if (rt_from_call[i] != ctversion[i]) { ++ same = 0; ++ break; ++ } ++ } ++ if (!same) { ++ char rtversion[5] = {'\0'}; + char message[200]; ++ for (i=0; i<4; ++i) { ++ if (rt_from_call[i] == '.') { ++ if (found_dot) break; ++ found_dot = 1; ++ } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') { ++ break; ++ } ++ rtversion[i] = rt_from_call[i]; ++ } + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", +@@ -19666,6 +20617,23 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_DECREF(x); + return ival; + } ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { ++ if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { ++ return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); ++#if PY_MAJOR_VERSION < 3 ++ } else if (likely(PyInt_CheckExact(o))) { ++ return PyInt_AS_LONG(o); ++#endif ++ } else { ++ Py_ssize_t ival; ++ PyObject *x; ++ x = PyNumber_Index(o); ++ if (!x) return -1; ++ ival = PyInt_AsLong(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); + } +diff --git a/khmer/_oxli/readaligner.cpp b/khmer/_oxli/readaligner.cpp +index 2919bb13..a2bb6fd9 100644 +--- a/khmer/_oxli/readaligner.cpp ++++ b/khmer/_oxli/readaligner.cpp +@@ -1,15 +1,17 @@ +-/* Generated by Cython 0.29.2 */ ++/* Generated by Cython 0.29.32 */ + ++#ifndef PY_SSIZE_T_CLEAN + #define PY_SSIZE_T_CLEAN ++#endif /* 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_2" +-#define CYTHON_HEX_VERSION 0x001D02F0 +-#define CYTHON_FUTURE_DIVISION 1 ++#define CYTHON_ABI "0_29_32" ++#define CYTHON_HEX_VERSION 0x001D20F0 ++#define CYTHON_FUTURE_DIVISION 0 + #include + #ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +@@ -47,6 +49,7 @@ + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP +@@ -83,10 +86,14 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC (PYPY_VERSION_HEX >= 0x07030900) ++ #endif + #elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -124,10 +131,59 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 ++ #endif ++#elif defined(PY_NOGIL) ++ #define CYTHON_COMPILING_IN_PYPY 0 ++ #define CYTHON_COMPILING_IN_PYSTON 0 ++ #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 1 ++ #ifndef CYTHON_USE_TYPE_SLOTS ++ #define CYTHON_USE_TYPE_SLOTS 1 ++ #endif ++ #undef CYTHON_USE_PYTYPE_LOOKUP ++ #define CYTHON_USE_PYTYPE_LOOKUP 0 ++ #ifndef CYTHON_USE_ASYNC_SLOTS ++ #define CYTHON_USE_ASYNC_SLOTS 1 ++ #endif ++ #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 ++ #ifndef CYTHON_PEP489_MULTI_PHASE_INIT ++ #define CYTHON_PEP489_MULTI_PHASE_INIT 1 ++ #endif ++ #ifndef CYTHON_USE_TP_FINALIZE ++ #define CYTHON_USE_TP_FINALIZE 1 ++ #endif ++ #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 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -155,7 +211,7 @@ + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif +- #if PY_VERSION_HEX < 0x030300F0 ++ #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) +@@ -170,11 +226,14 @@ + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif +- #ifndef CYTHON_FAST_THREAD_STATE ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_FAST_THREAD_STATE ++ #define CYTHON_FAST_THREAD_STATE 0 ++ #elif !defined(CYTHON_FAST_THREAD_STATE) + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL +- #define CYTHON_FAST_PYCALL 1 ++ #define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030A0000) + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) +@@ -185,15 +244,23 @@ + #ifndef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) + #endif +- #ifndef CYTHON_USE_EXC_INFO_STACK ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_USE_EXC_INFO_STACK ++ #define CYTHON_USE_EXC_INFO_STACK 0 ++ #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) + #endif ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 ++ #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" ++ #if PY_MAJOR_VERSION < 3 ++ #include "longintrepr.h" ++ #endif + #undef SHIFT + #undef BASE + #undef MASK +@@ -324,8 +391,72 @@ class __Pyx_FakeReference { + #define __Pyx_DefaultClassType PyClass_Type + #else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" ++ #define __Pyx_DefaultClassType PyType_Type ++#if PY_VERSION_HEX >= 0x030B00A1 ++ static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int k, int l, int s, int f, ++ PyObject *code, PyObject *c, PyObject* n, PyObject *v, ++ PyObject *fv, PyObject *cell, PyObject* fn, ++ PyObject *name, int fline, PyObject *lnos) { ++ PyObject *kwds=NULL, *argcount=NULL, *posonlyargcount=NULL, *kwonlyargcount=NULL; ++ PyObject *nlocals=NULL, *stacksize=NULL, *flags=NULL, *replace=NULL, *call_result=NULL, *empty=NULL; ++ const char *fn_cstr=NULL; ++ const char *name_cstr=NULL; ++ PyCodeObject* co=NULL; ++ PyObject *type, *value, *traceback; ++ PyErr_Fetch(&type, &value, &traceback); ++ if (!(kwds=PyDict_New())) goto end; ++ if (!(argcount=PyLong_FromLong(a))) goto end; ++ if (PyDict_SetItemString(kwds, "co_argcount", argcount) != 0) goto end; ++ if (!(posonlyargcount=PyLong_FromLong(0))) goto end; ++ if (PyDict_SetItemString(kwds, "co_posonlyargcount", posonlyargcount) != 0) goto end; ++ if (!(kwonlyargcount=PyLong_FromLong(k))) goto end; ++ if (PyDict_SetItemString(kwds, "co_kwonlyargcount", kwonlyargcount) != 0) goto end; ++ if (!(nlocals=PyLong_FromLong(l))) goto end; ++ if (PyDict_SetItemString(kwds, "co_nlocals", nlocals) != 0) goto end; ++ if (!(stacksize=PyLong_FromLong(s))) goto end; ++ if (PyDict_SetItemString(kwds, "co_stacksize", stacksize) != 0) goto end; ++ if (!(flags=PyLong_FromLong(f))) goto end; ++ if (PyDict_SetItemString(kwds, "co_flags", flags) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_code", code) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_consts", c) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_names", n) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_varnames", v) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_freevars", fv) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_cellvars", cell) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_linetable", lnos) != 0) goto end; ++ if (!(fn_cstr=PyUnicode_AsUTF8AndSize(fn, NULL))) goto end; ++ if (!(name_cstr=PyUnicode_AsUTF8AndSize(name, NULL))) goto end; ++ if (!(co = PyCode_NewEmpty(fn_cstr, name_cstr, fline))) goto end; ++ if (!(replace = PyObject_GetAttrString((PyObject*)co, "replace"))) goto cleanup_code_too; ++ if (!(empty = PyTuple_New(0))) goto cleanup_code_too; // unfortunately __pyx_empty_tuple isn't available here ++ if (!(call_result = PyObject_Call(replace, empty, kwds))) goto cleanup_code_too; ++ Py_XDECREF((PyObject*)co); ++ co = (PyCodeObject*)call_result; ++ call_result = NULL; ++ if (0) { ++ cleanup_code_too: ++ Py_XDECREF((PyObject*)co); ++ co = NULL; ++ } ++ end: ++ Py_XDECREF(kwds); ++ Py_XDECREF(argcount); ++ Py_XDECREF(posonlyargcount); ++ Py_XDECREF(kwonlyargcount); ++ Py_XDECREF(nlocals); ++ Py_XDECREF(stacksize); ++ Py_XDECREF(replace); ++ Py_XDECREF(call_result); ++ Py_XDECREF(empty); ++ if (type) { ++ PyErr_Restore(type, value, traceback); ++ } ++ return co; ++ } ++#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 +@@ -360,26 +491,6 @@ class __Pyx_FakeReference { + #else + #define __Pyx_PyFastCFunction_Check(func) 0 + #endif +-#if CYTHON_USE_DICT_VERSIONS +-#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);\ +- }\ +- } +-#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 + #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) +@@ -412,7 +523,7 @@ class __Pyx_FakeReference { + typedef int Py_tss_t; + static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); +- return 0; // PyThread_create_key reports success always ++ 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)); +@@ -435,7 +546,7 @@ static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); + } +-#endif // TSS (Thread Specific Storage) API ++#endif + #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) + #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) + #else +@@ -455,8 +566,12 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #endif + #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 ++ #if defined(PyUnicode_IS_READY) + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) ++ #else ++ #define __Pyx_PyUnicode_READY(op) (0) ++ #endif + #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) +@@ -464,7 +579,15 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) ++ #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) ++ #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) ++ #endif ++ #else ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) ++ #endif + #else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 +@@ -513,8 +636,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) +@@ -525,6 +650,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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 +@@ -558,13 +690,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong +- #define __Pyx_PyInt_AsHash_t PyInt_AsLong ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t + #else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t +- #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t + #endif + #if PY_MAJOR_VERSION >= 3 +- #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func)) ++ #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 +@@ -586,8 +718,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + } __Pyx_PyAsyncMethodsStruct; + #endif + +-#if defined(WIN32) || defined(MS_WINDOWS) +- #define _USE_MATH_DEFINES ++#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) ++ #if !defined(_USE_MATH_DEFINES) ++ #define _USE_MATH_DEFINES ++ #endif + #endif + #include + #ifdef NAN +@@ -605,11 +739,10 @@ static CYTHON_INLINE float __PYX_NAN() { + #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_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ +-} ++ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + + #ifndef __PYX_EXTERN_C + #ifdef __cplusplus +@@ -623,13 +756,25 @@ static CYTHON_INLINE float __PYX_NAN() { + #define __PYX_HAVE_API__khmer___oxli__readaligner + /* Early includes */ + #include ++#include + #include "ios" + #include "new" + #include "stdexcept" + #include "typeinfo" +-#include + #include + #include ++ ++ #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600) ++ // move should be defined for these versions of MSVC, but __cplusplus isn't set usefully ++ #include ++ ++ namespace cython_std { ++ template typename std::remove_reference::type&& move(T& t) noexcept { return std::move(t); } ++ template typename std::remove_reference::type&& move(T&& t) noexcept { return std::move(t); } ++ } ++ ++ #endif ++ + #include + #include + #include +@@ -663,10 +808,11 @@ typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* enc + 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_DEFAULT 0 +-#define __PYX_DEFAULT_STRING_ENCODING "utf8" +-#define __Pyx_PyObject_FromString __Pyx_PyUnicode_FromString +-#define __Pyx_PyObject_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize ++#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) (\ +@@ -746,6 +892,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); + (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); ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); + #if CYTHON_ASSUME_SAFE_MACROS + #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) + #else +@@ -1603,7 +1750,7 @@ static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObje + #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, int nargs, PyObject *kwargs); ++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 +@@ -1612,13 +1759,21 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + #ifndef Py_MEMBER_SIZE + #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) + #endif ++#if CYTHON_FAST_PYCALL + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + #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 // CYTHON_FAST_PYCALL + #endif + + /* PyObjectCallMethO.proto */ +@@ -1662,6 +1817,32 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); + #define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL) + #endif + ++/* 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) {\ +@@ -1774,7 +1955,7 @@ static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { + if (likely(L->allocated > len)) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); +- Py_SIZE(list) = len+1; ++ __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +@@ -1800,6 +1981,17 @@ static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_nam + /* SetVTable.proto */ + static int __Pyx_SetVtable(PyObject *dict, void *vtable); + ++/* 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 ++ ++/* PyObjectGetAttrStrNoError.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); ++ + /* SetupReduce.proto */ + static int __Pyx_setup_reduce(PyObject* type_obj); + +@@ -1852,6 +2044,11 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + /* None.proto */ + #include + ++/* GCCDiagnostics.proto */ ++#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) ++#define __Pyx_HAS_GCC_DIAGNOSTIC ++#endif ++ + /* CppExceptionConversion.proto */ + #ifndef __Pyx_CppExn2PyErr + #include +@@ -1894,12 +2091,12 @@ static void __Pyx_CppExn2PyErr() { + } + #endif + +-/* CIntToPy.proto */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_BoundedCounterType(oxli::BoundedCounterType value); +- + /* CIntFromPy.proto */ + static CYTHON_INLINE oxli::BoundedCounterType __Pyx_PyInt_As_oxli_3a__3a_BoundedCounterType(PyObject *); + ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_BoundedCounterType(oxli::BoundedCounterType value); ++ + /* CIntFromPy.proto */ + static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *); + +@@ -2052,7 +2249,7 @@ static PyObject *__pyx_n_s_cline_in_traceback; + static PyObject *__pyx_n_s_count_graph; + static PyObject *__pyx_n_s_enter; + static PyObject *__pyx_n_s_exit; +-static PyObject *__pyx_n_u_filename; ++static PyObject *__pyx_n_s_filename; + static PyObject *__pyx_n_s_getstate; + static PyObject *__pyx_n_s_import; + static PyObject *__pyx_n_s_json; +@@ -2069,11 +2266,11 @@ 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_u_scoring_matrix; ++static PyObject *__pyx_n_s_scoring_matrix; + static PyObject *__pyx_n_s_setstate; + static PyObject *__pyx_n_s_setstate_cython; + static PyObject *__pyx_n_s_test; +-static PyObject *__pyx_n_u_transition_probabilities; ++static PyObject *__pyx_n_s_transition_probabilities; + static PyObject *__pyx_n_s_trusted_cov_cutoff; + static PyObject *__pyx_n_s_upper; + static int __pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner___cinit__(struct __pyx_obj_5khmer_5_oxli_11readaligner_ReadAligner *__pyx_v_self, struct __pyx_obj_5khmer_5_oxli_6graphs_Countgraph *__pyx_v_count_graph, oxli::BoundedCounterType __pyx_v_trusted_cov_cutoff, double __pyx_v_bits_theta, CYTHON_UNUSED PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */ +@@ -2111,6 +2308,9 @@ static int __pyx_pw_5khmer_5_oxli_11readaligner_11ReadAligner_1__cinit__(PyObjec + double __pyx_v_bits_theta; + CYTHON_UNUSED PyObject *__pyx_v_args = 0; + PyObject *__pyx_v_kwargs = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -2233,6 +2433,9 @@ static int __pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner___cinit__(struct _ + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + std::shared_ptr __pyx_t_12; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "khmer/_oxli/readaligner.pyx":61 +@@ -2260,7 +2463,7 @@ static int __pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner___cinit__(struct _ + * with open(kwargs.pop('filename')) as paramfile: + * params = json.load(paramfile) + */ +- __pyx_t_1 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_filename, __pyx_v_kwargs, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 64, __pyx_L1_error) ++ __pyx_t_1 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_filename, __pyx_v_kwargs, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 64, __pyx_L1_error) + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + +@@ -2272,7 +2475,7 @@ static int __pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner___cinit__(struct _ + * _fill(_scoring_matrix, params['scoring_matrix']) + */ + /*with:*/ { +- __pyx_t_3 = __Pyx_PyDict_Pop(__pyx_v_kwargs, __pyx_n_u_filename, ((PyObject *)NULL)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 65, __pyx_L1_error) ++ __pyx_t_3 = __Pyx_PyDict_Pop(__pyx_v_kwargs, __pyx_n_s_filename, ((PyObject *)NULL)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 65, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_open, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 65, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); +@@ -2354,10 +2557,10 @@ static int __pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner___cinit__(struct _ + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L13_try_end; + __pyx_L8_error:; +- __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; +- __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; ++ __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; ++ __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + /*except:*/ { + __Pyx_AddTraceback("khmer._oxli.readaligner.ReadAligner.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_3, &__pyx_t_4) < 0) __PYX_ERR(0, 65, __pyx_L10_except_error) +@@ -2430,7 +2633,7 @@ static int __pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner___cinit__(struct _ + * else: + */ + if (unlikely(!__pyx_v_params)) { __Pyx_RaiseUnboundLocalError("params"); __PYX_ERR(0, 67, __pyx_L1_error) } +- __pyx_t_4 = __Pyx_PyObject_Dict_GetItem(__pyx_v_params, __pyx_n_u_scoring_matrix); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 67, __pyx_L1_error) ++ __pyx_t_4 = __Pyx_PyObject_Dict_GetItem(__pyx_v_params, __pyx_n_s_scoring_matrix); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 67, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_f_5khmer_5_oxli_5utils__fill(__pyx_v__scoring_matrix, __pyx_t_4); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; +@@ -2443,7 +2646,7 @@ static int __pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner___cinit__(struct _ + * if 'scoring_matrix' in kwargs: + */ + if (unlikely(!__pyx_v_params)) { __Pyx_RaiseUnboundLocalError("params"); __PYX_ERR(0, 68, __pyx_L1_error) } +- __pyx_t_4 = __Pyx_PyObject_Dict_GetItem(__pyx_v_params, __pyx_n_u_transition_probabilities); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 68, __pyx_L1_error) ++ __pyx_t_4 = __Pyx_PyObject_Dict_GetItem(__pyx_v_params, __pyx_n_s_transition_probabilities); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 68, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_f_5khmer_5_oxli_5utils__flatten_fill(__pyx_v__transitions, __pyx_t_4); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; +@@ -2466,7 +2669,7 @@ static int __pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner___cinit__(struct _ + * kwargs.pop('scoring_matrix')) + */ + /*else*/ { +- __pyx_t_1 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_scoring_matrix, __pyx_v_kwargs, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 70, __pyx_L1_error) ++ __pyx_t_1 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_scoring_matrix, __pyx_v_kwargs, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 70, __pyx_L1_error) + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + +@@ -2477,7 +2680,7 @@ static int __pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner___cinit__(struct _ + * if 'transition_probabilities' in kwargs: + * _flatten_fill(_transitions, + */ +- __pyx_t_4 = __Pyx_PyDict_Pop(__pyx_v_kwargs, __pyx_n_u_scoring_matrix, ((PyObject *)NULL)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 72, __pyx_L1_error) ++ __pyx_t_4 = __Pyx_PyDict_Pop(__pyx_v_kwargs, __pyx_n_s_scoring_matrix, ((PyObject *)NULL)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + + /* "khmer/_oxli/readaligner.pyx":71 +@@ -2506,7 +2709,7 @@ static int __pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner___cinit__(struct _ + * _flatten_fill(_transitions, + * kwargs.pop('transition_probabilities')) + */ +- __pyx_t_2 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_transition_probabilities, __pyx_v_kwargs, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 73, __pyx_L1_error) ++ __pyx_t_2 = (__Pyx_PyDict_ContainsTF(__pyx_n_s_transition_probabilities, __pyx_v_kwargs, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 73, __pyx_L1_error) + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { + +@@ -2517,7 +2720,7 @@ static int __pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner___cinit__(struct _ + * + * self._aln_this = make_shared[CpReadAligner](count_graph._cg_this.get(), + */ +- __pyx_t_4 = __Pyx_PyDict_Pop(__pyx_v_kwargs, __pyx_n_u_transition_probabilities, ((PyObject *)NULL)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 75, __pyx_L1_error) ++ __pyx_t_4 = __Pyx_PyDict_Pop(__pyx_v_kwargs, __pyx_n_s_transition_probabilities, ((PyObject *)NULL)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 75, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + + /* "khmer/_oxli/readaligner.pyx":74 +@@ -2604,12 +2807,14 @@ static int __pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner___cinit__(struct _ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_11readaligner_11ReadAligner_3align(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_11readaligner_11ReadAligner_2align[] = "ReadAligner.align(self, unicode sequence)"; + static PyObject *__pyx_pw_5khmer_5_oxli_11readaligner_11ReadAligner_3align(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("align (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(0, 84, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(0, 84, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_2align(((struct __pyx_obj_5khmer_5_oxli_11readaligner_ReadAligner *)__pyx_v_self), ((PyObject*)__pyx_v_sequence)); + + /* function exit code */ +@@ -2635,6 +2840,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_2align(struc + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("align", 0); + + /* "khmer/_oxli/readaligner.pyx":85 +@@ -2678,7 +2886,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_2align(struc + * cdef object read_alignment = aln[0].read_alignment + * cdef object truncated = aln[0].truncated + */ +- __pyx_t_1 = __pyx_convert_PyUnicode_string_to_py_std__in_string((__pyx_v_aln[0]).graph_alignment); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 89, __pyx_L1_error) ++ __pyx_t_1 = __pyx_convert_PyBytes_string_to_py_std__in_string((__pyx_v_aln[0]).graph_alignment); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 89, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_alignment = __pyx_t_1; + __pyx_t_1 = 0; +@@ -2690,7 +2898,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_2align(struc + * cdef object truncated = aln[0].truncated + * + */ +- __pyx_t_1 = __pyx_convert_PyUnicode_string_to_py_std__in_string((__pyx_v_aln[0]).read_alignment); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 90, __pyx_L1_error) ++ __pyx_t_1 = __pyx_convert_PyBytes_string_to_py_std__in_string((__pyx_v_aln[0]).read_alignment); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 90, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_read_alignment = __pyx_t_1; + __pyx_t_1 = 0; +@@ -2803,12 +3011,14 @@ static PyObject *__pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_2align(struc + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_11readaligner_11ReadAligner_5align_forward(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_11readaligner_11ReadAligner_4align_forward[] = "ReadAligner.align_forward(self, unicode sequence)"; + static PyObject *__pyx_pw_5khmer_5_oxli_11readaligner_11ReadAligner_5align_forward(PyObject *__pyx_v_self, PyObject *__pyx_v_sequence) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("align_forward (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyUnicode_Type), 1, "sequence", 1))) __PYX_ERR(0, 98, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sequence), (&PyString_Type), 1, "sequence", 1))) __PYX_ERR(0, 98, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_4align_forward(((struct __pyx_obj_5khmer_5_oxli_11readaligner_ReadAligner *)__pyx_v_self), ((PyObject*)__pyx_v_sequence)); + + /* function exit code */ +@@ -2835,6 +3045,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_4align_forwa + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("align_forward", 0); + + /* "khmer/_oxli/readaligner.pyx":99 +@@ -2878,7 +3091,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_4align_forwa + * cdef object read_alignment = aln[0].read_alignment + * cdef object truncated = aln[0].truncated + */ +- __pyx_t_1 = __pyx_convert_PyUnicode_string_to_py_std__in_string((__pyx_v_aln[0]).graph_alignment); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 103, __pyx_L1_error) ++ __pyx_t_1 = __pyx_convert_PyBytes_string_to_py_std__in_string((__pyx_v_aln[0]).graph_alignment); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 103, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_alignment = __pyx_t_1; + __pyx_t_1 = 0; +@@ -2890,7 +3103,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_4align_forwa + * cdef object truncated = aln[0].truncated + * cdef list covs = aln[0].covs + */ +- __pyx_t_1 = __pyx_convert_PyUnicode_string_to_py_std__in_string((__pyx_v_aln[0]).read_alignment); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 104, __pyx_L1_error) ++ __pyx_t_1 = __pyx_convert_PyBytes_string_to_py_std__in_string((__pyx_v_aln[0]).read_alignment); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 104, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_read_alignment = __pyx_t_1; + __pyx_t_1 = 0; +@@ -3108,6 +3321,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_11readaligner_11ReadAligner__format_scori + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_format_scoring_matrix", 0); + + /* "khmer/_oxli/readaligner.pyx":121 +@@ -3188,6 +3404,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_11readaligner_11ReadAligner__format_trans + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_format_transition_probabilities", 0); + + /* "khmer/_oxli/readaligner.pyx":125 +@@ -3571,6 +3790,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_20defaultSco + 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("__get__", 0); + + /* "khmer/_oxli/readaligner.pyx":140 +@@ -3631,6 +3853,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_30defaultTra + 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("__get__", 0); + + /* "khmer/_oxli/readaligner.pyx":144 +@@ -3696,6 +3921,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_14scoring_ma + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "khmer/_oxli/readaligner.pyx":153 +@@ -3822,6 +4050,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_24transition + 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("__get__", 0); + + /* "khmer/_oxli/readaligner.pyx":180 +@@ -3919,6 +4150,9 @@ static int __pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_5graph_2__set__(st + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 0); + if (!(likely(((__pyx_v_value) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_value, __pyx_ptype_5khmer_5_oxli_6graphs_Countgraph))))) __PYX_ERR(2, 96, __pyx_L1_error) + __pyx_t_1 = __pyx_v_value; +@@ -3978,7 +4212,6 @@ static int __pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_5graph_4__del__(st + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_11readaligner_11ReadAligner_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_11readaligner_11ReadAligner_6__reduce_cython__[] = "ReadAligner.__reduce_cython__(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_11readaligner_11ReadAligner_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -3994,6 +4227,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_6__reduce_cy + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -4033,7 +4269,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_6__reduce_cy + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_11readaligner_11ReadAligner_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_11readaligner_11ReadAligner_8__setstate_cython__[] = "ReadAligner.__setstate_cython__(self, __pyx_state)"; + static PyObject *__pyx_pw_5khmer_5_oxli_11readaligner_11ReadAligner_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -4049,6 +4284,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_8__setstate_ + 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)":4 +@@ -4083,7 +4321,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_11readaligner_11ReadAligner_8__setstate_ + * + * @cname("__pyx_convert_string_from_py_std__in_string") + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: # <<<<<<<<<<<<<< +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + */ + +@@ -4093,11 +4331,23 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + std::string __pyx_r; + __Pyx_RefNannyDeclarations + char const *__pyx_t_1; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_string_from_py_std__in_string", 0); + ++ /* "string.from_py":14 ++ * @cname("__pyx_convert_string_from_py_std__in_string") ++ * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: ++ * cdef Py_ssize_t length = 0 # <<<<<<<<<<<<<< ++ * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) ++ * return string(data, length) ++ */ ++ __pyx_v_length = 0; ++ + /* "string.from_py":15 + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) # <<<<<<<<<<<<<< + * return string(data, length) + * +@@ -4106,7 +4356,7 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + __pyx_v_data = __pyx_t_1; + + /* "string.from_py":16 +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + * return string(data, length) # <<<<<<<<<<<<<< + * +@@ -4119,7 +4369,7 @@ static std::string __pyx_convert_string_from_py_std__in_string(PyObject *__pyx_v + * + * @cname("__pyx_convert_string_from_py_std__in_string") + * cdef string __pyx_convert_string_from_py_std__in_string(object o) except *: # <<<<<<<<<<<<<< +- * cdef Py_ssize_t length ++ * cdef Py_ssize_t length = 0 + * cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length) + */ + +@@ -4144,6 +4394,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyObject_string_to_py_std__in_strin + 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("__pyx_convert_PyObject_string_to_py_std__in_string", 0); + + /* "string.to_py":32 +@@ -4191,6 +4444,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyUnicode_string_to_py_std__in_stri + 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("__pyx_convert_PyUnicode_string_to_py_std__in_string", 0); + + /* "string.to_py":38 +@@ -4238,6 +4494,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyStr_string_to_py_std__in_string(s + 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("__pyx_convert_PyStr_string_to_py_std__in_string", 0); + + /* "string.to_py":44 +@@ -4285,6 +4544,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyBytes_string_to_py_std__in_string + 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("__pyx_convert_PyBytes_string_to_py_std__in_string", 0); + + /* "string.to_py":50 +@@ -4332,6 +4594,9 @@ static CYTHON_INLINE PyObject *__pyx_convert_PyByteArray_string_to_py_std__in_st + 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("__pyx_convert_PyByteArray_string_to_py_std__in_string", 0); + + /* "string.to_py":56 +@@ -4383,6 +4648,9 @@ static PyObject *__pyx_convert_vector_to_py_oxli_3a__3a_BoundedCounterType(const + size_t __pyx_t_3; + size_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_vector_to_py_oxli_3a__3a_BoundedCounterType", 0); + + /* "vector.to_py":61 +@@ -4510,10 +4778,10 @@ static int __pyx_setprop_5khmer_5_oxli_11readaligner_11ReadAligner_graph(PyObjec + } + + static PyMethodDef __pyx_methods_5khmer_5_oxli_11readaligner_ReadAligner[] = { +- {"align", (PyCFunction)__pyx_pw_5khmer_5_oxli_11readaligner_11ReadAligner_3align, METH_O, __pyx_doc_5khmer_5_oxli_11readaligner_11ReadAligner_2align}, +- {"align_forward", (PyCFunction)__pyx_pw_5khmer_5_oxli_11readaligner_11ReadAligner_5align_forward, METH_O, __pyx_doc_5khmer_5_oxli_11readaligner_11ReadAligner_4align_forward}, +- {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_11readaligner_11ReadAligner_7__reduce_cython__, METH_NOARGS, __pyx_doc_5khmer_5_oxli_11readaligner_11ReadAligner_6__reduce_cython__}, +- {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_11readaligner_11ReadAligner_9__setstate_cython__, METH_O, __pyx_doc_5khmer_5_oxli_11readaligner_11ReadAligner_8__setstate_cython__}, ++ {"align", (PyCFunction)__pyx_pw_5khmer_5_oxli_11readaligner_11ReadAligner_3align, METH_O, 0}, ++ {"align_forward", (PyCFunction)__pyx_pw_5khmer_5_oxli_11readaligner_11ReadAligner_5align_forward, METH_O, 0}, ++ {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_11readaligner_11ReadAligner_7__reduce_cython__, METH_NOARGS, 0}, ++ {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_11readaligner_11ReadAligner_9__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} + }; + +@@ -4522,7 +4790,7 @@ static struct PyGetSetDef __pyx_getsets_5khmer_5_oxli_11readaligner_ReadAligner[ + {(char *)"defaultTransitionProbabilities", __pyx_getprop_5khmer_5_oxli_11readaligner_11ReadAligner_defaultTransitionProbabilities, 0, (char *)0, 0}, + {(char *)"scoring_matrix", __pyx_getprop_5khmer_5_oxli_11readaligner_11ReadAligner_scoring_matrix, 0, (char *)"Get the scoring matrix in use.\n\n Returns a tuple of floats: \n (trusted_match, trusted_mismatch, untrusted_match, untrusted_mismatch)\n ", 0}, + {(char *)"transition_probabilities", __pyx_getprop_5khmer_5_oxli_11readaligner_11ReadAligner_transition_probabilities, 0, (char *)"Get the transition probabilties in use.\n\n HMM state notation abbreviations:\n M_t - trusted match; M_u - untrusted match\n Ir_t - trusted read insert; Ir_u - untrusted read insert\n Ig_t - trusted graph insert; Ig_u - untrusted graph insert\n\n Returns a sparse matrix as a tuple of six tuples.\n The inner tuples contain 6, 4, 4, 6, 4, and 4 floats respectively.\n Transition are notated as 'StartState-NextState':\n (\n ( M_t-M_t, M_t-Ir_t, M_t-Ig_t, M_t-M_u, M_t-Ir_u, M_t-Ig_u),\n (Ir_t-M_t, Ir_t-Ir_t, Ir_t-M_u, Ir_t-Ir_u ),\n (Ig_t-M_t, , Ig_t-Ig_t, Ig_t-M_u, Ig_t-Ig_u),\n ( M_u-M_t, M_u-Ir_t, M_u-Ig_t, M_u-M_u, M_u-Ir_u, M_u-Ig_u),\n (Ir_u-M_t, Ir_u-Ir_t, Ir_u-M_u, Ir_u-Ir_u ),\n (Ig_u-M_t, , Ig_u-Ig_t, Ig_u-M_u, Ig_u-Ig_u)\n )", 0}, +- {(char *)"graph", __pyx_getprop_5khmer_5_oxli_11readaligner_11ReadAligner_graph, __pyx_setprop_5khmer_5_oxli_11readaligner_11ReadAligner_graph, (char *)"graph: khmer._oxli.graphs.Countgraph", 0}, ++ {(char *)"graph", __pyx_getprop_5khmer_5_oxli_11readaligner_11ReadAligner_graph, __pyx_setprop_5khmer_5_oxli_11readaligner_11ReadAligner_graph, (char *)0, 0}, + {0, 0, 0, 0, 0} + }; + +@@ -4532,7 +4800,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_11readaligner_ReadAligner = { + sizeof(struct __pyx_obj_5khmer_5_oxli_11readaligner_ReadAligner), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_11readaligner_ReadAligner, /*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 +@@ -4582,6 +4855,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_11readaligner_ReadAligner = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static PyMethodDef __pyx_methods[] = { +@@ -4637,7 +4919,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_count_graph, __pyx_k_count_graph, sizeof(__pyx_k_count_graph), 0, 0, 1, 1}, + {&__pyx_n_s_enter, __pyx_k_enter, sizeof(__pyx_k_enter), 0, 0, 1, 1}, + {&__pyx_n_s_exit, __pyx_k_exit, sizeof(__pyx_k_exit), 0, 0, 1, 1}, +- {&__pyx_n_u_filename, __pyx_k_filename, sizeof(__pyx_k_filename), 0, 1, 0, 1}, ++ {&__pyx_n_s_filename, __pyx_k_filename, sizeof(__pyx_k_filename), 0, 0, 1, 1}, + {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_json, __pyx_k_json, sizeof(__pyx_k_json), 0, 0, 1, 1}, +@@ -4654,11 +4936,11 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__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_u_scoring_matrix, __pyx_k_scoring_matrix, sizeof(__pyx_k_scoring_matrix), 0, 1, 0, 1}, ++ {&__pyx_n_s_scoring_matrix, __pyx_k_scoring_matrix, sizeof(__pyx_k_scoring_matrix), 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_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, +- {&__pyx_n_u_transition_probabilities, __pyx_k_transition_probabilities, sizeof(__pyx_k_transition_probabilities), 0, 1, 0, 1}, ++ {&__pyx_n_s_transition_probabilities, __pyx_k_transition_probabilities, sizeof(__pyx_k_transition_probabilities), 0, 0, 1, 1}, + {&__pyx_n_s_trusted_cov_cutoff, __pyx_k_trusted_cov_cutoff, sizeof(__pyx_k_trusted_cov_cutoff), 0, 0, 1, 1}, + {&__pyx_n_s_upper, __pyx_k_upper, sizeof(__pyx_k_upper), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} +@@ -4754,6 +5036,9 @@ static int __Pyx_modinit_function_export_code(void) { + + 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_5khmer_5_oxli_11readaligner_ReadAligner = &__pyx_vtable_5khmer_5_oxli_11readaligner_ReadAligner; +@@ -4762,7 +5047,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtable_5khmer_5_oxli_11readaligner_ReadAligner._format_scoring_matrix = (PyObject *(*)(double *))__pyx_f_5khmer_5_oxli_11readaligner_11ReadAligner__format_scoring_matrix; + __pyx_vtable_5khmer_5_oxli_11readaligner_ReadAligner._format_transition_probabilities = (PyObject *(*)(double *))__pyx_f_5khmer_5_oxli_11readaligner_11ReadAligner__format_transition_probabilities; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_11readaligner_ReadAligner) < 0) __PYX_ERR(0, 13, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_11readaligner_ReadAligner.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_11readaligner_ReadAligner.tp_dictoffset && __pyx_type_5khmer_5_oxli_11readaligner_ReadAligner.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_11readaligner_ReadAligner.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -4780,6 +5067,9 @@ static int __Pyx_modinit_type_init_code(void) { + 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("khmer._oxli.hashing"); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 62, __pyx_L1_error) +@@ -4871,12 +5161,16 @@ static int __Pyx_modinit_variable_import_code(void) { + static int __Pyx_modinit_function_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_function_import_code", 0); + /*--- Function import code ---*/ + __pyx_t_1 = PyImport_ImportModule("khmer._oxli.utils"); if (!__pyx_t_1) __PYX_ERR(0, 1, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_1); + if (__Pyx_ImportFunction(__pyx_t_1, "_flatten_fill", (void (**)(void))&__pyx_f_5khmer_5_oxli_5utils__flatten_fill, "void (double *, PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_ImportFunction(__pyx_t_1, "_fill", (void (**)(void))&__pyx_f_5khmer_5_oxli_5utils__fill, "void (double *, PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) +- Py_DECREF(__pyx_t_1); __pyx_t_1 = 0; ++ __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; +@@ -4886,17 +5180,19 @@ static int __Pyx_modinit_function_import_code(void) { + } + + +-#if PY_MAJOR_VERSION < 3 +-#ifdef CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC void +-#else ++#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 CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC PyObject * ++#ifdef __cplusplus ++#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * + #else +-#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC ++#define __Pyx_PyMODINIT_FUNC PyObject * + #endif + #endif + +@@ -4979,6 +5275,9 @@ static CYTHON_SMALL_CODE int __pyx_pymod_exec_readaligner(PyObject *__pyx_pyinit + { + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { +@@ -5026,11 +5325,9 @@ if (!__Pyx_RefNanny) { + #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? */ ++ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif +- #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; +@@ -5046,10 +5343,9 @@ if (!__Pyx_RefNanny) { + __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) +- __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) +- #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); +- #endif ++ __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) +@@ -5075,10 +5371,10 @@ if (!__Pyx_RefNanny) { + (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)) goto __pyx_L1_error; +- if (unlikely(__Pyx_modinit_type_import_code() != 0)) goto __pyx_L1_error; ++ 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(); +- if (unlikely(__Pyx_modinit_function_import_code() != 0)) goto __pyx_L1_error; ++ if (unlikely(__Pyx_modinit_function_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) +@@ -5091,7 +5387,7 @@ if (!__Pyx_RefNanny) { + * from math import log + * + */ +- __pyx_t_1 = __Pyx_Import(__pyx_n_s_json, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 7, __pyx_L1_error) ++ __pyx_t_1 = __Pyx_Import(__pyx_n_s_json, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_json, __pyx_t_1) < 0) __PYX_ERR(0, 7, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; +@@ -5108,7 +5404,7 @@ if (!__Pyx_RefNanny) { + __Pyx_INCREF(__pyx_n_s_log); + __Pyx_GIVEREF(__pyx_n_s_log); + PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_log); +- __pyx_t_2 = __Pyx_Import(__pyx_n_s_math, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 8, __pyx_L1_error) ++ __pyx_t_2 = __Pyx_Import(__pyx_n_s_math, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 8, __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_log); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 8, __pyx_L1_error) +@@ -5242,7 +5538,7 @@ static int __Pyx_ParseOptionalKeywords( + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 +- if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { ++ if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { +@@ -5269,7 +5565,7 @@ static int __Pyx_ParseOptionalKeywords( + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -5285,7 +5581,7 @@ static int __Pyx_ParseOptionalKeywords( + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -5373,7 +5669,7 @@ static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *nam + #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; ++ ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) +@@ -5585,7 +5881,7 @@ static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args + return result; + } + #if 1 || PY_VERSION_HEX < 0x030600B1 +-static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs) { ++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); +@@ -5656,12 +5952,12 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + } + #if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); + #else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); + #endif +@@ -5715,7 +6011,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec + 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) { ++ } else if (__Pyx_PyFastCFunction_Check(func)) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); + #endif + } +@@ -5755,6 +6051,32 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { + } + #endif + ++/* 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) +@@ -6242,6 +6564,53 @@ bad: + return -1; + } + ++/* 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; icurexc_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 ++ ++/* 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; +@@ -6262,53 +6631,81 @@ static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; ++ PyObject *object_getstate = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; ++ PyObject *getstate = NULL; + #if CYTHON_USE_PYTYPE_LOOKUP +- if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto GOOD; ++ getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); + #else +- if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto GOOD; ++ getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); ++ if (!getstate && PyErr_Occurred()) { ++ goto __PYX_BAD; ++ } + #endif ++ if (getstate) { + #if CYTHON_USE_PYTYPE_LOOKUP +- object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; ++ object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); + #else +- object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; ++ object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); ++ if (!object_getstate && PyErr_Occurred()) { ++ goto __PYX_BAD; ++ } + #endif +- reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto BAD; ++ if (object_getstate != getstate) { ++ goto __PYX_GOOD; ++ } ++ } ++#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 BAD; ++ 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 BAD; ++ 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 BAD; ++ 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_GetAttrStr(type_obj, __pyx_n_s_reduce_cython); if (unlikely(!reduce_cython)) goto BAD; +- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto BAD; +- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto BAD; ++ 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_GetAttrStr(type_obj, __pyx_n_s_setstate_cython); if (unlikely(!setstate_cython)) goto BAD; +- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto BAD; +- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto BAD; ++ 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 GOOD; +-BAD: ++ 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; +-GOOD: ++__PYX_GOOD: + #if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); ++ Py_XDECREF(object_getstate); ++ Py_XDECREF(getstate); + #endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); +@@ -6429,7 +6826,7 @@ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { +- if (strchr(__Pyx_MODULE_NAME, '.')) { ++ if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) { + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, 1); + if (!module) { +@@ -6480,7 +6877,7 @@ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + + /* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +-static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { ++static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; + #if CYTHON_COMPILING_IN_CPYTHON +@@ -6510,7 +6907,7 @@ static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + } + if (!use_cline) { + c_line = 0; +- PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); ++ (void) 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; +@@ -6584,7 +6981,7 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + 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)); ++ __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } +@@ -6604,33 +7001,40 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + #include "compile.h" + #include "frameobject.h" + #include "traceback.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + 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; ++ PyCodeObject *py_code = NULL; ++ PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 ++ PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); +- #else +- py_srcfile = PyUnicode_FromString(filename); +- #endif + if (!py_srcfile) goto bad; ++ #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; ++ funcname = PyUnicode_AsUTF8(py_funcname); ++ if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); +- #else +- py_funcname = PyUnicode_FromString(funcname); ++ if (!py_funcname) goto bad; + #endif + } +- if (!py_funcname) goto bad; ++ #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, +@@ -6649,11 +7053,16 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); +- Py_DECREF(py_funcname); ++ #else ++ py_code = PyCode_NewEmpty(filename, funcname, py_line); ++ #endif ++ Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline + return py_code; + bad: +- Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); ++ #if PY_MAJOR_VERSION < 3 ++ Py_XDECREF(py_srcfile); ++ #endif + return NULL; + } + static void __Pyx_AddTraceback(const char *funcname, int c_line, +@@ -6661,14 +7070,24 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; ++ PyObject *ptype, *pvalue, *ptraceback; + 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) { ++ __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); +- if (!py_code) goto bad; ++ if (!py_code) { ++ /* If the code object creation fails, then we should clear the ++ fetched exception references and propagate the new exception */ ++ Py_XDECREF(ptype); ++ Py_XDECREF(pvalue); ++ Py_XDECREF(ptraceback); ++ goto bad; ++ } ++ __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( +@@ -6707,40 +7126,16 @@ bad: + return (target_type) value;\ + } + +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_BoundedCounterType(oxli::BoundedCounterType value) { +- const oxli::BoundedCounterType neg_one = (oxli::BoundedCounterType) ((oxli::BoundedCounterType) 0 - (oxli::BoundedCounterType) 1), const_zero = (oxli::BoundedCounterType) 0; +- const int is_unsigned = neg_one > const_zero; +- if (is_unsigned) { +- if (sizeof(oxli::BoundedCounterType) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(oxli::BoundedCounterType) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::BoundedCounterType) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif +- } +- } else { +- if (sizeof(oxli::BoundedCounterType) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(oxli::BoundedCounterType) <= 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(oxli::BoundedCounterType), +- little, !is_unsigned); +- } +-} +- + /* CIntFromPy */ + static CYTHON_INLINE oxli::BoundedCounterType __Pyx_PyInt_As_oxli_3a__3a_BoundedCounterType(PyObject *x) { +- const oxli::BoundedCounterType neg_one = (oxli::BoundedCounterType) ((oxli::BoundedCounterType) 0 - (oxli::BoundedCounterType) 1), const_zero = (oxli::BoundedCounterType) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::BoundedCounterType neg_one = (oxli::BoundedCounterType) -1, const_zero = (oxli::BoundedCounterType) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -6927,9 +7322,54 @@ raise_neg_overflow: + return (oxli::BoundedCounterType) -1; + } + ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_BoundedCounterType(oxli::BoundedCounterType value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::BoundedCounterType neg_one = (oxli::BoundedCounterType) -1, const_zero = (oxli::BoundedCounterType) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(oxli::BoundedCounterType) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(oxli::BoundedCounterType) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::BoundedCounterType) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(oxli::BoundedCounterType) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(oxli::BoundedCounterType) <= 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(oxli::BoundedCounterType), ++ little, !is_unsigned); ++ } ++} ++ + /* CIntFromPy */ + static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *x) { +- const size_t neg_one = (size_t) ((size_t) 0 - (size_t) 1), const_zero = (size_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const size_t neg_one = (size_t) -1, const_zero = (size_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -7118,7 +7558,14 @@ raise_neg_overflow: + + /* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { +@@ -7149,7 +7596,14 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + + /* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -7338,7 +7792,14 @@ raise_neg_overflow: + + /* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +- const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const int neg_one = (int) -1, const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -7627,11 +8088,33 @@ static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObj + + /* 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 ctversion[5]; ++ int same=1, i, found_dot; ++ const char* rt_from_call = Py_GetVersion(); ++ PyOS_snprintf(ctversion, 5, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); ++ found_dot = 0; ++ for (i = 0; i < 4; i++) { ++ if (!ctversion[i]) { ++ same = (rt_from_call[i] < '0' || rt_from_call[i] > '9'); ++ break; ++ } ++ if (rt_from_call[i] != ctversion[i]) { ++ same = 0; ++ break; ++ } ++ } ++ if (!same) { ++ char rtversion[5] = {'\0'}; + char message[200]; ++ for (i=0; i<4; ++i) { ++ if (rt_from_call[i] == '.') { ++ if (found_dot) break; ++ found_dot = 1; ++ } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') { ++ break; ++ } ++ rtversion[i] = rt_from_call[i]; ++ } + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", +@@ -7943,6 +8426,23 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_DECREF(x); + return ival; + } ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { ++ if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { ++ return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); ++#if PY_MAJOR_VERSION < 3 ++ } else if (likely(PyInt_CheckExact(o))) { ++ return PyInt_AS_LONG(o); ++#endif ++ } else { ++ Py_ssize_t ival; ++ PyObject *x; ++ x = PyNumber_Index(o); ++ if (!x) return -1; ++ ival = PyInt_AsLong(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); + } +diff --git a/khmer/_oxli/traversal.cpp b/khmer/_oxli/traversal.cpp +index 8fa3ed95..964502e6 100644 +--- a/khmer/_oxli/traversal.cpp ++++ b/khmer/_oxli/traversal.cpp +@@ -1,15 +1,17 @@ +-/* Generated by Cython 0.29.2 */ ++/* Generated by Cython 0.29.32 */ + ++#ifndef PY_SSIZE_T_CLEAN + #define PY_SSIZE_T_CLEAN ++#endif /* 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_2" +-#define CYTHON_HEX_VERSION 0x001D02F0 +-#define CYTHON_FUTURE_DIVISION 1 ++#define CYTHON_ABI "0_29_32" ++#define CYTHON_HEX_VERSION 0x001D20F0 ++#define CYTHON_FUTURE_DIVISION 0 + #include + #ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +@@ -47,6 +49,7 @@ + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP +@@ -83,10 +86,14 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC (PYPY_VERSION_HEX >= 0x07030900) ++ #endif + #elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -124,10 +131,59 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 ++ #endif ++#elif defined(PY_NOGIL) ++ #define CYTHON_COMPILING_IN_PYPY 0 ++ #define CYTHON_COMPILING_IN_PYSTON 0 ++ #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 1 ++ #ifndef CYTHON_USE_TYPE_SLOTS ++ #define CYTHON_USE_TYPE_SLOTS 1 ++ #endif ++ #undef CYTHON_USE_PYTYPE_LOOKUP ++ #define CYTHON_USE_PYTYPE_LOOKUP 0 ++ #ifndef CYTHON_USE_ASYNC_SLOTS ++ #define CYTHON_USE_ASYNC_SLOTS 1 ++ #endif ++ #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 ++ #ifndef CYTHON_PEP489_MULTI_PHASE_INIT ++ #define CYTHON_PEP489_MULTI_PHASE_INIT 1 ++ #endif ++ #ifndef CYTHON_USE_TP_FINALIZE ++ #define CYTHON_USE_TP_FINALIZE 1 ++ #endif ++ #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 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -155,7 +211,7 @@ + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif +- #if PY_VERSION_HEX < 0x030300F0 ++ #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) +@@ -170,11 +226,14 @@ + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif +- #ifndef CYTHON_FAST_THREAD_STATE ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_FAST_THREAD_STATE ++ #define CYTHON_FAST_THREAD_STATE 0 ++ #elif !defined(CYTHON_FAST_THREAD_STATE) + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL +- #define CYTHON_FAST_PYCALL 1 ++ #define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030A0000) + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) +@@ -185,15 +244,23 @@ + #ifndef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) + #endif +- #ifndef CYTHON_USE_EXC_INFO_STACK ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_USE_EXC_INFO_STACK ++ #define CYTHON_USE_EXC_INFO_STACK 0 ++ #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) + #endif ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 ++ #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" ++ #if PY_MAJOR_VERSION < 3 ++ #include "longintrepr.h" ++ #endif + #undef SHIFT + #undef BASE + #undef MASK +@@ -324,8 +391,72 @@ class __Pyx_FakeReference { + #define __Pyx_DefaultClassType PyClass_Type + #else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" ++ #define __Pyx_DefaultClassType PyType_Type ++#if PY_VERSION_HEX >= 0x030B00A1 ++ static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int k, int l, int s, int f, ++ PyObject *code, PyObject *c, PyObject* n, PyObject *v, ++ PyObject *fv, PyObject *cell, PyObject* fn, ++ PyObject *name, int fline, PyObject *lnos) { ++ PyObject *kwds=NULL, *argcount=NULL, *posonlyargcount=NULL, *kwonlyargcount=NULL; ++ PyObject *nlocals=NULL, *stacksize=NULL, *flags=NULL, *replace=NULL, *call_result=NULL, *empty=NULL; ++ const char *fn_cstr=NULL; ++ const char *name_cstr=NULL; ++ PyCodeObject* co=NULL; ++ PyObject *type, *value, *traceback; ++ PyErr_Fetch(&type, &value, &traceback); ++ if (!(kwds=PyDict_New())) goto end; ++ if (!(argcount=PyLong_FromLong(a))) goto end; ++ if (PyDict_SetItemString(kwds, "co_argcount", argcount) != 0) goto end; ++ if (!(posonlyargcount=PyLong_FromLong(0))) goto end; ++ if (PyDict_SetItemString(kwds, "co_posonlyargcount", posonlyargcount) != 0) goto end; ++ if (!(kwonlyargcount=PyLong_FromLong(k))) goto end; ++ if (PyDict_SetItemString(kwds, "co_kwonlyargcount", kwonlyargcount) != 0) goto end; ++ if (!(nlocals=PyLong_FromLong(l))) goto end; ++ if (PyDict_SetItemString(kwds, "co_nlocals", nlocals) != 0) goto end; ++ if (!(stacksize=PyLong_FromLong(s))) goto end; ++ if (PyDict_SetItemString(kwds, "co_stacksize", stacksize) != 0) goto end; ++ if (!(flags=PyLong_FromLong(f))) goto end; ++ if (PyDict_SetItemString(kwds, "co_flags", flags) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_code", code) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_consts", c) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_names", n) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_varnames", v) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_freevars", fv) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_cellvars", cell) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_linetable", lnos) != 0) goto end; ++ if (!(fn_cstr=PyUnicode_AsUTF8AndSize(fn, NULL))) goto end; ++ if (!(name_cstr=PyUnicode_AsUTF8AndSize(name, NULL))) goto end; ++ if (!(co = PyCode_NewEmpty(fn_cstr, name_cstr, fline))) goto end; ++ if (!(replace = PyObject_GetAttrString((PyObject*)co, "replace"))) goto cleanup_code_too; ++ if (!(empty = PyTuple_New(0))) goto cleanup_code_too; // unfortunately __pyx_empty_tuple isn't available here ++ if (!(call_result = PyObject_Call(replace, empty, kwds))) goto cleanup_code_too; ++ Py_XDECREF((PyObject*)co); ++ co = (PyCodeObject*)call_result; ++ call_result = NULL; ++ if (0) { ++ cleanup_code_too: ++ Py_XDECREF((PyObject*)co); ++ co = NULL; ++ } ++ end: ++ Py_XDECREF(kwds); ++ Py_XDECREF(argcount); ++ Py_XDECREF(posonlyargcount); ++ Py_XDECREF(kwonlyargcount); ++ Py_XDECREF(nlocals); ++ Py_XDECREF(stacksize); ++ Py_XDECREF(replace); ++ Py_XDECREF(call_result); ++ Py_XDECREF(empty); ++ if (type) { ++ PyErr_Restore(type, value, traceback); ++ } ++ return co; ++ } ++#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 +@@ -360,26 +491,6 @@ class __Pyx_FakeReference { + #else + #define __Pyx_PyFastCFunction_Check(func) 0 + #endif +-#if CYTHON_USE_DICT_VERSIONS +-#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);\ +- }\ +- } +-#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 + #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) +@@ -412,7 +523,7 @@ class __Pyx_FakeReference { + typedef int Py_tss_t; + static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); +- return 0; // PyThread_create_key reports success always ++ 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)); +@@ -435,7 +546,7 @@ static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); + } +-#endif // TSS (Thread Specific Storage) API ++#endif + #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) + #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) + #else +@@ -455,8 +566,12 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #endif + #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 ++ #if defined(PyUnicode_IS_READY) + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) ++ #else ++ #define __Pyx_PyUnicode_READY(op) (0) ++ #endif + #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) +@@ -464,7 +579,15 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) ++ #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) ++ #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) ++ #endif ++ #else ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) ++ #endif + #else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 +@@ -513,8 +636,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) +@@ -525,6 +650,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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 +@@ -558,13 +690,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong +- #define __Pyx_PyInt_AsHash_t PyInt_AsLong ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t + #else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t +- #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t + #endif + #if PY_MAJOR_VERSION >= 3 +- #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func)) ++ #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 +@@ -586,8 +718,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + } __Pyx_PyAsyncMethodsStruct; + #endif + +-#if defined(WIN32) || defined(MS_WINDOWS) +- #define _USE_MATH_DEFINES ++#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) ++ #if !defined(_USE_MATH_DEFINES) ++ #define _USE_MATH_DEFINES ++ #endif + #endif + #include + #ifdef NAN +@@ -605,11 +739,10 @@ static CYTHON_INLINE float __PYX_NAN() { + #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_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ +-} ++ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + + #ifndef __PYX_EXTERN_C + #ifdef __cplusplus +@@ -630,6 +763,18 @@ static CYTHON_INLINE float __PYX_NAN() { + #include + #include + #include ++ ++ #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600) ++ // move should be defined for these versions of MSVC, but __cplusplus isn't set usefully ++ #include ++ ++ namespace cython_std { ++ template typename std::remove_reference::type&& move(T& t) noexcept { return std::move(t); } ++ template typename std::remove_reference::type&& move(T&& t) noexcept { return std::move(t); } ++ } ++ ++ #endif ++ + #include + #include + #include +@@ -662,10 +807,11 @@ typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* enc + 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_DEFAULT 0 +-#define __PYX_DEFAULT_STRING_ENCODING "utf8" +-#define __Pyx_PyObject_FromString __Pyx_PyUnicode_FromString +-#define __Pyx_PyObject_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize ++#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) (\ +@@ -745,6 +891,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); + (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); ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); + #if CYTHON_ASSUME_SAFE_MACROS + #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) + #else +@@ -1621,7 +1768,7 @@ static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *nam + #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, int nargs, PyObject *kwargs); ++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 +@@ -1630,13 +1777,21 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + #ifndef Py_MEMBER_SIZE + #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) + #endif ++#if CYTHON_FAST_PYCALL + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + #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 // CYTHON_FAST_PYCALL + #endif + + /* PyObjectCall.proto */ +@@ -1676,7 +1831,7 @@ static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { + if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); +- Py_SIZE(list) = len+1; ++ __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +@@ -1747,6 +1902,17 @@ static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_nam + /* SetVTable.proto */ + static int __Pyx_SetVtable(PyObject *dict, void *vtable); + ++/* 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 ++ ++/* PyObjectGetAttrStrNoError.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); ++ + /* SetupReduce.proto */ + static int __Pyx_setup_reduce(PyObject* type_obj); + +@@ -1764,6 +1930,32 @@ static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, + /* GetVTable.proto */ + static void* __Pyx_GetVtable(PyObject *dict); + ++/* 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 ++ + /* CLineInTraceback.proto */ + #ifdef CYTHON_CLINE_IN_TRACEBACK + #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +@@ -1835,6 +2027,11 @@ static void __Pyx_CppExn2PyErr() { + } + #endif + ++/* GCCDiagnostics.proto */ ++#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) ++#define __Pyx_HAS_GCC_DIAGNOSTIC ++#endif ++ + /* CIntToPy.proto */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_HashIntoType(oxli::HashIntoType value); + +@@ -1922,6 +2119,7 @@ typedef struct { + PyObject *gi_qualname; + PyObject *gi_modulename; + PyObject *gi_code; ++ PyObject *gi_frame; + int resume_label; + char is_running; + } __pyx_CoroutineObject; +@@ -2137,6 +2335,9 @@ static PyObject *__pyx_tuple__2; + static int __pyx_pw_5khmer_5_oxli_9traversal_9Traverser_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ + static int __pyx_pw_5khmer_5_oxli_9traversal_9Traverser_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + struct __pyx_obj_5khmer_5_oxli_6graphs_Hashgraph *__pyx_v_graph = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); +@@ -2195,6 +2396,9 @@ static int __pyx_pf_5khmer_5_oxli_9traversal_9Traverser___cinit__(struct __pyx_o + int __pyx_t_2; + int __pyx_t_3; + std::shared_ptr __pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "khmer/_oxli/traversal.pyx":12 +@@ -2301,6 +2505,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_9traversal_9Traverser_5ksize___get__(str + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "khmer/_oxli/traversal.pyx":19 +@@ -2370,6 +2577,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_9traversal_9Traverser__kmerqueue_to_kmer_ + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_kmerqueue_to_kmer_list", 0); + + /* "khmer/_oxli/traversal.pyx":22 +@@ -2484,6 +2694,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_9traversal_9Traverser__kmerqueue_to_hash_ + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_kmerqueue_to_hash_list", 0); + + /* "khmer/_oxli/traversal.pyx":33 +@@ -2593,6 +2806,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_9traversal_9Traverser__neighbors(struct _ + 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("_neighbors", 0); + if (__pyx_optional_args) { + if (__pyx_optional_args->__pyx_n > 0) { +@@ -2805,12 +3021,14 @@ static PyObject *__pyx_gb_5khmer_5_oxli_9traversal_9Traverser_4generator(__pyx_C + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_3neighbors(PyObject *__pyx_v_self, PyObject *__pyx_v_node); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_9traversal_9Traverser_2neighbors[] = "Traverser.neighbors(self, unicode node)"; + static PyObject *__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_3neighbors(PyObject *__pyx_v_self, PyObject *__pyx_v_node) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("neighbors (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_node), (&PyUnicode_Type), 1, "node", 1))) __PYX_ERR(1, 60, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_node), (&PyString_Type), 1, "node", 1))) __PYX_ERR(1, 60, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_9traversal_9Traverser_2neighbors(((struct __pyx_obj_5khmer_5_oxli_9traversal_Traverser *)__pyx_v_self), ((PyObject*)__pyx_v_node)); + + /* function exit code */ +@@ -2826,6 +3044,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_9traversal_9Traverser_2neighbors(struct + struct __pyx_obj_5khmer_5_oxli_9traversal___pyx_scope_struct__neighbors *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("neighbors", 0); + __pyx_cur_scope = (struct __pyx_obj_5khmer_5_oxli_9traversal___pyx_scope_struct__neighbors *)__pyx_tp_new_5khmer_5_oxli_9traversal___pyx_scope_struct__neighbors(__pyx_ptype_5khmer_5_oxli_9traversal___pyx_scope_struct__neighbors, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { +@@ -2866,6 +3087,9 @@ static PyObject *__pyx_gb_5khmer_5_oxli_9traversal_9Traverser_4generator(__pyx_C + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t __pyx_t_4; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("neighbors", 0); + switch (__pyx_generator->resume_label) { +@@ -2990,12 +3214,14 @@ static PyObject *__pyx_gb_5khmer_5_oxli_9traversal_9Traverser_7generator1(__pyx_ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_6right_neighbors(PyObject *__pyx_v_self, PyObject *__pyx_v_node); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_9traversal_9Traverser_5right_neighbors[] = "Traverser.right_neighbors(self, unicode node)"; + static PyObject *__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_6right_neighbors(PyObject *__pyx_v_self, PyObject *__pyx_v_node) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("right_neighbors (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_node), (&PyUnicode_Type), 1, "node", 1))) __PYX_ERR(1, 66, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_node), (&PyString_Type), 1, "node", 1))) __PYX_ERR(1, 66, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_9traversal_9Traverser_5right_neighbors(((struct __pyx_obj_5khmer_5_oxli_9traversal_Traverser *)__pyx_v_self), ((PyObject*)__pyx_v_node)); + + /* function exit code */ +@@ -3011,6 +3237,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_9traversal_9Traverser_5right_neighbors(s + struct __pyx_obj_5khmer_5_oxli_9traversal___pyx_scope_struct_1_right_neighbors *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("right_neighbors", 0); + __pyx_cur_scope = (struct __pyx_obj_5khmer_5_oxli_9traversal___pyx_scope_struct_1_right_neighbors *)__pyx_tp_new_5khmer_5_oxli_9traversal___pyx_scope_struct_1_right_neighbors(__pyx_ptype_5khmer_5_oxli_9traversal___pyx_scope_struct_1_right_neighbors, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { +@@ -3052,6 +3281,9 @@ static PyObject *__pyx_gb_5khmer_5_oxli_9traversal_9Traverser_7generator1(__pyx_ + struct __pyx_opt_args_5khmer_5_oxli_9traversal_9Traverser__neighbors __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + Py_ssize_t __pyx_t_5; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("right_neighbors", 0); + switch (__pyx_generator->resume_label) { +@@ -3178,12 +3410,14 @@ static PyObject *__pyx_gb_5khmer_5_oxli_9traversal_9Traverser_10generator2(__pyx + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_9left_neighbors(PyObject *__pyx_v_self, PyObject *__pyx_v_node); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_9traversal_9Traverser_8left_neighbors[] = "Traverser.left_neighbors(self, unicode node)"; + static PyObject *__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_9left_neighbors(PyObject *__pyx_v_self, PyObject *__pyx_v_node) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("left_neighbors (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_node), (&PyUnicode_Type), 1, "node", 1))) __PYX_ERR(1, 72, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_node), (&PyString_Type), 1, "node", 1))) __PYX_ERR(1, 72, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_9traversal_9Traverser_8left_neighbors(((struct __pyx_obj_5khmer_5_oxli_9traversal_Traverser *)__pyx_v_self), ((PyObject*)__pyx_v_node)); + + /* function exit code */ +@@ -3199,6 +3433,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_9traversal_9Traverser_8left_neighbors(st + struct __pyx_obj_5khmer_5_oxli_9traversal___pyx_scope_struct_2_left_neighbors *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("left_neighbors", 0); + __pyx_cur_scope = (struct __pyx_obj_5khmer_5_oxli_9traversal___pyx_scope_struct_2_left_neighbors *)__pyx_tp_new_5khmer_5_oxli_9traversal___pyx_scope_struct_2_left_neighbors(__pyx_ptype_5khmer_5_oxli_9traversal___pyx_scope_struct_2_left_neighbors, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { +@@ -3240,6 +3477,9 @@ static PyObject *__pyx_gb_5khmer_5_oxli_9traversal_9Traverser_10generator2(__pyx + struct __pyx_opt_args_5khmer_5_oxli_9traversal_9Traverser__neighbors __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + Py_ssize_t __pyx_t_5; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("left_neighbors", 0); + switch (__pyx_generator->resume_label) { +@@ -3365,12 +3605,14 @@ static PyObject *__pyx_gb_5khmer_5_oxli_9traversal_9Traverser_10generator2(__pyx + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_12degree(PyObject *__pyx_v_self, PyObject *__pyx_v_node); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_9traversal_9Traverser_11degree[] = "Traverser.degree(self, unicode node)"; + static PyObject *__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_12degree(PyObject *__pyx_v_self, PyObject *__pyx_v_node) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("degree (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_node), (&PyUnicode_Type), 1, "node", 1))) __PYX_ERR(1, 78, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_node), (&PyString_Type), 1, "node", 1))) __PYX_ERR(1, 78, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_9traversal_9Traverser_11degree(((struct __pyx_obj_5khmer_5_oxli_9traversal_Traverser *)__pyx_v_self), ((PyObject*)__pyx_v_node)); + + /* function exit code */ +@@ -3388,6 +3630,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_9traversal_9Traverser_11degree(struct __ + __Pyx_RefNannyDeclarations + oxli::Kmer __pyx_t_1; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("degree", 0); + + /* "khmer/_oxli/traversal.pyx":79 +@@ -3443,12 +3688,14 @@ static PyObject *__pyx_pf_5khmer_5_oxli_9traversal_9Traverser_11degree(struct __ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_14left_degree(PyObject *__pyx_v_self, PyObject *__pyx_v_node); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_9traversal_9Traverser_13left_degree[] = "Traverser.left_degree(self, unicode node)"; + static PyObject *__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_14left_degree(PyObject *__pyx_v_self, PyObject *__pyx_v_node) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("left_degree (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_node), (&PyUnicode_Type), 1, "node", 1))) __PYX_ERR(1, 82, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_node), (&PyString_Type), 1, "node", 1))) __PYX_ERR(1, 82, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_9traversal_9Traverser_13left_degree(((struct __pyx_obj_5khmer_5_oxli_9traversal_Traverser *)__pyx_v_self), ((PyObject*)__pyx_v_node)); + + /* function exit code */ +@@ -3466,6 +3713,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_9traversal_9Traverser_13left_degree(stru + __Pyx_RefNannyDeclarations + oxli::Kmer __pyx_t_1; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("left_degree", 0); + + /* "khmer/_oxli/traversal.pyx":83 +@@ -3521,12 +3771,14 @@ static PyObject *__pyx_pf_5khmer_5_oxli_9traversal_9Traverser_13left_degree(stru + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_16right_degree(PyObject *__pyx_v_self, PyObject *__pyx_v_node); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_9traversal_9Traverser_15right_degree[] = "Traverser.right_degree(self, unicode node)"; + static PyObject *__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_16right_degree(PyObject *__pyx_v_self, PyObject *__pyx_v_node) { ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("right_degree (wrapper)", 0); +- if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_node), (&PyUnicode_Type), 1, "node", 1))) __PYX_ERR(1, 86, __pyx_L1_error) ++ if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_node), (&PyString_Type), 1, "node", 1))) __PYX_ERR(1, 86, __pyx_L1_error) + __pyx_r = __pyx_pf_5khmer_5_oxli_9traversal_9Traverser_15right_degree(((struct __pyx_obj_5khmer_5_oxli_9traversal_Traverser *)__pyx_v_self), ((PyObject*)__pyx_v_node)); + + /* function exit code */ +@@ -3544,6 +3796,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_9traversal_9Traverser_15right_degree(str + __Pyx_RefNannyDeclarations + oxli::Kmer __pyx_t_1; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("right_degree", 0); + + /* "khmer/_oxli/traversal.pyx":87 +@@ -3594,7 +3849,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_9traversal_9Traverser_15right_degree(str + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_18__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_9traversal_9Traverser_17__reduce_cython__[] = "Traverser.__reduce_cython__(self)"; + static PyObject *__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_18__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -3610,6 +3864,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_9traversal_9Traverser_17__reduce_cython_ + 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("__reduce_cython__", 0); + + /* "(tree fragment)":2 +@@ -3649,7 +3906,6 @@ static PyObject *__pyx_pf_5khmer_5_oxli_9traversal_9Traverser_17__reduce_cython_ + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_20__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_9traversal_9Traverser_19__setstate_cython__[] = "Traverser.__setstate_cython__(self, __pyx_state)"; + static PyObject *__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_20__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -3665,6 +3921,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_9traversal_9Traverser_19__setstate_cytho + 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)":4 +@@ -3754,14 +4013,14 @@ static PyObject *__pyx_getprop_5khmer_5_oxli_9traversal_9Traverser_ksize(PyObjec + } + + static PyMethodDef __pyx_methods_5khmer_5_oxli_9traversal_Traverser[] = { +- {"neighbors", (PyCFunction)__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_3neighbors, METH_O, __pyx_doc_5khmer_5_oxli_9traversal_9Traverser_2neighbors}, +- {"right_neighbors", (PyCFunction)__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_6right_neighbors, METH_O, __pyx_doc_5khmer_5_oxli_9traversal_9Traverser_5right_neighbors}, +- {"left_neighbors", (PyCFunction)__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_9left_neighbors, METH_O, __pyx_doc_5khmer_5_oxli_9traversal_9Traverser_8left_neighbors}, +- {"degree", (PyCFunction)__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_12degree, METH_O, __pyx_doc_5khmer_5_oxli_9traversal_9Traverser_11degree}, +- {"left_degree", (PyCFunction)__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_14left_degree, METH_O, __pyx_doc_5khmer_5_oxli_9traversal_9Traverser_13left_degree}, +- {"right_degree", (PyCFunction)__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_16right_degree, METH_O, __pyx_doc_5khmer_5_oxli_9traversal_9Traverser_15right_degree}, +- {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_18__reduce_cython__, METH_NOARGS, __pyx_doc_5khmer_5_oxli_9traversal_9Traverser_17__reduce_cython__}, +- {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_20__setstate_cython__, METH_O, __pyx_doc_5khmer_5_oxli_9traversal_9Traverser_19__setstate_cython__}, ++ {"neighbors", (PyCFunction)__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_3neighbors, METH_O, 0}, ++ {"right_neighbors", (PyCFunction)__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_6right_neighbors, METH_O, 0}, ++ {"left_neighbors", (PyCFunction)__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_9left_neighbors, METH_O, 0}, ++ {"degree", (PyCFunction)__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_12degree, METH_O, 0}, ++ {"left_degree", (PyCFunction)__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_14left_degree, METH_O, 0}, ++ {"right_degree", (PyCFunction)__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_16right_degree, METH_O, 0}, ++ {"__reduce_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_18__reduce_cython__, METH_NOARGS, 0}, ++ {"__setstate_cython__", (PyCFunction)__pyx_pw_5khmer_5_oxli_9traversal_9Traverser_20__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} + }; + +@@ -3776,7 +4035,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_9traversal_Traverser = { + sizeof(struct __pyx_obj_5khmer_5_oxli_9traversal_Traverser), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_9traversal_Traverser, /*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 +@@ -3826,6 +4090,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_9traversal_Traverser = { + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static struct __pyx_obj_5khmer_5_oxli_9traversal___pyx_scope_struct__neighbors *__pyx_freelist_5khmer_5_oxli_9traversal___pyx_scope_struct__neighbors[8]; +@@ -3884,7 +4157,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct__neig + sizeof(struct __pyx_obj_5khmer_5_oxli_9traversal___pyx_scope_struct__neighbors), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_9traversal___pyx_scope_struct__neighbors, /*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 +@@ -3934,6 +4212,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct__neig + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static struct __pyx_obj_5khmer_5_oxli_9traversal___pyx_scope_struct_1_right_neighbors *__pyx_freelist_5khmer_5_oxli_9traversal___pyx_scope_struct_1_right_neighbors[8]; +@@ -3992,7 +4279,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct_1_rig + sizeof(struct __pyx_obj_5khmer_5_oxli_9traversal___pyx_scope_struct_1_right_neighbors), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_9traversal___pyx_scope_struct_1_right_neighbors, /*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 +@@ -4042,6 +4334,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct_1_rig + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static struct __pyx_obj_5khmer_5_oxli_9traversal___pyx_scope_struct_2_left_neighbors *__pyx_freelist_5khmer_5_oxli_9traversal___pyx_scope_struct_2_left_neighbors[8]; +@@ -4100,7 +4401,12 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct_2_lef + sizeof(struct __pyx_obj_5khmer_5_oxli_9traversal___pyx_scope_struct_2_left_neighbors), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5khmer_5_oxli_9traversal___pyx_scope_struct_2_left_neighbors, /*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 +@@ -4150,6 +4456,15 @@ static PyTypeObject __pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct_2_lef + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif ++ #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, /*tp_vectorcall*/ ++ #endif ++ #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, /*tp_print*/ ++ #endif ++ #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, /*tp_pypy_flags*/ ++ #endif + }; + + static PyMethodDef __pyx_methods[] = { +@@ -4306,6 +4621,9 @@ static int __Pyx_modinit_function_export_code(void) { + + 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_5khmer_5_oxli_9traversal_Traverser = &__pyx_vtable_5khmer_5_oxli_9traversal_Traverser; +@@ -4313,7 +4631,9 @@ static int __Pyx_modinit_type_init_code(void) { + __pyx_vtable_5khmer_5_oxli_9traversal_Traverser._kmerqueue_to_hash_list = (PyObject *(*)(struct __pyx_obj_5khmer_5_oxli_9traversal_Traverser *, oxli::KmerQueue *))__pyx_f_5khmer_5_oxli_9traversal_9Traverser__kmerqueue_to_hash_list; + __pyx_vtable_5khmer_5_oxli_9traversal_Traverser._neighbors = (PyObject *(*)(struct __pyx_obj_5khmer_5_oxli_9traversal_Traverser *, oxli::Kmer, struct __pyx_opt_args_5khmer_5_oxli_9traversal_9Traverser__neighbors *__pyx_optional_args))__pyx_f_5khmer_5_oxli_9traversal_9Traverser__neighbors; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_9traversal_Traverser) < 0) __PYX_ERR(1, 9, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_9traversal_Traverser.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_9traversal_Traverser.tp_dictoffset && __pyx_type_5khmer_5_oxli_9traversal_Traverser.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_9traversal_Traverser.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } +@@ -4322,19 +4642,25 @@ static int __Pyx_modinit_type_init_code(void) { + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_5khmer_5_oxli_9traversal_Traverser) < 0) __PYX_ERR(1, 9, __pyx_L1_error) + __pyx_ptype_5khmer_5_oxli_9traversal_Traverser = &__pyx_type_5khmer_5_oxli_9traversal_Traverser; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct__neighbors) < 0) __PYX_ERR(1, 60, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct__neighbors.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct__neighbors.tp_dictoffset && __pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct__neighbors.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct__neighbors.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } + __pyx_ptype_5khmer_5_oxli_9traversal___pyx_scope_struct__neighbors = &__pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct__neighbors; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct_1_right_neighbors) < 0) __PYX_ERR(1, 66, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct_1_right_neighbors.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct_1_right_neighbors.tp_dictoffset && __pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct_1_right_neighbors.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct_1_right_neighbors.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } + __pyx_ptype_5khmer_5_oxli_9traversal___pyx_scope_struct_1_right_neighbors = &__pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct_1_right_neighbors; + if (PyType_Ready(&__pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct_2_left_neighbors) < 0) __PYX_ERR(1, 72, __pyx_L1_error) ++ #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct_2_left_neighbors.tp_print = 0; ++ #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct_2_left_neighbors.tp_dictoffset && __pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct_2_left_neighbors.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_5khmer_5_oxli_9traversal___pyx_scope_struct_2_left_neighbors.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } +@@ -4349,6 +4675,9 @@ static int __Pyx_modinit_type_init_code(void) { + 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("khmer._oxli.hashing"); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 62, __pyx_L1_error) +@@ -4446,17 +4775,19 @@ static int __Pyx_modinit_function_import_code(void) { + } + + +-#if PY_MAJOR_VERSION < 3 +-#ifdef CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC void +-#else ++#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 CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC PyObject * ++#ifdef __cplusplus ++#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * + #else +-#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC ++#define __Pyx_PyMODINIT_FUNC PyObject * + #endif + #endif + +@@ -4538,6 +4869,9 @@ static CYTHON_SMALL_CODE int __pyx_pymod_exec_traversal(PyObject *__pyx_pyinit_m + #endif + { + PyObject *__pyx_t_1 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { +@@ -4585,11 +4919,9 @@ if (!__Pyx_RefNanny) { + #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? */ ++ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif +- #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; +@@ -4605,10 +4937,9 @@ if (!__Pyx_RefNanny) { + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(1, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(1, 1, __pyx_L1_error) +- __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(1, 1, __pyx_L1_error) +- #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); +- #endif ++ __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(1, 1, __pyx_L1_error) ++ Py_INCREF(__pyx_cython_runtime); + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(1, 1, __pyx_L1_error); + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitGlobals() < 0) __PYX_ERR(1, 1, __pyx_L1_error) +@@ -4634,8 +4965,8 @@ if (!__Pyx_RefNanny) { + (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)) goto __pyx_L1_error; +- if (unlikely(__Pyx_modinit_type_import_code() != 0)) goto __pyx_L1_error; ++ if (unlikely(__Pyx_modinit_type_init_code() < 0)) __PYX_ERR(1, 1, __pyx_L1_error) ++ if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(1, 1, __pyx_L1_error) + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ +@@ -4759,7 +5090,7 @@ static int __Pyx_ParseOptionalKeywords( + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 +- if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { ++ if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { +@@ -4786,7 +5117,7 @@ static int __Pyx_ParseOptionalKeywords( + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -4802,7 +5133,7 @@ static int __Pyx_ParseOptionalKeywords( + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -4917,7 +5248,7 @@ static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args + return result; + } + #if 1 || PY_VERSION_HEX < 0x030600B1 +-static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs) { ++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); +@@ -4988,12 +5319,12 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + } + #if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); + #else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); + #endif +@@ -5009,7 +5340,7 @@ done: + #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; ++ ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) +@@ -5112,7 +5443,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec + 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) { ++ } else if (__Pyx_PyFastCFunction_Check(func)) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); + #endif + } +@@ -5394,6 +5725,53 @@ bad: + return -1; + } + ++/* 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; icurexc_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 ++ ++/* 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; +@@ -5414,53 +5792,81 @@ static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; ++ PyObject *object_getstate = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; ++ PyObject *getstate = NULL; ++#if CYTHON_USE_PYTYPE_LOOKUP ++ getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); ++#else ++ getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); ++ if (!getstate && PyErr_Occurred()) { ++ goto __PYX_BAD; ++ } ++#endif ++ if (getstate) { + #if CYTHON_USE_PYTYPE_LOOKUP +- if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto GOOD; ++ object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); + #else +- if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto GOOD; ++ object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); ++ if (!object_getstate && PyErr_Occurred()) { ++ goto __PYX_BAD; ++ } + #endif ++ if (object_getstate != getstate) { ++ goto __PYX_GOOD; ++ } ++ } + #if CYTHON_USE_PYTYPE_LOOKUP +- object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto BAD; ++ 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 BAD; ++ 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 BAD; ++ 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 BAD; ++ 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 BAD; ++ 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 BAD; ++ 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_GetAttrStr(type_obj, __pyx_n_s_reduce_cython); if (unlikely(!reduce_cython)) goto BAD; +- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto BAD; +- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto BAD; ++ 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_GetAttrStr(type_obj, __pyx_n_s_setstate_cython); if (unlikely(!setstate_cython)) goto BAD; +- ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto BAD; +- ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto BAD; ++ 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 GOOD; +-BAD: ++ 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; +-GOOD: ++__PYX_GOOD: + #if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); ++ Py_XDECREF(object_getstate); ++ Py_XDECREF(getstate); + #endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); +@@ -5551,9 +5957,35 @@ bad: + return NULL; + } + ++/* 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 ++ + /* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +-static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { ++static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; + #if CYTHON_COMPILING_IN_CPYTHON +@@ -5583,7 +6015,7 @@ static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + } + if (!use_cline) { + c_line = 0; +- PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); ++ (void) 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; +@@ -5657,7 +6089,7 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + 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)); ++ __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } +@@ -5677,33 +6109,40 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + #include "compile.h" + #include "frameobject.h" + #include "traceback.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + 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; ++ PyCodeObject *py_code = NULL; ++ PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 ++ PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); +- #else +- py_srcfile = PyUnicode_FromString(filename); +- #endif + if (!py_srcfile) goto bad; ++ #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; ++ funcname = PyUnicode_AsUTF8(py_funcname); ++ if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); +- #else +- py_funcname = PyUnicode_FromString(funcname); ++ if (!py_funcname) goto bad; + #endif + } +- if (!py_funcname) goto bad; ++ #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, +@@ -5722,11 +6161,16 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); +- Py_DECREF(py_funcname); ++ #else ++ py_code = PyCode_NewEmpty(filename, funcname, py_line); ++ #endif ++ Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline + return py_code; + bad: +- Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); ++ #if PY_MAJOR_VERSION < 3 ++ Py_XDECREF(py_srcfile); ++ #endif + return NULL; + } + static void __Pyx_AddTraceback(const char *funcname, int c_line, +@@ -5734,14 +6178,24 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; ++ PyObject *ptype, *pvalue, *ptraceback; + 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) { ++ __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); +- if (!py_code) goto bad; ++ if (!py_code) { ++ /* If the code object creation fails, then we should clear the ++ fetched exception references and propagate the new exception */ ++ Py_XDECREF(ptype); ++ Py_XDECREF(pvalue); ++ Py_XDECREF(ptraceback); ++ goto bad; ++ } ++ __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( +@@ -5760,7 +6214,14 @@ bad: + + /* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_HashIntoType(oxli::HashIntoType value) { +- const oxli::HashIntoType neg_one = (oxli::HashIntoType) ((oxli::HashIntoType) 0 - (oxli::HashIntoType) 1), const_zero = (oxli::HashIntoType) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const oxli::HashIntoType neg_one = (oxli::HashIntoType) -1, const_zero = (oxli::HashIntoType) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(oxli::HashIntoType) < sizeof(long)) { +@@ -5791,7 +6252,14 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_oxli_3a__3a_HashIntoType(oxli::H + + /* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint32_t(uint32_t value) { +- const uint32_t neg_one = (uint32_t) ((uint32_t) 0 - (uint32_t) 1), const_zero = (uint32_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const uint32_t neg_one = (uint32_t) -1, const_zero = (uint32_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(uint32_t) < sizeof(long)) { +@@ -5822,7 +6290,14 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint32_t(uint32_t value) { + + /* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { +@@ -5875,7 +6350,14 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + + /* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -6064,7 +6546,14 @@ raise_neg_overflow: + + /* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +- const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const int neg_one = (int) -1, const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -6627,6 +7116,12 @@ static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name + /* CoroutineBase */ + #include + #include ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + #define __Pyx_Coroutine_Undelegate(gen) Py_CLEAR((gen)->yieldfrom) + static int __Pyx_PyGen__FetchStopIterationValue(CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject **pvalue) { + PyObject *et, *ev, *tb; +@@ -6798,9 +7293,13 @@ PyObject *__Pyx_Coroutine_SendEx(__pyx_CoroutineObject *self, PyObject *value, i + if (exc_state->exc_traceback) { + PyTracebackObject *tb = (PyTracebackObject *) exc_state->exc_traceback; + PyFrameObject *f = tb->tb_frame; +- Py_XINCREF(tstate->frame); + assert(f->f_back == NULL); ++ #if PY_VERSION_HEX >= 0x030B00A1 ++ f->f_back = PyThreadState_GetFrame(tstate); ++ #else ++ Py_XINCREF(tstate->frame); + f->f_back = tstate->frame; ++ #endif + } + #endif + } +@@ -6853,6 +7352,30 @@ PyObject *__Pyx_Coroutine_MethodReturn(CYTHON_UNUSED PyObject* gen, PyObject *re + } + return retval; + } ++#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) ++static CYTHON_INLINE ++PyObject *__Pyx_PyGen_Send(PyGenObject *gen, PyObject *arg) { ++#if PY_VERSION_HEX <= 0x030A00A1 ++ return _PyGen_Send(gen, arg); ++#else ++ PyObject *result; ++ if (PyIter_Send((PyObject*)gen, arg ? arg : Py_None, &result) == PYGEN_RETURN) { ++ if (PyAsyncGen_CheckExact(gen)) { ++ assert(result == Py_None); ++ PyErr_SetNone(PyExc_StopAsyncIteration); ++ } ++ else if (result == Py_None) { ++ PyErr_SetNone(PyExc_StopIteration); ++ } ++ else { ++ _PyGen_SetStopIterationValue(result); ++ } ++ Py_CLEAR(result); ++ } ++ return result; ++#endif ++} ++#endif + static CYTHON_INLINE + PyObject *__Pyx_Coroutine_FinishDelegation(__pyx_CoroutineObject *gen) { + PyObject *ret; +@@ -6889,12 +7412,12 @@ static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) { + #endif + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) + if (PyGen_CheckExact(yf)) { +- ret = _PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); ++ ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); + } else + #endif + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03050000 && defined(PyCoro_CheckExact) && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) + if (PyCoro_CheckExact(yf)) { +- ret = _PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); ++ ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); + } else + #endif + { +@@ -6978,7 +7501,7 @@ static PyObject *__Pyx_Generator_Next(PyObject *self) { + #endif + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) + if (PyGen_CheckExact(yf)) { +- ret = _PyGen_Send((PyGenObject*)yf, NULL); ++ ret = __Pyx_PyGen_Send((PyGenObject*)yf, NULL); + } else + #endif + #ifdef __Pyx_Coroutine_USED +@@ -7138,6 +7661,7 @@ static int __Pyx_Coroutine_clear(PyObject *self) { + } + #endif + Py_CLEAR(gen->gi_code); ++ Py_CLEAR(gen->gi_frame); + Py_CLEAR(gen->gi_name); + Py_CLEAR(gen->gi_qualname); + Py_CLEAR(gen->gi_modulename); +@@ -7154,7 +7678,7 @@ static void __Pyx_Coroutine_dealloc(PyObject *self) { + if (PyObject_CallFinalizerFromDealloc(self)) + #else + Py_TYPE(gen)->tp_del(self); +- if (self->ob_refcnt > 0) ++ if (Py_REFCNT(self) > 0) + #endif + { + return; +@@ -7181,7 +7705,7 @@ static void __Pyx_Coroutine_del(PyObject *self) { + } + #if !CYTHON_USE_TP_FINALIZE + assert(self->ob_refcnt == 0); +- self->ob_refcnt = 1; ++ __Pyx_SET_REFCNT(self, 1); + #endif + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&error_type, &error_value, &error_traceback); +@@ -7248,17 +7772,17 @@ static void __Pyx_Coroutine_del(PyObject *self) { + } + __Pyx_ErrRestore(error_type, error_value, error_traceback); + #if !CYTHON_USE_TP_FINALIZE +- assert(self->ob_refcnt > 0); ++ assert(Py_REFCNT(self) > 0); + if (--self->ob_refcnt == 0) { + return; + } + { +- Py_ssize_t refcnt = self->ob_refcnt; ++ Py_ssize_t refcnt = Py_REFCNT(self); + _Py_NewReference(self); +- self->ob_refcnt = refcnt; ++ __Pyx_SET_REFCNT(self, refcnt); + } + #if CYTHON_COMPILING_IN_CPYTHON +- assert(PyType_IS_GC(self->ob_type) && ++ assert(PyType_IS_GC(Py_TYPE(self)) && + _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED); + _Py_DEC_REFTOTAL; + #endif +@@ -7324,6 +7848,27 @@ __Pyx_Coroutine_set_qualname(__pyx_CoroutineObject *self, PyObject *value, CYTHO + Py_XDECREF(tmp); + return 0; + } ++static PyObject * ++__Pyx_Coroutine_get_frame(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context) ++{ ++ PyObject *frame = self->gi_frame; ++ if (!frame) { ++ if (unlikely(!self->gi_code)) { ++ Py_RETURN_NONE; ++ } ++ frame = (PyObject *) PyFrame_New( ++ PyThreadState_Get(), /*PyThreadState *tstate,*/ ++ (PyCodeObject*) self->gi_code, /*PyCodeObject *code,*/ ++ __pyx_d, /*PyObject *globals,*/ ++ 0 /*PyObject *locals*/ ++ ); ++ if (unlikely(!frame)) ++ return NULL; ++ self->gi_frame = frame; ++ } ++ Py_INCREF(frame); ++ return frame; ++} + static __pyx_CoroutineObject *__Pyx__Coroutine_New( + PyTypeObject* type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, + PyObject *name, PyObject *qualname, PyObject *module_name) { +@@ -7357,6 +7902,7 @@ static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit( + gen->gi_modulename = module_name; + Py_XINCREF(code); + gen->gi_code = code; ++ gen->gi_frame = NULL; + PyObject_GC_Track(gen); + return gen; + } +@@ -7480,6 +8026,8 @@ static PyGetSetDef __pyx_Generator_getsets[] = { + (char*) PyDoc_STR("name of the generator"), 0}, + {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname, + (char*) PyDoc_STR("qualified name of the generator"), 0}, ++ {(char *) "gi_frame", (getter)__Pyx_Coroutine_get_frame, NULL, ++ (char*) PyDoc_STR("Frame of the generator"), 0}, + {0, 0, 0, 0, 0} + }; + static PyTypeObject __pyx_GeneratorType_type = { +@@ -7539,6 +8087,15 @@ static PyTypeObject __pyx_GeneratorType_type = { + #elif PY_VERSION_HEX >= 0x030400a1 + 0, + #endif ++#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) ++ 0, ++#endif ++#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 ++ 0, ++#endif ++#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 ++ 0, ++#endif + }; + static int __pyx_Generator_init(void) { + __pyx_GeneratorType_type.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; +@@ -7552,11 +8109,33 @@ static int __pyx_Generator_init(void) { + + /* 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 ctversion[5]; ++ int same=1, i, found_dot; ++ const char* rt_from_call = Py_GetVersion(); ++ PyOS_snprintf(ctversion, 5, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); ++ found_dot = 0; ++ for (i = 0; i < 4; i++) { ++ if (!ctversion[i]) { ++ same = (rt_from_call[i] < '0' || rt_from_call[i] > '9'); ++ break; ++ } ++ if (rt_from_call[i] != ctversion[i]) { ++ same = 0; ++ break; ++ } ++ } ++ if (!same) { ++ char rtversion[5] = {'\0'}; + char message[200]; ++ for (i=0; i<4; ++i) { ++ if (rt_from_call[i] == '.') { ++ if (found_dot) break; ++ found_dot = 1; ++ } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') { ++ break; ++ } ++ rtversion[i] = rt_from_call[i]; ++ } + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", +@@ -7814,6 +8393,23 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_DECREF(x); + return ival; + } ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { ++ if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { ++ return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); ++#if PY_MAJOR_VERSION < 3 ++ } else if (likely(PyInt_CheckExact(o))) { ++ return PyInt_AS_LONG(o); ++#endif ++ } else { ++ Py_ssize_t ival; ++ PyObject *x; ++ x = PyNumber_Index(o); ++ if (!x) return -1; ++ ival = PyInt_AsLong(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); + } +diff --git a/khmer/_oxli/utils.cpp b/khmer/_oxli/utils.cpp +index 09c12498..62b0c894 100644 +--- a/khmer/_oxli/utils.cpp ++++ b/khmer/_oxli/utils.cpp +@@ -1,15 +1,17 @@ +-/* Generated by Cython 0.29.2 */ ++/* Generated by Cython 0.29.32 */ + ++#ifndef PY_SSIZE_T_CLEAN + #define PY_SSIZE_T_CLEAN ++#endif /* 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_2" +-#define CYTHON_HEX_VERSION 0x001D02F0 +-#define CYTHON_FUTURE_DIVISION 1 ++#define CYTHON_ABI "0_29_32" ++#define CYTHON_HEX_VERSION 0x001D20F0 ++#define CYTHON_FUTURE_DIVISION 0 + #include + #ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +@@ -47,6 +49,7 @@ + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP +@@ -83,10 +86,14 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC (PYPY_VERSION_HEX >= 0x07030900) ++ #endif + #elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -124,10 +131,59 @@ + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 ++ #endif ++#elif defined(PY_NOGIL) ++ #define CYTHON_COMPILING_IN_PYPY 0 ++ #define CYTHON_COMPILING_IN_PYSTON 0 ++ #define CYTHON_COMPILING_IN_CPYTHON 0 ++ #define CYTHON_COMPILING_IN_NOGIL 1 ++ #ifndef CYTHON_USE_TYPE_SLOTS ++ #define CYTHON_USE_TYPE_SLOTS 1 ++ #endif ++ #undef CYTHON_USE_PYTYPE_LOOKUP ++ #define CYTHON_USE_PYTYPE_LOOKUP 0 ++ #ifndef CYTHON_USE_ASYNC_SLOTS ++ #define CYTHON_USE_ASYNC_SLOTS 1 ++ #endif ++ #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 ++ #ifndef CYTHON_PEP489_MULTI_PHASE_INIT ++ #define CYTHON_PEP489_MULTI_PHASE_INIT 1 ++ #endif ++ #ifndef CYTHON_USE_TP_FINALIZE ++ #define CYTHON_USE_TP_FINALIZE 1 ++ #endif ++ #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 ++ #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif +@@ -155,7 +211,7 @@ + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif +- #if PY_VERSION_HEX < 0x030300F0 ++ #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) +@@ -170,11 +226,14 @@ + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif +- #ifndef CYTHON_FAST_THREAD_STATE ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_FAST_THREAD_STATE ++ #define CYTHON_FAST_THREAD_STATE 0 ++ #elif !defined(CYTHON_FAST_THREAD_STATE) + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL +- #define CYTHON_FAST_PYCALL 1 ++ #define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030A0000) + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) +@@ -185,15 +244,23 @@ + #ifndef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) + #endif +- #ifndef CYTHON_USE_EXC_INFO_STACK ++ #if PY_VERSION_HEX >= 0x030B00A4 ++ #undef CYTHON_USE_EXC_INFO_STACK ++ #define CYTHON_USE_EXC_INFO_STACK 0 ++ #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) + #endif ++ #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC ++ #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 ++ #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" ++ #if PY_MAJOR_VERSION < 3 ++ #include "longintrepr.h" ++ #endif + #undef SHIFT + #undef BASE + #undef MASK +@@ -324,8 +391,72 @@ class __Pyx_FakeReference { + #define __Pyx_DefaultClassType PyClass_Type + #else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" ++ #define __Pyx_DefaultClassType PyType_Type ++#if PY_VERSION_HEX >= 0x030B00A1 ++ static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int k, int l, int s, int f, ++ PyObject *code, PyObject *c, PyObject* n, PyObject *v, ++ PyObject *fv, PyObject *cell, PyObject* fn, ++ PyObject *name, int fline, PyObject *lnos) { ++ PyObject *kwds=NULL, *argcount=NULL, *posonlyargcount=NULL, *kwonlyargcount=NULL; ++ PyObject *nlocals=NULL, *stacksize=NULL, *flags=NULL, *replace=NULL, *call_result=NULL, *empty=NULL; ++ const char *fn_cstr=NULL; ++ const char *name_cstr=NULL; ++ PyCodeObject* co=NULL; ++ PyObject *type, *value, *traceback; ++ PyErr_Fetch(&type, &value, &traceback); ++ if (!(kwds=PyDict_New())) goto end; ++ if (!(argcount=PyLong_FromLong(a))) goto end; ++ if (PyDict_SetItemString(kwds, "co_argcount", argcount) != 0) goto end; ++ if (!(posonlyargcount=PyLong_FromLong(0))) goto end; ++ if (PyDict_SetItemString(kwds, "co_posonlyargcount", posonlyargcount) != 0) goto end; ++ if (!(kwonlyargcount=PyLong_FromLong(k))) goto end; ++ if (PyDict_SetItemString(kwds, "co_kwonlyargcount", kwonlyargcount) != 0) goto end; ++ if (!(nlocals=PyLong_FromLong(l))) goto end; ++ if (PyDict_SetItemString(kwds, "co_nlocals", nlocals) != 0) goto end; ++ if (!(stacksize=PyLong_FromLong(s))) goto end; ++ if (PyDict_SetItemString(kwds, "co_stacksize", stacksize) != 0) goto end; ++ if (!(flags=PyLong_FromLong(f))) goto end; ++ if (PyDict_SetItemString(kwds, "co_flags", flags) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_code", code) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_consts", c) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_names", n) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_varnames", v) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_freevars", fv) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_cellvars", cell) != 0) goto end; ++ if (PyDict_SetItemString(kwds, "co_linetable", lnos) != 0) goto end; ++ if (!(fn_cstr=PyUnicode_AsUTF8AndSize(fn, NULL))) goto end; ++ if (!(name_cstr=PyUnicode_AsUTF8AndSize(name, NULL))) goto end; ++ if (!(co = PyCode_NewEmpty(fn_cstr, name_cstr, fline))) goto end; ++ if (!(replace = PyObject_GetAttrString((PyObject*)co, "replace"))) goto cleanup_code_too; ++ if (!(empty = PyTuple_New(0))) goto cleanup_code_too; // unfortunately __pyx_empty_tuple isn't available here ++ if (!(call_result = PyObject_Call(replace, empty, kwds))) goto cleanup_code_too; ++ Py_XDECREF((PyObject*)co); ++ co = (PyCodeObject*)call_result; ++ call_result = NULL; ++ if (0) { ++ cleanup_code_too: ++ Py_XDECREF((PyObject*)co); ++ co = NULL; ++ } ++ end: ++ Py_XDECREF(kwds); ++ Py_XDECREF(argcount); ++ Py_XDECREF(posonlyargcount); ++ Py_XDECREF(kwonlyargcount); ++ Py_XDECREF(nlocals); ++ Py_XDECREF(stacksize); ++ Py_XDECREF(replace); ++ Py_XDECREF(call_result); ++ Py_XDECREF(empty); ++ if (type) { ++ PyErr_Restore(type, value, traceback); ++ } ++ return co; ++ } ++#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 +@@ -360,26 +491,6 @@ class __Pyx_FakeReference { + #else + #define __Pyx_PyFastCFunction_Check(func) 0 + #endif +-#if CYTHON_USE_DICT_VERSIONS +-#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);\ +- }\ +- } +-#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 + #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) +@@ -412,7 +523,7 @@ class __Pyx_FakeReference { + typedef int Py_tss_t; + static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); +- return 0; // PyThread_create_key reports success always ++ 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)); +@@ -435,7 +546,7 @@ static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); + } +-#endif // TSS (Thread Specific Storage) API ++#endif + #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) + #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) + #else +@@ -455,8 +566,12 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #endif + #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 ++ #if defined(PyUnicode_IS_READY) + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) ++ #else ++ #define __Pyx_PyUnicode_READY(op) (0) ++ #endif + #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) +@@ -464,7 +579,15 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) ++ #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) ++ #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) ++ #endif ++ #else ++ #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) ++ #endif + #else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 +@@ -513,8 +636,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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) +@@ -525,6 +650,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #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 +@@ -558,13 +690,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + #if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong +- #define __Pyx_PyInt_AsHash_t PyInt_AsLong ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t + #else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t +- #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t ++ #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t + #endif + #if PY_MAJOR_VERSION >= 3 +- #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func)) ++ #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 +@@ -586,8 +718,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + } __Pyx_PyAsyncMethodsStruct; + #endif + +-#if defined(WIN32) || defined(MS_WINDOWS) +- #define _USE_MATH_DEFINES ++#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) ++ #if !defined(_USE_MATH_DEFINES) ++ #define _USE_MATH_DEFINES ++ #endif + #endif + #include + #ifdef NAN +@@ -605,11 +739,10 @@ static CYTHON_INLINE float __PYX_NAN() { + #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_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ +-} ++ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + + #ifndef __PYX_EXTERN_C + #ifdef __cplusplus +@@ -642,10 +775,11 @@ typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* enc + 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_DEFAULT 0 +-#define __PYX_DEFAULT_STRING_ENCODING "utf8" +-#define __Pyx_PyObject_FromString __Pyx_PyUnicode_FromString +-#define __Pyx_PyObject_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize ++#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) (\ +@@ -725,6 +859,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); + (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); ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); + #if CYTHON_ASSUME_SAFE_MACROS + #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) + #else +@@ -934,7 +1069,7 @@ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ + #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, int nargs, PyObject *kwargs); ++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 +@@ -943,13 +1078,21 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + #ifndef Py_MEMBER_SIZE + #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) + #endif ++#if CYTHON_FAST_PYCALL + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + #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 // CYTHON_FAST_PYCALL + #endif + + /* PyCFunctionFastCall.proto */ +@@ -1033,7 +1176,7 @@ static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { + if (likely(L->allocated > len)) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); +- Py_SIZE(list) = len+1; ++ __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +@@ -1049,12 +1192,38 @@ static void __Pyx_WriteUnraisable(const char *name, int clineno, + + /* PyIntBinop.proto */ + #if !CYTHON_COMPILING_IN_PYPY +-static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace); ++static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check); + #else +-#define __Pyx_PyInt_AddObjC(op1, op2, intval, inplace)\ ++#define __Pyx_PyInt_AddObjC(op1, op2, intval, inplace, zerodivision_check)\ + (inplace ? PyNumber_InPlaceAdd(op1, op2) : PyNumber_Add(op1, op2)) + #endif + ++/* 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 ++ + /* CLineInTraceback.proto */ + #ifdef CYTHON_CLINE_IN_TRACEBACK + #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +@@ -1081,8 +1250,10 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); + 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_uint64_t(uint64_t value); ++/* GCCDiagnostics.proto */ ++#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) ++#define __Pyx_HAS_GCC_DIAGNOSTIC ++#endif + + /* CIntFromPy.proto */ + static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *); +@@ -1090,6 +1261,9 @@ static CYTHON_INLINE uint64_t __Pyx_PyInt_As_uint64_t(PyObject *); + /* CIntFromPy.proto */ + static CYTHON_INLINE uint32_t __Pyx_PyInt_As_uint32_t(PyObject *); + ++/* CIntToPy.proto */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint64_t(uint64_t value); ++ + /* CIntFromPy.proto */ + static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *); + +@@ -1168,7 +1342,7 @@ static const char __pyx_k_get_n_primes_near_x[] = "get_n_primes_near_x"; + static const char __pyx_k_khmer__oxli_utils_pyx[] = "khmer/_oxli/utils.pyx"; + static const char __pyx_k_Requires_a_string_like_sequence[] = "Requires a string-like sequence, got {0} of type {1}"; + static const char __pyx_k_unable_to_find_0_prime_numbers_1[] = "unable to find {0} prime numbers < {1}"; +-static PyObject *__pyx_kp_u_Requires_a_string_like_sequence; ++static PyObject *__pyx_kp_s_Requires_a_string_like_sequence; + static PyObject *__pyx_n_s_RuntimeError; + static PyObject *__pyx_n_s_TypeError; + static PyObject *__pyx_n_s_cline_in_traceback; +@@ -1187,8 +1361,8 @@ static PyObject *__pyx_n_s_name; + static PyObject *__pyx_n_s_primes; + static PyObject *__pyx_n_s_range; + static PyObject *__pyx_n_s_test; +-static PyObject *__pyx_kp_u_unable_to_find_0_prime_numbers_1; +-static PyObject *__pyx_kp_u_utf_8; ++static PyObject *__pyx_kp_s_unable_to_find_0_prime_numbers_1; ++static PyObject *__pyx_kp_s_utf_8; + static PyObject *__pyx_n_s_x; + static PyObject *__pyx_pf_5khmer_5_oxli_5utils_is_prime(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_n); /* proto */ + static PyObject *__pyx_pf_5khmer_5_oxli_5utils_2get_n_primes_near_x(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_n_primes, PyObject *__pyx_v_x); /* proto */ +@@ -1213,8 +1387,7 @@ static PyObject *__pyx_codeobj__5; + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_5utils_1is_prime(PyObject *__pyx_self, PyObject *__pyx_v_n); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_5utils_is_prime[] = "is_prime(n)"; +-static PyMethodDef __pyx_mdef_5khmer_5_oxli_5utils_1is_prime = {"is_prime", (PyCFunction)__pyx_pw_5khmer_5_oxli_5utils_1is_prime, METH_O, __pyx_doc_5khmer_5_oxli_5utils_is_prime}; ++static PyMethodDef __pyx_mdef_5khmer_5_oxli_5utils_1is_prime = {"is_prime", (PyCFunction)__pyx_pw_5khmer_5_oxli_5utils_1is_prime, METH_O, 0}; + static PyObject *__pyx_pw_5khmer_5_oxli_5utils_1is_prime(PyObject *__pyx_self, PyObject *__pyx_v_n) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -1231,6 +1404,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_5utils_is_prime(CYTHON_UNUSED PyObject * + __Pyx_RefNannyDeclarations + uint64_t __pyx_t_1; + PyObject *__pyx_t_2 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("is_prime", 0); + + /* "khmer/_oxli/utils.pyx":9 +@@ -1277,11 +1453,13 @@ static PyObject *__pyx_pf_5khmer_5_oxli_5utils_is_prime(CYTHON_UNUSED PyObject * + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_5utils_3get_n_primes_near_x(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_5utils_2get_n_primes_near_x[] = "get_n_primes_near_x(n_primes, x)"; +-static PyMethodDef __pyx_mdef_5khmer_5_oxli_5utils_3get_n_primes_near_x = {"get_n_primes_near_x", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_5utils_3get_n_primes_near_x, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5khmer_5_oxli_5utils_2get_n_primes_near_x}; ++static PyMethodDef __pyx_mdef_5khmer_5_oxli_5utils_3get_n_primes_near_x = {"get_n_primes_near_x", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5khmer_5_oxli_5utils_3get_n_primes_near_x, METH_VARARGS|METH_KEYWORDS, 0}; + static PyObject *__pyx_pw_5khmer_5_oxli_5utils_3get_n_primes_near_x(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_n_primes = 0; + PyObject *__pyx_v_x = 0; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_n_primes_near_x (wrapper)", 0); +@@ -1352,6 +1530,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_5utils_2get_n_primes_near_x(CYTHON_UNUSE + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_n_primes_near_x", 0); + + /* "khmer/_oxli/utils.pyx":13 +@@ -1391,7 +1572,7 @@ static PyObject *__pyx_pf_5khmer_5_oxli_5utils_2get_n_primes_near_x(CYTHON_UNUSE + * raise RuntimeError(msg) + * return primes + */ +- __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_kp_u_unable_to_find_0_prime_numbers_1, __pyx_n_s_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 15, __pyx_L1_error) ++ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_unable_to_find_0_prime_numbers_1, __pyx_n_s_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; +@@ -1519,6 +1700,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_5utils__bstring(PyObject *__pyx_v_s) { + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + PyObject *__pyx_t_8 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_bstring", 0); + __Pyx_INCREF(__pyx_v_s); + +@@ -1550,7 +1734,7 @@ static PyObject *__pyx_f_5khmer_5_oxli_5utils__bstring(PyObject *__pyx_v_s) { + * + * if isinstance(s, unicode): + */ +- __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_kp_u_Requires_a_string_like_sequence, __pyx_n_s_format); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 23, __pyx_L1_error) ++ __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_Requires_a_string_like_sequence, __pyx_n_s_format); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 23, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = NULL; + __pyx_t_7 = 0; +@@ -1651,7 +1835,7 @@ static PyObject *__pyx_f_5khmer_5_oxli_5utils__bstring(PyObject *__pyx_v_s) { + __Pyx_DECREF_SET(__pyx_t_4, function); + } + } +- __pyx_t_5 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_8, __pyx_kp_u_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_kp_u_utf_8); ++ __pyx_t_5 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_8, __pyx_kp_s_utf_8) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_kp_s_utf_8); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 26, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); +@@ -1718,6 +1902,9 @@ static PyObject *__pyx_f_5khmer_5_oxli_5utils__ustring(PyObject *__pyx_v_s) { + 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("_ustring", 0); + + /* "khmer/_oxli/utils.pyx":31 +@@ -1874,7 +2061,6 @@ static bool __pyx_f_5khmer_5_oxli_5utils_is_str(PyObject *__pyx_v_s, CYTHON_UNUS + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_5utils_5is_str(PyObject *__pyx_self, PyObject *__pyx_v_s); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_5utils_4is_str[] = "is_str(s) -> bool"; + static PyObject *__pyx_pw_5khmer_5_oxli_5utils_5is_str(PyObject *__pyx_self, PyObject *__pyx_v_s) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -1890,6 +2076,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_5utils_4is_str(CYTHON_UNUSED PyObject *_ + 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("is_str", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_f_5khmer_5_oxli_5utils_is_str(__pyx_v_s, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 43, __pyx_L1_error) +@@ -1963,7 +2152,6 @@ static bool __pyx_f_5khmer_5_oxli_5utils_is_num(PyObject *__pyx_v_n, CYTHON_UNUS + + /* Python wrapper */ + static PyObject *__pyx_pw_5khmer_5_oxli_5utils_7is_num(PyObject *__pyx_self, PyObject *__pyx_v_n); /*proto*/ +-static char __pyx_doc_5khmer_5_oxli_5utils_6is_num[] = "is_num(n) -> bool"; + static PyObject *__pyx_pw_5khmer_5_oxli_5utils_7is_num(PyObject *__pyx_self, PyObject *__pyx_v_n) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations +@@ -1979,6 +2167,9 @@ static PyObject *__pyx_pf_5khmer_5_oxli_5utils_6is_num(CYTHON_UNUSED PyObject *_ + 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("is_num", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_f_5khmer_5_oxli_5utils_is_num(__pyx_v_n, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 46, __pyx_L1_error) +@@ -2010,8 +2201,8 @@ static void __pyx_f_5khmer_5_oxli_5utils__flatten_fill(double *__pyx_v_fill_to, + PyObject *__pyx_v_flattened = 0; + Py_ssize_t __pyx_v_idx; + PyObject *__pyx_v_item = NULL; +- PyObject *__pyx_7genexpr__pyx_v_sublist = NULL; +- PyObject *__pyx_7genexpr__pyx_v_x = NULL; ++ PyObject *__pyx_v_sublist = NULL; ++ PyObject *__pyx_v_x = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; +@@ -2022,6 +2213,9 @@ static void __pyx_f_5khmer_5_oxli_5utils__flatten_fill(double *__pyx_v_fill_to, + PyObject *(*__pyx_t_7)(PyObject *); + PyObject *__pyx_t_8 = NULL; + double __pyx_t_9; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_flatten_fill", 0); + + /* "khmer/_oxli/utils.pyx":51 +@@ -2031,105 +2225,95 @@ static void __pyx_f_5khmer_5_oxli_5utils__flatten_fill(double *__pyx_v_fill_to, + * for idx, item in enumerate(flattened): + * fill_to[idx] = item + */ +- { /* enter inner scope */ +- __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 51, __pyx_L5_error) +- __Pyx_GOTREF(__pyx_t_1); +- if (likely(PyList_CheckExact(__pyx_v_fill_from)) || PyTuple_CheckExact(__pyx_v_fill_from)) { +- __pyx_t_2 = __pyx_v_fill_from; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0; +- __pyx_t_4 = NULL; ++ __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 51, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_1); ++ if (likely(PyList_CheckExact(__pyx_v_fill_from)) || PyTuple_CheckExact(__pyx_v_fill_from)) { ++ __pyx_t_2 = __pyx_v_fill_from; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0; ++ __pyx_t_4 = NULL; ++ } else { ++ __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_fill_from); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 51, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_2); ++ __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 51, __pyx_L1_error) ++ } ++ for (;;) { ++ if (likely(!__pyx_t_4)) { ++ if (likely(PyList_CheckExact(__pyx_t_2))) { ++ if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break; ++ #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS ++ __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 51, __pyx_L1_error) ++ #else ++ __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 51, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_5); ++ #endif ++ } else { ++ if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break; ++ #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS ++ __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 51, __pyx_L1_error) ++ #else ++ __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 51, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_5); ++ #endif ++ } ++ } else { ++ __pyx_t_5 = __pyx_t_4(__pyx_t_2); ++ if (unlikely(!__pyx_t_5)) { ++ PyObject* exc_type = PyErr_Occurred(); ++ if (exc_type) { ++ if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); ++ else __PYX_ERR(0, 51, __pyx_L1_error) ++ } ++ break; ++ } ++ __Pyx_GOTREF(__pyx_t_5); ++ } ++ __Pyx_XDECREF_SET(__pyx_v_sublist, __pyx_t_5); ++ __pyx_t_5 = 0; ++ if (likely(PyList_CheckExact(__pyx_v_sublist)) || PyTuple_CheckExact(__pyx_v_sublist)) { ++ __pyx_t_5 = __pyx_v_sublist; __Pyx_INCREF(__pyx_t_5); __pyx_t_6 = 0; ++ __pyx_t_7 = NULL; + } else { +- __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_fill_from); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 51, __pyx_L5_error) +- __Pyx_GOTREF(__pyx_t_2); +- __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 51, __pyx_L5_error) ++ __pyx_t_6 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_v_sublist); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 51, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_5); ++ __pyx_t_7 = Py_TYPE(__pyx_t_5)->tp_iternext; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 51, __pyx_L1_error) + } + for (;;) { +- if (likely(!__pyx_t_4)) { +- if (likely(PyList_CheckExact(__pyx_t_2))) { +- if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break; ++ if (likely(!__pyx_t_7)) { ++ if (likely(PyList_CheckExact(__pyx_t_5))) { ++ if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_5)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS +- __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 51, __pyx_L5_error) ++ __pyx_t_8 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 51, __pyx_L1_error) + #else +- __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 51, __pyx_L5_error) +- __Pyx_GOTREF(__pyx_t_5); ++ __pyx_t_8 = PySequence_ITEM(__pyx_t_5, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 51, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_8); + #endif + } else { +- if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break; ++ if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_5)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS +- __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 51, __pyx_L5_error) ++ __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 51, __pyx_L1_error) + #else +- __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 51, __pyx_L5_error) +- __Pyx_GOTREF(__pyx_t_5); ++ __pyx_t_8 = PySequence_ITEM(__pyx_t_5, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 51, __pyx_L1_error) ++ __Pyx_GOTREF(__pyx_t_8); + #endif + } + } else { +- __pyx_t_5 = __pyx_t_4(__pyx_t_2); +- if (unlikely(!__pyx_t_5)) { ++ __pyx_t_8 = __pyx_t_7(__pyx_t_5); ++ if (unlikely(!__pyx_t_8)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); +- else __PYX_ERR(0, 51, __pyx_L5_error) ++ else __PYX_ERR(0, 51, __pyx_L1_error) + } + break; + } +- __Pyx_GOTREF(__pyx_t_5); ++ __Pyx_GOTREF(__pyx_t_8); + } +- __Pyx_XDECREF_SET(__pyx_7genexpr__pyx_v_sublist, __pyx_t_5); +- __pyx_t_5 = 0; +- if (likely(PyList_CheckExact(__pyx_7genexpr__pyx_v_sublist)) || PyTuple_CheckExact(__pyx_7genexpr__pyx_v_sublist)) { +- __pyx_t_5 = __pyx_7genexpr__pyx_v_sublist; __Pyx_INCREF(__pyx_t_5); __pyx_t_6 = 0; +- __pyx_t_7 = NULL; +- } else { +- __pyx_t_6 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_7genexpr__pyx_v_sublist); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 51, __pyx_L5_error) +- __Pyx_GOTREF(__pyx_t_5); +- __pyx_t_7 = Py_TYPE(__pyx_t_5)->tp_iternext; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 51, __pyx_L5_error) +- } +- for (;;) { +- if (likely(!__pyx_t_7)) { +- if (likely(PyList_CheckExact(__pyx_t_5))) { +- if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_5)) break; +- #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS +- __pyx_t_8 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 51, __pyx_L5_error) +- #else +- __pyx_t_8 = PySequence_ITEM(__pyx_t_5, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 51, __pyx_L5_error) +- __Pyx_GOTREF(__pyx_t_8); +- #endif +- } else { +- if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_5)) break; +- #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS +- __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_8); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 51, __pyx_L5_error) +- #else +- __pyx_t_8 = PySequence_ITEM(__pyx_t_5, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 51, __pyx_L5_error) +- __Pyx_GOTREF(__pyx_t_8); +- #endif +- } +- } else { +- __pyx_t_8 = __pyx_t_7(__pyx_t_5); +- if (unlikely(!__pyx_t_8)) { +- PyObject* exc_type = PyErr_Occurred(); +- if (exc_type) { +- if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); +- else __PYX_ERR(0, 51, __pyx_L5_error) +- } +- break; +- } +- __Pyx_GOTREF(__pyx_t_8); +- } +- __Pyx_XDECREF_SET(__pyx_7genexpr__pyx_v_x, __pyx_t_8); +- __pyx_t_8 = 0; +- if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_7genexpr__pyx_v_x))) __PYX_ERR(0, 51, __pyx_L5_error) +- } +- __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; ++ __Pyx_XDECREF_SET(__pyx_v_x, __pyx_t_8); ++ __pyx_t_8 = 0; ++ if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_v_x))) __PYX_ERR(0, 51, __pyx_L1_error) + } +- __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; +- __Pyx_XDECREF(__pyx_7genexpr__pyx_v_sublist); __pyx_7genexpr__pyx_v_sublist = 0; +- __Pyx_XDECREF(__pyx_7genexpr__pyx_v_x); __pyx_7genexpr__pyx_v_x = 0; +- goto __pyx_L10_exit_scope; +- __pyx_L5_error:; +- __Pyx_XDECREF(__pyx_7genexpr__pyx_v_sublist); __pyx_7genexpr__pyx_v_sublist = 0; +- __Pyx_XDECREF(__pyx_7genexpr__pyx_v_x); __pyx_7genexpr__pyx_v_x = 0; +- goto __pyx_L1_error; +- __pyx_L10_exit_scope:; +- } /* exit inner scope */ ++ __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; ++ } ++ __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_flattened = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + +@@ -2194,8 +2378,8 @@ static void __pyx_f_5khmer_5_oxli_5utils__flatten_fill(double *__pyx_v_fill_to, + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_flattened); + __Pyx_XDECREF(__pyx_v_item); +- __Pyx_XDECREF(__pyx_7genexpr__pyx_v_sublist); +- __Pyx_XDECREF(__pyx_7genexpr__pyx_v_x); ++ __Pyx_XDECREF(__pyx_v_sublist); ++ __Pyx_XDECREF(__pyx_v_x); + __Pyx_RefNannyFinishContext(); + } + +@@ -2218,6 +2402,9 @@ static void __pyx_f_5khmer_5_oxli_5utils__fill(double *__pyx_v_fill_to, PyObject + PyObject *__pyx_t_5 = NULL; + double __pyx_t_6; + Py_ssize_t __pyx_t_7; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_fill", 0); + + /* "khmer/_oxli/utils.pyx":57 +@@ -2271,7 +2458,7 @@ static void __pyx_f_5khmer_5_oxli_5utils__fill(double *__pyx_v_fill_to, PyObject + __pyx_t_5 = 0; + __Pyx_INCREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_1); +- __pyx_t_5 = __Pyx_PyInt_AddObjC(__pyx_t_1, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 57, __pyx_L1_error) ++ __pyx_t_5 = __Pyx_PyInt_AddObjC(__pyx_t_1, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 57, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); + __pyx_t_1 = __pyx_t_5; +@@ -2334,6 +2521,9 @@ static PyObject *__pyx_convert_vector_to_py_uint64_t(const std::vector + size_t __pyx_t_3; + size_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_convert_vector_to_py_uint64_t", 0); + + /* "vector.to_py":61 +@@ -2380,8 +2570,8 @@ static PyObject *__pyx_convert_vector_to_py_uint64_t(const std::vector + } + + static PyMethodDef __pyx_methods[] = { +- {"is_str", (PyCFunction)__pyx_pw_5khmer_5_oxli_5utils_5is_str, METH_O, __pyx_doc_5khmer_5_oxli_5utils_4is_str}, +- {"is_num", (PyCFunction)__pyx_pw_5khmer_5_oxli_5utils_7is_num, METH_O, __pyx_doc_5khmer_5_oxli_5utils_6is_num}, ++ {"is_str", (PyCFunction)__pyx_pw_5khmer_5_oxli_5utils_5is_str, METH_O, 0}, ++ {"is_num", (PyCFunction)__pyx_pw_5khmer_5_oxli_5utils_7is_num, METH_O, 0}, + {0, 0, 0, 0} + }; + +@@ -2427,7 +2617,7 @@ static struct PyModuleDef __pyx_moduledef = { + #endif + + static __Pyx_StringTabEntry __pyx_string_tab[] = { +- {&__pyx_kp_u_Requires_a_string_like_sequence, __pyx_k_Requires_a_string_like_sequence, sizeof(__pyx_k_Requires_a_string_like_sequence), 0, 1, 0, 0}, ++ {&__pyx_kp_s_Requires_a_string_like_sequence, __pyx_k_Requires_a_string_like_sequence, sizeof(__pyx_k_Requires_a_string_like_sequence), 0, 0, 1, 0}, + {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1}, + {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 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}, +@@ -2446,8 +2636,8 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_primes, __pyx_k_primes, sizeof(__pyx_k_primes), 0, 0, 1, 1}, + {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, +- {&__pyx_kp_u_unable_to_find_0_prime_numbers_1, __pyx_k_unable_to_find_0_prime_numbers_1, sizeof(__pyx_k_unable_to_find_0_prime_numbers_1), 0, 1, 0, 0}, +- {&__pyx_kp_u_utf_8, __pyx_k_utf_8, sizeof(__pyx_k_utf_8), 0, 1, 0, 0}, ++ {&__pyx_kp_s_unable_to_find_0_prime_numbers_1, __pyx_k_unable_to_find_0_prime_numbers_1, sizeof(__pyx_k_unable_to_find_0_prime_numbers_1), 0, 0, 1, 0}, ++ {&__pyx_kp_s_utf_8, __pyx_k_utf_8, sizeof(__pyx_k_utf_8), 0, 0, 1, 0}, + {&__pyx_n_s_x, __pyx_k_x, sizeof(__pyx_k_x), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} + }; +@@ -2541,6 +2731,9 @@ static int __Pyx_modinit_variable_export_code(void) { + + static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + if (__Pyx_ExportFunction("_bstring", (void (*)(void))__pyx_f_5khmer_5_oxli_5utils__bstring, "PyObject *(PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) +@@ -2589,17 +2782,19 @@ static int __Pyx_modinit_function_import_code(void) { + } + + +-#if PY_MAJOR_VERSION < 3 +-#ifdef CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC void +-#else ++#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 CYTHON_NO_PYINIT_EXPORT +-#define __Pyx_PyMODINIT_FUNC PyObject * ++#ifdef __cplusplus ++#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * + #else +-#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC ++#define __Pyx_PyMODINIT_FUNC PyObject * + #endif + #endif + +@@ -2681,6 +2876,9 @@ static CYTHON_SMALL_CODE int __pyx_pymod_exec_utils(PyObject *__pyx_pyinit_modul + #endif + { + PyObject *__pyx_t_1 = NULL; ++ int __pyx_lineno = 0; ++ const char *__pyx_filename = NULL; ++ int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { +@@ -2728,11 +2926,9 @@ if (!__Pyx_RefNanny) { + #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? */ ++ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif +- #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; +@@ -2748,10 +2944,9 @@ if (!__Pyx_RefNanny) { + __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) +- __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) +- #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); +- #endif ++ __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) +@@ -2776,7 +2971,7 @@ if (!__Pyx_RefNanny) { + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); +- if (unlikely(__Pyx_modinit_function_export_code() != 0)) goto __pyx_L1_error; ++ if (unlikely(__Pyx_modinit_function_export_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + (void)__Pyx_modinit_type_init_code(); + (void)__Pyx_modinit_type_import_code(); + (void)__Pyx_modinit_variable_import_code(); +@@ -2960,7 +3155,7 @@ static int __Pyx_ParseOptionalKeywords( + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 +- if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { ++ if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { +@@ -2987,7 +3182,7 @@ static int __Pyx_ParseOptionalKeywords( + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -3003,7 +3198,7 @@ static int __Pyx_ParseOptionalKeywords( + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 +- (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : ++ (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; +@@ -3071,7 +3266,7 @@ static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args + return result; + } + #if 1 || PY_VERSION_HEX < 0x030600B1 +-static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs) { ++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); +@@ -3142,12 +3337,12 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, + } + #if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); + #else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, +- args, nargs, ++ args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); + #endif +@@ -3186,7 +3381,7 @@ static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, P + #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; ++ ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) +@@ -3244,7 +3439,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec + 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) { ++ } else if (__Pyx_PyFastCFunction_Check(func)) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); + #endif + } +@@ -3518,7 +3713,9 @@ static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno, + + /* PyIntBinop */ + #if !CYTHON_COMPILING_IN_PYPY +-static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED int inplace) { ++static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, int inplace, int zerodivision_check) { ++ (void)inplace; ++ (void)zerodivision_check; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(op1))) { + const long b = intval; +@@ -3638,9 +3835,35 @@ static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED + } + #endif + ++/* 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 ++ + /* CLineInTraceback */ + #ifndef CYTHON_CLINE_IN_TRACEBACK +-static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { ++static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; + #if CYTHON_COMPILING_IN_CPYTHON +@@ -3670,7 +3893,7 @@ static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { + } + if (!use_cline) { + c_line = 0; +- PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); ++ (void) 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; +@@ -3744,7 +3967,7 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + 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)); ++ __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } +@@ -3764,33 +3987,40 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + #include "compile.h" + #include "frameobject.h" + #include "traceback.h" ++#if PY_VERSION_HEX >= 0x030b00a6 ++ #ifndef Py_BUILD_CORE ++ #define Py_BUILD_CORE 1 ++ #endif ++ #include "internal/pycore_frame.h" ++#endif + 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; ++ PyCodeObject *py_code = NULL; ++ PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 ++ PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); +- #else +- py_srcfile = PyUnicode_FromString(filename); +- #endif + if (!py_srcfile) goto bad; ++ #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); ++ if (!py_funcname) goto bad; ++ funcname = PyUnicode_AsUTF8(py_funcname); ++ if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); +- #else +- py_funcname = PyUnicode_FromString(funcname); ++ if (!py_funcname) goto bad; + #endif + } +- if (!py_funcname) goto bad; ++ #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, +@@ -3809,11 +4039,16 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); +- Py_DECREF(py_funcname); ++ #else ++ py_code = PyCode_NewEmpty(filename, funcname, py_line); ++ #endif ++ Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline + return py_code; + bad: +- Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); ++ #if PY_MAJOR_VERSION < 3 ++ Py_XDECREF(py_srcfile); ++ #endif + return NULL; + } + static void __Pyx_AddTraceback(const char *funcname, int c_line, +@@ -3821,14 +4056,24 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; ++ PyObject *ptype, *pvalue, *ptraceback; + 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) { ++ __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); +- if (!py_code) goto bad; ++ if (!py_code) { ++ /* If the code object creation fails, then we should clear the ++ fetched exception references and propagate the new exception */ ++ Py_XDECREF(ptype); ++ Py_XDECREF(pvalue); ++ Py_XDECREF(ptraceback); ++ goto bad; ++ } ++ __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( +@@ -3867,40 +4112,16 @@ bad: + return (target_type) value;\ + } + +-/* CIntToPy */ +-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint64_t(uint64_t value) { +- 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 (is_unsigned) { +- if (sizeof(uint64_t) < sizeof(long)) { +- return PyInt_FromLong((long) value); +- } else if (sizeof(uint64_t) <= sizeof(unsigned long)) { +- return PyLong_FromUnsignedLong((unsigned long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(uint64_t) <= sizeof(unsigned PY_LONG_LONG)) { +- return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +-#endif +- } +- } else { +- if (sizeof(uint64_t) <= sizeof(long)) { +- return PyInt_FromLong((long) value); +-#ifdef HAVE_LONG_LONG +- } else if (sizeof(uint64_t) <= 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(uint64_t), +- little, !is_unsigned); +- } +-} +- + /* 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; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const uint64_t neg_one = (uint64_t) -1, const_zero = (uint64_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -4089,7 +4310,14 @@ raise_neg_overflow: + + /* CIntFromPy */ + static CYTHON_INLINE uint32_t __Pyx_PyInt_As_uint32_t(PyObject *x) { +- const uint32_t neg_one = (uint32_t) ((uint32_t) 0 - (uint32_t) 1), const_zero = (uint32_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const uint32_t neg_one = (uint32_t) -1, const_zero = (uint32_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -4276,9 +4504,54 @@ raise_neg_overflow: + return (uint32_t) -1; + } + ++/* CIntToPy */ ++static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint64_t(uint64_t value) { ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const uint64_t neg_one = (uint64_t) -1, const_zero = (uint64_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif ++ const int is_unsigned = neg_one > const_zero; ++ if (is_unsigned) { ++ if (sizeof(uint64_t) < sizeof(long)) { ++ return PyInt_FromLong((long) value); ++ } else if (sizeof(uint64_t) <= sizeof(unsigned long)) { ++ return PyLong_FromUnsignedLong((unsigned long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(uint64_t) <= sizeof(unsigned PY_LONG_LONG)) { ++ return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); ++#endif ++ } ++ } else { ++ if (sizeof(uint64_t) <= sizeof(long)) { ++ return PyInt_FromLong((long) value); ++#ifdef HAVE_LONG_LONG ++ } else if (sizeof(uint64_t) <= 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(uint64_t), ++ little, !is_unsigned); ++ } ++} ++ + /* CIntFromPy */ + static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *x) { +- const size_t neg_one = (size_t) ((size_t) 0 - (size_t) 1), const_zero = (size_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const size_t neg_one = (size_t) -1, const_zero = (size_t) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -4467,7 +4740,14 @@ raise_neg_overflow: + + /* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { +@@ -4498,7 +4778,14 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + + /* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +- const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const long neg_one = (long) -1, const_zero = (long) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -4687,7 +4974,14 @@ raise_neg_overflow: + + /* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +- const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ const int neg_one = (int) -1, const_zero = (int) 0; ++#ifdef __Pyx_HAS_GCC_DIAGNOSTIC ++#pragma GCC diagnostic pop ++#endif + const int is_unsigned = neg_one > const_zero; + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { +@@ -4976,11 +5270,33 @@ static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObj + + /* 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 ctversion[5]; ++ int same=1, i, found_dot; ++ const char* rt_from_call = Py_GetVersion(); ++ PyOS_snprintf(ctversion, 5, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); ++ found_dot = 0; ++ for (i = 0; i < 4; i++) { ++ if (!ctversion[i]) { ++ same = (rt_from_call[i] < '0' || rt_from_call[i] > '9'); ++ break; ++ } ++ if (rt_from_call[i] != ctversion[i]) { ++ same = 0; ++ break; ++ } ++ } ++ if (!same) { ++ char rtversion[5] = {'\0'}; + char message[200]; ++ for (i=0; i<4; ++i) { ++ if (rt_from_call[i] == '.') { ++ if (found_dot) break; ++ found_dot = 1; ++ } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') { ++ break; ++ } ++ rtversion[i] = rt_from_call[i]; ++ } + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", +@@ -5275,6 +5591,23 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_DECREF(x); + return ival; + } ++static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { ++ if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { ++ return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); ++#if PY_MAJOR_VERSION < 3 ++ } else if (likely(PyInt_CheckExact(o))) { ++ return PyInt_AS_LONG(o); ++#endif ++ } else { ++ Py_ssize_t ival; ++ PyObject *x; ++ x = PyNumber_Index(o); ++ if (!x) return -1; ++ ival = PyInt_AsLong(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); + } +diff --git a/khmer/kfile.py b/khmer/kfile.py +index a3a81706..ab3168c0 100755 +--- a/khmer/kfile.py ++++ b/khmer/kfile.py +@@ -40,7 +40,7 @@ import sys + import errno + from stat import S_ISBLK, S_ISFIFO, S_ISCHR + import gzip +-import bz2file ++import bz2 + + + def check_input_files(file_path, force): +@@ -209,6 +209,12 @@ def is_block(fthing): + """Take in a file object and checks to see if it's a block or fifo.""" + if fthing is sys.stdout or fthing is sys.stdin: + return True ++ if hasattr(fthing, "iastty") and fthing.isatty(): ++ return True ++ elif not hasattr(fthing, 'name'): ++ return True ++ if fthing.name == "": ++ return True + else: + mode = os.stat(fthing.name).st_mode + return S_ISBLK(mode) or S_ISCHR(mode) +@@ -241,7 +247,7 @@ def get_file_writer(file_handle, do_gzip, do_bzip): + if do_gzip: + ofile = gzip.GzipFile(fileobj=file_handle, mode='w') + elif do_bzip: +- ofile = bz2file.open(file_handle, mode='w') ++ ofile = bz2.open(file_handle, mode='w') + else: + ofile = file_handle + +diff --git a/khmer/khmer_args.py b/khmer/khmer_args.py +index 77e11049..ed1d5a43 100755 +--- a/khmer/khmer_args.py ++++ b/khmer/khmer_args.py +@@ -156,14 +156,16 @@ class KhmerArgumentParser(argparse.ArgumentParser): + + # Temporary fix to argparse FileType which ignores the + # binary mode flag. Upstream bug tracked in https://bugs.python.org/issue14156 ++# Fixed in 3.9.12 and 3.10.3. + # pylint: disable=too-few-public-methods,missing-docstring + class FileType(argparse.FileType): + def __call__(self, fname): + # detect if stdout is being faked (StringIO during unit tests) in + # which case we do not have to do anything + if (fname == '-' and +- sys.version_info.major == 3 and +- not isinstance(sys.stdout, StringIO)): ++ not isinstance(sys.stdout, StringIO) and ++ (sys.version_info < (3, 9, 12) or ++ (3, 10) < sys.version_info < (3, 10, 3))): + if 'r' in self._mode: + fname = sys.stdin.fileno() + elif 'w' in self._mode: +diff --git a/scripts/extract-paired-reads.py b/scripts/extract-paired-reads.py +index 29d7cbe3..eb5499d7 100755 +--- a/scripts/extract-paired-reads.py ++++ b/scripts/extract-paired-reads.py +@@ -167,7 +167,7 @@ def main(): + paired_fp.close() + + if n_pe == 0: +- raise Exception("no paired reads!? check file formats...") ++ raise TypeError("no paired reads!? check file formats...") + + print('DONE; read %d sequences,' + ' %d pairs and %d singletons' % +diff --git a/scripts/trim-low-abund.py b/scripts/trim-low-abund.py +index 85725751..9ba2092e 100755 +--- a/scripts/trim-low-abund.py ++++ b/scripts/trim-low-abund.py +@@ -514,7 +514,7 @@ def main(): + + if args.output is None: + log_info('output in *.abundtrim') +- elif args.output.name == 1: ++ elif not hasattr(args.output, 'name') or args.output.name == 1: + log_info('output streamed to stdout') + elif args.output.name: + log_info('output in {}'.format(args.output.name)) +diff --git a/setup.cfg b/setup.cfg +index 894a4ea9..389b4c89 100644 +--- a/setup.cfg ++++ b/setup.cfg +@@ -6,8 +6,8 @@ undef = NO_UNIQUE_RC + # docker/Dockerfile + # libraries = z,bz2 + ## if using system libraries +-include-dirs = include:third-party/zlib:third-party/bzip2:third-party/seqan/core/include:third-party/smhasher:third-party/cqf:third-party/rollinghash +-# include-dirs = lib ++include_dirs = include:third-party/zlib:third-party/bzip2:third-party/seqan/core/include:third-party/smhasher:third-party/cqf:third-party/rollinghash ++# include_dirs = lib + ## if using system libraries (broken) + + # define = NDEBUG +diff --git a/setup.py b/setup.py +index 86291415..1bbf3175 100755 +--- a/setup.py ++++ b/setup.py +@@ -1,4 +1,4 @@ +-#! /usr/bin/env python ++#! /usr/bin/env python3 + # vim: set fileencoding=utf-8 + # This file is part of khmer, https://github.com/dib-lab/khmer/, and is + # Copyright (C) 2013-2015, Michigan State University. +@@ -237,9 +237,11 @@ CLASSIFIERS = [ + "Operating System :: POSIX :: Linux", + "Operating System :: MacOS :: MacOS X", + "Programming Language :: C++", +- "Programming Language :: Python :: 3.4", +- "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", ++ "Programming Language :: Python :: 3.7", ++ "Programming Language :: Python :: 3.8", ++ "Programming Language :: Python :: 3.9", ++ "Programming Language :: Python :: 3.10", + "Topic :: Scientific/Engineering :: Bio-Informatics", + ] + if "-rc" in versioneer.get_version(): +@@ -275,7 +277,7 @@ SETUP_METADATA = \ + "packages": ['khmer', 'khmer.tests', 'oxli', 'khmer._oxli'], + "package_data": {'khmer/_oxli': ['*.pxd']}, + "package_dir": {'khmer.tests': 'tests'}, +- "install_requires": ['screed>=1.0', 'bz2file'], ++ "install_requires": ['screed>=1.0'], + "setup_requires": ['setuptools>=18.0'], + "extras_require": {':python_version=="2.6"': ['argparse>=1.2.1'], + 'docs': ['sphinx', 'sphinxcontrib-autoprogram'], +diff --git a/src/oxli/kmer_hash.cc b/src/oxli/kmer_hash.cc +index 8378ee19..d5ea8b58 100644 +--- a/src/oxli/kmer_hash.cc ++++ b/src/oxli/kmer_hash.cc +@@ -41,6 +41,7 @@ Contact: khmer-project@idyll.org + #include + #include + #include ++#include + + #include "MurmurHash3.h" + #include "oxli/oxli.hh" +diff --git a/src/oxli/test-compile.cc b/src/oxli/test-compile.cc +index 698a3246..359483ff 100644 +--- a/src/oxli/test-compile.cc ++++ b/src/oxli/test-compile.cc +@@ -39,10 +39,10 @@ Contact: khmer-project@idyll.org + // This file is used to test compilation with liboxli.a/liboxli.so, after + // installation + +-#include ++#include + + int main() + { +- oxli::Countgraph test(1,1); ++ oxli::Countgraph test(1,{1}); + return 0; + } +diff --git a/tests/khmer_tst_utils.py b/tests/khmer_tst_utils.py +index dc9c867d..dcd53ac1 100755 +--- a/tests/khmer_tst_utils.py ++++ b/tests/khmer_tst_utils.py +@@ -43,18 +43,13 @@ from pkg_resources import Requirement, resource_filename, ResolutionError + import sys + import traceback + import subprocess +-from io import open # pylint: disable=redefined-builtin ++from io import BufferedWriter, BytesIO, StringIO, TextIOWrapper + from hashlib import md5 + + from khmer import reverse_complement as revcomp + + import pytest + +-try: +- from StringIO import StringIO +-except ImportError: +- from io import StringIO +- + + def _equals_rc(query, match): + return (query == match) or (revcomp(query) == match) +@@ -150,6 +145,25 @@ def _runscript(scriptname, sandbox=False): + return -1 + + ++class StdIOBuffer(TextIOWrapper): ++ '''Replacement for writable io.StringIO that behaves more like real file ++ Unlike StringIO, provides a buffer attribute that holds the underlying ++ binary data, allowing it to replace sys.stdout/sys.stderr in more ++ contexts. ++ ''' ++ ++ name = 'StdIOBuffer' ++ ++ def __init__(self, initial_value='', newline='\n'): ++ initial_value = initial_value.encode('utf-8') ++ super().__init__(BufferedWriter(BytesIO(initial_value)), ++ 'utf-8', newline=newline) ++ ++ def getvalue(self): ++ self.flush() ++ return self.buffer.raw.getvalue().decode('utf-8') ++ ++ + def runscript(scriptname, args, in_directory=None, + fail_ok=False, sandbox=False): + """Run a Python script using exec(). +@@ -171,9 +185,8 @@ def runscript(scriptname, args, in_directory=None, + sys.argv = sysargs + + oldout, olderr = sys.stdout, sys.stderr +- sys.stdout = StringIO() +- sys.stdout.name = "StringIO" +- sys.stderr = StringIO() ++ sys.stdout = StdIOBuffer() ++ sys.stderr = StdIOBuffer() + + if in_directory: + os.chdir(in_directory) +@@ -187,7 +200,7 @@ def runscript(scriptname, args, in_directory=None, + status = _runscript(scriptname, sandbox=sandbox) + except SystemExit as err: + status = err.code +- except: # pylint: disable=bare-except ++ except (OSError, ValueError, TypeError): + traceback.print_exc(file=sys.stderr) + status = -1 + finally: diff --git a/recipes/khmer/0001-Inject-compiler-and-flags-for-third-party-compilation.patch b/recipes/khmer/0001-Inject-compiler-and-flags-for-third-party-compilation.patch index 2c9fc260a8be3..41464d07626b3 100644 --- a/recipes/khmer/0001-Inject-compiler-and-flags-for-third-party-compilation.patch +++ b/recipes/khmer/0001-Inject-compiler-and-flags-for-third-party-compilation.patch @@ -10,6 +10,6 @@ -# libraries = z,bz2 +libraries = z,bz2 ## if using system libraries --include-dirs = include:third-party/zlib:third-party/bzip2:third-party/seqan/core/include:third-party/smhasher:third-party/cqf:third-party/rollinghash -+include-dirs = include:third-party/seqan/core/include:third-party/smhasher:third-party/cqf:third-party/rollinghash - # include-dirs = lib +-include_dirs = include:third-party/zlib:third-party/bzip2:third-party/seqan/core/include:third-party/smhasher:third-party/cqf:third-party/rollinghash ++include_dirs = include:third-party/seqan/core/include:third-party/smhasher:third-party/cqf:third-party/rollinghash + # include_dirs = lib diff --git a/recipes/khmer/meta.yaml b/recipes/khmer/meta.yaml index ea14010bbd4f7..9baaf5b9effbd 100644 --- a/recipes/khmer/meta.yaml +++ b/recipes/khmer/meta.yaml @@ -9,13 +9,15 @@ source: url: https://github.com/dib-lab/khmer/archive/v{{ version }}.tar.gz sha256: {{ sha256 }} patches: + # https://github.com/dib-lab/khmer/compare/master...mr-c:khmer:python_3.10+.patch + - 0000-Upgrade-to-python3.10.patch - 0001-Inject-compiler-and-flags-for-third-party-compilation.patch - 0002-remove-m64.patch build: - number: 5 - skip: True # [py<30 or py>=312 or osx] - script: {{ PYTHON }} -m pip install . --no-deps -vv + number: 6 + skip: True # [osx] + script: SETUPTOOLS_USE_DISTUTILS=stdlib {{ PYTHON }} -m pip install . --no-deps --no-build-isolation --no-cache-dir --use-pep517 -vvv run_exports: - {{ pin_subpackage('khmer', max_pin="x.x") }} @@ -27,14 +29,14 @@ requirements: - libgomp # [linux] - make host: - - python >=3.6,<3.12 + - python >=3.6 - pip - setuptools >=18.0 - Cython >=0.25.2 - bzip2 - zlib run: - - python >=3.6,<3.12 + - python >=3.6 - screed >=1.0 - bz2file - bzip2 @@ -55,8 +57,9 @@ about: extra: additional-platforms: - - linux-aarch64 - - osx-arm64 +# needs cqf porting +# - linux-aarch64 +# - osx-arm64 identifiers: - biotools:khmer - doi:10.12688/f1000research.6924.1 From 20bd12e13c9abd6705b9c1c933d681def2bccd14 Mon Sep 17 00:00:00 2001 From: David Lecomber Date: Sun, 19 Jan 2025 00:52:00 +0000 Subject: [PATCH 2/8] Set the temporary build directory ( used to link into readaligner.so ) to the actual directory used by recent setuptools. Set setuptools minimum version to > 62.1 (https://stackoverflow.com/questions/14320220/testing-python-c-libraries-get-build-path) --- recipes/khmer/0004-builddirs-setup.patch | 15 ++++++ recipes/khmer/meta.yaml | 66 +----------------------- 2 files changed, 16 insertions(+), 65 deletions(-) create mode 100644 recipes/khmer/0004-builddirs-setup.patch diff --git a/recipes/khmer/0004-builddirs-setup.patch b/recipes/khmer/0004-builddirs-setup.patch new file mode 100644 index 0000000000000..8cbaaa322ad41 --- /dev/null +++ b/recipes/khmer/0004-builddirs-setup.patch @@ -0,0 +1,15 @@ +--- setup.py.orig 2025-01-19 00:50:27 ++++ setup.py 2025-01-19 00:50:31 +@@ -130,10 +130,10 @@ + + def distutils_dir_name(dname): + """Returns the name of a distutils build directory""" +- f = "{dirname}.{platform}-{version[0]}.{version[1]}" ++ f = "{dirname}.{platform}-{cache_tag}" + return f.format(dirname=dname, + platform=sysconfig.get_platform(), +- version=sys.version_info) ++ cache_tag=sys.implementation.cache_tag) + + + def build_dir(): diff --git a/recipes/khmer/meta.yaml b/recipes/khmer/meta.yaml index 9baaf5b9effbd..e33959b077cfd 100644 --- a/recipes/khmer/meta.yaml +++ b/recipes/khmer/meta.yaml @@ -1,65 +1 @@ -{% set version = "3.0.0a3" %} -{% set sha256 = "9850baec8b905c0896f00d0e427d4564f4c87dd7f1abae64734ad0361678e620" %} - -package: - name: khmer - version: {{ version }} - -source: - url: https://github.com/dib-lab/khmer/archive/v{{ version }}.tar.gz - sha256: {{ sha256 }} - patches: - # https://github.com/dib-lab/khmer/compare/master...mr-c:khmer:python_3.10+.patch - - 0000-Upgrade-to-python3.10.patch - - 0001-Inject-compiler-and-flags-for-third-party-compilation.patch - - 0002-remove-m64.patch - -build: - number: 6 - skip: True # [osx] - script: SETUPTOOLS_USE_DISTUTILS=stdlib {{ PYTHON }} -m pip install . --no-deps --no-build-isolation --no-cache-dir --use-pep517 -vvv - run_exports: - - {{ pin_subpackage('khmer', max_pin="x.x") }} - -requirements: - build: - - {{ compiler("c") }} - - {{ compiler("cxx") }} - - llvm-openmp # [osx] - - libgomp # [linux] - - make - host: - - python >=3.6 - - pip - - setuptools >=18.0 - - Cython >=0.25.2 - - bzip2 - - zlib - run: - - python >=3.6 - - screed >=1.0 - - bz2file - - bzip2 - - zlib - -test: - imports: - - khmer - - khmer.tests - - oxli - -about: - home: https://khmer.readthedocs.io/ - license: BSD License - license_family: BSD - summary: khmer k-mer counting library - dev_url: https://github.com/dib-lab/khmer - -extra: - additional-platforms: -# needs cqf porting -# - linux-aarch64 -# - osx-arm64 - identifiers: - - biotools:khmer - - doi:10.12688/f1000research.6924.1 +{% set version = "3.0.0a3" %} {% set sha256 = "9850baec8b905c0896f00d0e427d4564f4c87dd7f1abae64734ad0361678e620" %} package: name: khmer version: {{ version }} source: url: https://github.com/dib-lab/khmer/archive/v{{ version }}.tar.gz sha256: {{ sha256 }} patches: # https://github.com/dib-lab/khmer/compare/master...mr-c:khmer:python_3.10+.patch - 0000-Upgrade-to-python3.10.patch - 0001-Inject-compiler-and-flags-for-third-party-compilation.patch - 0002-remove-m64.patch - 0004-builddirs-setup.patch build: number: 6 skip: True # [osx] script: {{ PYTHON }} -m pip install . --no-deps --no-build-isolation --no-cache-dir --use-pep517 -vvv run_exports: - {{ pin_subpackage('khmer', max_pin="x") }} requirements: build: - {{ compiler("c") }} - {{ compiler("cxx") }} - llvm-openmp # [osx] - libgomp # [linux] - make host: - python >=3.6 - pip - setuptools >=62.1 - Cython >=0.25.2 - bzip2 - zlib run: - python >=3.6 - screed >=1.0 - bz2file - bzip2 - zlib test: imports: - khmer - khmer.tests - oxli about: home: https://khmer.readthedocs.io/ license: BSD License license_family: BSD summary: khmer k-mer counting library dev_url: https://github.com/dib-lab/khmer extra: additional-platforms: # needs cqf porting # - linux-aarch64 # - osx-arm64 identifiers: - biotools:khmer - doi:10.12688/f1000research.6924.1 \ No newline at end of file From 9f419ca401e6ee0dc100400623787734c03bda67 Mon Sep 17 00:00:00 2001 From: David Lecomber Date: Sun, 19 Jan 2025 01:42:36 +0000 Subject: [PATCH 3/8] This reverts commit 20bd12e13c9abd6705b9c1c933d681def2bccd14 - we encounter a bug in python versioneer. --- recipes/khmer/0004-builddirs-setup.patch | 15 ------ recipes/khmer/meta.yaml | 66 +++++++++++++++++++++++- 2 files changed, 65 insertions(+), 16 deletions(-) delete mode 100644 recipes/khmer/0004-builddirs-setup.patch diff --git a/recipes/khmer/0004-builddirs-setup.patch b/recipes/khmer/0004-builddirs-setup.patch deleted file mode 100644 index 8cbaaa322ad41..0000000000000 --- a/recipes/khmer/0004-builddirs-setup.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- setup.py.orig 2025-01-19 00:50:27 -+++ setup.py 2025-01-19 00:50:31 -@@ -130,10 +130,10 @@ - - def distutils_dir_name(dname): - """Returns the name of a distutils build directory""" -- f = "{dirname}.{platform}-{version[0]}.{version[1]}" -+ f = "{dirname}.{platform}-{cache_tag}" - return f.format(dirname=dname, - platform=sysconfig.get_platform(), -- version=sys.version_info) -+ cache_tag=sys.implementation.cache_tag) - - - def build_dir(): diff --git a/recipes/khmer/meta.yaml b/recipes/khmer/meta.yaml index e33959b077cfd..9baaf5b9effbd 100644 --- a/recipes/khmer/meta.yaml +++ b/recipes/khmer/meta.yaml @@ -1 +1,65 @@ -{% set version = "3.0.0a3" %} {% set sha256 = "9850baec8b905c0896f00d0e427d4564f4c87dd7f1abae64734ad0361678e620" %} package: name: khmer version: {{ version }} source: url: https://github.com/dib-lab/khmer/archive/v{{ version }}.tar.gz sha256: {{ sha256 }} patches: # https://github.com/dib-lab/khmer/compare/master...mr-c:khmer:python_3.10+.patch - 0000-Upgrade-to-python3.10.patch - 0001-Inject-compiler-and-flags-for-third-party-compilation.patch - 0002-remove-m64.patch - 0004-builddirs-setup.patch build: number: 6 skip: True # [osx] script: {{ PYTHON }} -m pip install . --no-deps --no-build-isolation --no-cache-dir --use-pep517 -vvv run_exports: - {{ pin_subpackage('khmer', max_pin="x") }} requirements: build: - {{ compiler("c") }} - {{ compiler("cxx") }} - llvm-openmp # [osx] - libgomp # [linux] - make host: - python >=3.6 - pip - setuptools >=62.1 - Cython >=0.25.2 - bzip2 - zlib run: - python >=3.6 - screed >=1.0 - bz2file - bzip2 - zlib test: imports: - khmer - khmer.tests - oxli about: home: https://khmer.readthedocs.io/ license: BSD License license_family: BSD summary: khmer k-mer counting library dev_url: https://github.com/dib-lab/khmer extra: additional-platforms: # needs cqf porting # - linux-aarch64 # - osx-arm64 identifiers: - biotools:khmer - doi:10.12688/f1000research.6924.1 \ No newline at end of file +{% set version = "3.0.0a3" %} +{% set sha256 = "9850baec8b905c0896f00d0e427d4564f4c87dd7f1abae64734ad0361678e620" %} + +package: + name: khmer + version: {{ version }} + +source: + url: https://github.com/dib-lab/khmer/archive/v{{ version }}.tar.gz + sha256: {{ sha256 }} + patches: + # https://github.com/dib-lab/khmer/compare/master...mr-c:khmer:python_3.10+.patch + - 0000-Upgrade-to-python3.10.patch + - 0001-Inject-compiler-and-flags-for-third-party-compilation.patch + - 0002-remove-m64.patch + +build: + number: 6 + skip: True # [osx] + script: SETUPTOOLS_USE_DISTUTILS=stdlib {{ PYTHON }} -m pip install . --no-deps --no-build-isolation --no-cache-dir --use-pep517 -vvv + run_exports: + - {{ pin_subpackage('khmer', max_pin="x.x") }} + +requirements: + build: + - {{ compiler("c") }} + - {{ compiler("cxx") }} + - llvm-openmp # [osx] + - libgomp # [linux] + - make + host: + - python >=3.6 + - pip + - setuptools >=18.0 + - Cython >=0.25.2 + - bzip2 + - zlib + run: + - python >=3.6 + - screed >=1.0 + - bz2file + - bzip2 + - zlib + +test: + imports: + - khmer + - khmer.tests + - oxli + +about: + home: https://khmer.readthedocs.io/ + license: BSD License + license_family: BSD + summary: khmer k-mer counting library + dev_url: https://github.com/dib-lab/khmer + +extra: + additional-platforms: +# needs cqf porting +# - linux-aarch64 +# - osx-arm64 + identifiers: + - biotools:khmer + - doi:10.12688/f1000research.6924.1 From 87adcce1898d1ab6cb3a68882984e900c8fe7caa Mon Sep 17 00:00:00 2001 From: David Lecomber Date: Sun, 19 Jan 2025 01:45:10 +0000 Subject: [PATCH 4/8] Force to python3.10 max, and update the cython minimum version. --- recipes/khmer/meta.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/recipes/khmer/meta.yaml b/recipes/khmer/meta.yaml index 9baaf5b9effbd..26f81b42791fd 100644 --- a/recipes/khmer/meta.yaml +++ b/recipes/khmer/meta.yaml @@ -29,14 +29,14 @@ requirements: - libgomp # [linux] - make host: - - python >=3.6 + - python >=3.6,<3.11 - pip - setuptools >=18.0 - - Cython >=0.25.2 + - Cython >=0.62.1 - bzip2 - zlib run: - - python >=3.6 + - python >=3.6,<3.11 - screed >=1.0 - bz2file - bzip2 From 83b6ef05164e3994696f6a3a5753408d25a43060 Mon Sep 17 00:00:00 2001 From: David Lecomber Date: Sun, 19 Jan 2025 11:12:09 +0000 Subject: [PATCH 5/8] Tested and builds on py3.11 --- recipes/khmer/meta.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipes/khmer/meta.yaml b/recipes/khmer/meta.yaml index 26f81b42791fd..d0630b8c14560 100644 --- a/recipes/khmer/meta.yaml +++ b/recipes/khmer/meta.yaml @@ -29,14 +29,14 @@ requirements: - libgomp # [linux] - make host: - - python >=3.6,<3.11 + - python >=3.6,<3.12 - pip - setuptools >=18.0 - Cython >=0.62.1 - bzip2 - zlib run: - - python >=3.6,<3.11 + - python >=3.6,<3.12 - screed >=1.0 - bz2file - bzip2 From 8d22161683b891409371a64c3402815687018bc2 Mon Sep 17 00:00:00 2001 From: David Lecomber Date: Mon, 20 Jan 2025 10:07:16 +0000 Subject: [PATCH 6/8] Bump python version supported, and update to latest setuptools --- recipes/khmer/meta.yaml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/recipes/khmer/meta.yaml b/recipes/khmer/meta.yaml index d0630b8c14560..3e3106df35572 100644 --- a/recipes/khmer/meta.yaml +++ b/recipes/khmer/meta.yaml @@ -13,11 +13,12 @@ source: - 0000-Upgrade-to-python3.10.patch - 0001-Inject-compiler-and-flags-for-third-party-compilation.patch - 0002-remove-m64.patch + - 0004-builddirs-setup.patch build: number: 6 skip: True # [osx] - script: SETUPTOOLS_USE_DISTUTILS=stdlib {{ PYTHON }} -m pip install . --no-deps --no-build-isolation --no-cache-dir --use-pep517 -vvv + script: {{ PYTHON }} -m pip install . --no-deps --no-build-isolation --no-cache-dir --use-pep517 -vvv run_exports: - {{ pin_subpackage('khmer', max_pin="x.x") }} @@ -29,14 +30,14 @@ requirements: - libgomp # [linux] - make host: - - python >=3.6,<3.12 + - python >=3.8,<3.12 - pip - - setuptools >=18.0 - - Cython >=0.62.1 + - setuptools >=62.1 + - Cython - bzip2 - zlib run: - - python >=3.6,<3.12 + - python >=3.8,<3.12 - screed >=1.0 - bz2file - bzip2 From 13fe74276529407cacac696d3305d2f7848ff99b Mon Sep 17 00:00:00 2001 From: David Lecomber Date: Mon, 20 Jan 2025 10:07:42 +0000 Subject: [PATCH 7/8] khmer: Add patch for changing the temp build directory (reqd by latest setuptools) --- recipes/khmer/0004-builddirs-setup.patch | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 recipes/khmer/0004-builddirs-setup.patch diff --git a/recipes/khmer/0004-builddirs-setup.patch b/recipes/khmer/0004-builddirs-setup.patch new file mode 100644 index 0000000000000..8cbaaa322ad41 --- /dev/null +++ b/recipes/khmer/0004-builddirs-setup.patch @@ -0,0 +1,15 @@ +--- setup.py.orig 2025-01-19 00:50:27 ++++ setup.py 2025-01-19 00:50:31 +@@ -130,10 +130,10 @@ + + def distutils_dir_name(dname): + """Returns the name of a distutils build directory""" +- f = "{dirname}.{platform}-{version[0]}.{version[1]}" ++ f = "{dirname}.{platform}-{cache_tag}" + return f.format(dirname=dname, + platform=sysconfig.get_platform(), +- version=sys.version_info) ++ cache_tag=sys.implementation.cache_tag) + + + def build_dir(): From 89f36c624e6a845962801ab2c050d44bf5976efd Mon Sep 17 00:00:00 2001 From: David Lecomber Date: Mon, 20 Jan 2025 18:12:16 +0000 Subject: [PATCH 8/8] khmer: reenable aarch64 with aarch64 cqf implementation - meta.yaml - Remove osx-arm64/osx - keep on skip list: it appears to compile with v16 compilers but fails to package / test correctly. - Add patch to cqf/gqf.c - 0005-enable-aarch64.patch - new - use __builtins where they exist and should perform equally fasts to existing assembler. - 0001-Inject-compiler-and-flags...patch - use CC for cqf/gqf.c as OS/X will not compile C file with c++ compiler (if someone does try to fix the packaging issue some day) --- ...nd-flags-for-third-party-compilation.patch | 4 +- recipes/khmer/0005-enable-aarch64.patch | 56 +++++++++++++++++++ recipes/khmer/conda_build_config.yaml | 4 +- recipes/khmer/meta.yaml | 6 +- 4 files changed, 62 insertions(+), 8 deletions(-) create mode 100644 recipes/khmer/0005-enable-aarch64.patch diff --git a/recipes/khmer/0001-Inject-compiler-and-flags-for-third-party-compilation.patch b/recipes/khmer/0001-Inject-compiler-and-flags-for-third-party-compilation.patch index 41464d07626b3..68aa4633d9ab9 100644 --- a/recipes/khmer/0001-Inject-compiler-and-flags-for-third-party-compilation.patch +++ b/recipes/khmer/0001-Inject-compiler-and-flags-for-third-party-compilation.patch @@ -1,8 +1,8 @@ --- setup.py +++ setup.py -@@ -318 +318 @@ +@@ -318,1 +318,1 @@ - cqfcmd = ['bash', '-c', 'cd third-party/cqf && make'] -+ cqfcmd = ['bash', '-c', 'cd third-party/cqf && cxx="${CXX} ${CXXFLAGS} ${LDFLAGS} -std=c++11" && make CC="${cxx} -fPIC" CXX="${cxx} -fPIC" LD="${cxx}"'] ++ cqfcmd = ['bash', '-c', 'cd third-party/cqf && cxx="${CXX} ${CXXFLAGS} ${LDFLAGS} -std=c++11" && make CC="${CC} -fPIC" CXX="${cxx} -fPIC" LD="${cxx}"'] --- setup.cfg +++ setup.cfg @@ -6,5 +6,5 @@ diff --git a/recipes/khmer/0005-enable-aarch64.patch b/recipes/khmer/0005-enable-aarch64.patch new file mode 100644 index 0000000000000..ef3704fb917dc --- /dev/null +++ b/recipes/khmer/0005-enable-aarch64.patch @@ -0,0 +1,56 @@ +--- third-party/cqf/gqf.c~ 2019-03-13 13:42:12 ++++ third-party/cqf/gqf.c 2025-01-20 17:31:09 +@@ -49,11 +49,7 @@ + + static inline int popcnt(uint64_t val) + { +- asm("popcnt %[val], %[val]" +- : [val] "+r" (val) +- : +- : "cc"); +- return val; ++ return __builtin_popcountll(val); + } + + static inline int64_t bitscanreverse(uint64_t val) +@@ -61,11 +57,16 @@ + if (val == 0) { + return -1; + } else { +- asm("bsr %[val], %[val]" +- : [val] "+r" (val) +- : +- : "cc"); +- return val; ++#ifdef __x86_64__ ++ asm("bsr %[val], %[val]" ++ : [val] "+r" (val) ++ : ++ : "cc"); ++#else ++ val = 63 - __builtin_clzll(val); ++#endif ++ ++ return val; + } + } + +@@ -81,11 +82,7 @@ + // Bits are numbered from 0 + static inline int bitrank(uint64_t val, int pos) { + val = val & ((2ULL << pos) - 1); +- asm("popcnt %[val], %[val]" +- : [val] "+r" (val) +- : +- : "cc"); +- return val; ++ return __builtin_popcountll(val); + } + + /** +@@ -1630,3 +1627,5 @@ + + return; + } ++ ++ diff --git a/recipes/khmer/conda_build_config.yaml b/recipes/khmer/conda_build_config.yaml index 1271f9dfbd295..a32bec22ce5d1 100644 --- a/recipes/khmer/conda_build_config.yaml +++ b/recipes/khmer/conda_build_config.yaml @@ -1,7 +1,7 @@ # current version does not build with newer compilers cxx_compiler_version: - 10 # [linux] - - 14 # [osx] + - 16 # [osx] c_compiler_version: - 10 # [linux] - - 14 # [osx] + - 16 # [osx] diff --git a/recipes/khmer/meta.yaml b/recipes/khmer/meta.yaml index 3e3106df35572..cc39f131d422d 100644 --- a/recipes/khmer/meta.yaml +++ b/recipes/khmer/meta.yaml @@ -14,7 +14,7 @@ source: - 0001-Inject-compiler-and-flags-for-third-party-compilation.patch - 0002-remove-m64.patch - 0004-builddirs-setup.patch - + - 0005-enable-aarch64.patch build: number: 6 skip: True # [osx] @@ -58,9 +58,7 @@ about: extra: additional-platforms: -# needs cqf porting -# - linux-aarch64 -# - osx-arm64 + - linux-aarch64 identifiers: - biotools:khmer - doi:10.12688/f1000research.6924.1