diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 05e65f1..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,82 +0,0 @@
-.env
-settings.json
-.spyderproject
-.spyproject
-guiqwt.chm
-guiqwt.chm.zip
-Thumbs.db
-src/histogram2d.c
-src/mandelbrot.c
-doc.zip
-test1.u16.tif
-test1.u8.png
-test2.u8.png
-test2.u16.tif
-contrast.png
-doctmp/
-test.png
-loadsavecanvas.h5
-*.pickle
-
-# Created by https://www.gitignore.io/api/python
-
-### Python ###
-# Byte-compiled / optimized / DLL files
-__pycache__/
-*.py[cod]
-*$py.class
-
-# C extensions
-*.so
-
-# Distribution / packaging
-.Python
-env/
-build/
-develop-eggs/
-dist/
-downloads/
-eggs/
-.eggs/
-lib/
-lib64/
-parts/
-sdist/
-var/
-*.egg-info/
-.installed.cfg
-*.egg
-
-# PyInstaller
-#  Usually these files are written by a python script from a template
-#  before PyInstaller builds the exe, so as to inject date/other infos into it.
-*.manifest
-*.spec
-
-# Installer logs
-pip-log.txt
-pip-delete-this-directory.txt
-
-# Unit test / coverage reports
-htmlcov/
-.tox/
-.coverage
-.coverage.*
-.cache
-nosetests.xml
-coverage.xml
-*,cover
-
-# Translations
-*.mo
-*.pot
-
-# Django stuff:
-*.log
-
-# Sphinx documentation
-docs/_build/
-
-# PyBuilder
-target/
-
diff --git a/.hgignore b/.hgignore
deleted file mode 100644
index b33fe74..0000000
--- a/.hgignore
+++ /dev/null
@@ -1,29 +0,0 @@
-\.pyc$
-\.so$
-\.settings$
-\.ropeproject$
-\.spyderproject$
-\.orig$
-\.chm$
-\.pyd$
-\.rar$
-\.gui$
-\.pickle$
-^build/
-^sift/build/
-^sift/sift[0-9]*/
-^dist/
-^tests/build
-^tests/dist
-Thumbs.db$
-MANIFEST$
-loadsavecanvas.gui$
-loadsavecanvas.h5$
-\.pot$
-mandelbrot.c$
-histogram2d.c$
-~$
-syntax: glob
-tests/test*.tif
-tests/test*.png
-tests/contrast.png
diff --git a/.hgtags b/.hgtags
deleted file mode 100644
index c41e91a..0000000
--- a/.hgtags
+++ /dev/null
@@ -1,47 +0,0 @@
-0176216dde843c186176a0ac1ef6746ab7b3c84a v2.1.0
-25440fd18dea984826905026ee2d68d2f6612f32 v2.0.7
-36b23e1064cc75aa09211d632666c21267ca7848 v2.1.2
-3eef9c5e3a2b753f424ca2136d5b7837fcfdf81b v2.0.8.1
-46674189bfa1ebc6ed2ab7431f654492ec9d9afc v2.1.4beta1
-490247cf521719b4da0dba339f9f71b19560e282 v2.0.5
-5b42b4f5a7f54b0df0f70c33dfbbf6599f7635ca v2.1.6
-7040236144a245eb4dddc45a850ca87b9ad4d23b v2.0.7.1
-87ab44f6196a77a69479035fb1094f9c9c474798 v2.1.7
-90aad4a57b4d39b526012f37128f2cdc8b95f311 v2.0.8
-95b2cf8a21d3d375573f8dbbeb2afc078bff235f v2.0.7.3
-9804ec29e2abee7f29fd9ce2866eb97e3a7fe1f0 v2.1.3
-9dc057d12f8ed4dcbe25e70c213ab7326bd4968b v2.0.3
-9f37b1994f17299437ebd90790c698be34b336db v2.0.4
-a9eed7e4729df5120cf640d8353137bb7cbf485b v2.1.1
-ac73a3156892755f43bdea95399146a56db42d47 v2.1.5
-be50b54dbc32566c645059b427dd1e5215a9c121 v2.0.2
-cdb1f5a6eecef87579f583d31bd7ff440df72aab v2.0.6
-e7d96f7e20cc4355bdfca16b62737c68b997b154 v2.0.7.2
-f38faf0b2bf971e7e71cd438d8f1f8f35a627cd2 v2.1.4beta2
-f767fc6065ef35b9188339224a6942865e8419a1 v2.1.4
-e28d4c768e9b904f7f1196c962e37621294a7332 v2.2.0
-e28d4c768e9b904f7f1196c962e37621294a7332 v2.2.0
-48269eed23df234265f86c367c92682d0ae16458 v2.2.0
-812749c1d5e3e62e2730c06e3dfd30660040945c v2.2.1
-876549c2468c37550de6e23b9546074a8e22e61d v2.3.0dev1
-29cc23df1239e0cc1f03398b01b76286091a5eae v2.3.0dev2
-0c2ed636ad2c2ce9294e27ca5b8b33146852620c v2.3.0
-0c2ed636ad2c2ce9294e27ca5b8b33146852620c v2.3.0
-b4896e9130c696bf0cbc9ee9b177faa97fdc77b5 v2.3.0
-d3075289b2aea74e64418ef447361fd7e2ee83e2 v2.3.1
-d3075289b2aea74e64418ef447361fd7e2ee83e2 v2.3.1
-25d91fed7e008741d593ef72dd109f95017873c5 v2.3.1
-fa1b50250e3444a0689a51216c5a120eede5b09a v2.3.2
-fa1b50250e3444a0689a51216c5a120eede5b09a v2.3.2
-0fa3c1dd599385e4ccca1fd78598f97f7550b952 v2.3.2
-0fa3c1dd599385e4ccca1fd78598f97f7550b952 v2.3.2
-68fc5faf87dbf2dcdc2514c339dfbb95428cbfa7 v2.3.2
-68fc5faf87dbf2dcdc2514c339dfbb95428cbfa7 v2.3.2
-e3cd1e3f760f64cadd02889b851da4299a775100 v2.3.2
-d6e275f4a2b2062f43f72327c8664039fcbe7e0e v2.4.0beta1
-d6e275f4a2b2062f43f72327c8664039fcbe7e0e v2.4.0beta1
-61ebd06304c79c11140fd124e8099154e35376d1 v2.4.0beta1
-258563f2280b4d902793e655c4259f51e7d1893c v2.4.0beta2
-258563f2280b4d902793e655c4259f51e7d1893c v2.4.0beta2
-56b8d5934ff1c3b74e65676247ffcc9ac57cc7c2 v2.4.0beta2
-3fb189dc738474ce49956d5624035e57b783b491 v2.4.0b2
diff --git a/.project b/.project
deleted file mode 100644
index b390c07..0000000
--- a/.project
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>guiqwt</name>
-	<comment></comment>
-	<projects>
-		<project>guidata</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.python.pydev.PyDevBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.python.pydev.pythonNature</nature>
-	</natures>
-</projectDescription>
diff --git a/.qt_for_python/uic/qtdesigner.py b/.qt_for_python/uic/qtdesigner.py
deleted file mode 100644
index b379868..0000000
--- a/.qt_for_python/uic/qtdesigner.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file 'c:\Dev\Libre\guiqwt\build\bdist.win-amd64\wheel\guiqwt\tests\qtdesigner.ui'
-#
-# Created by: PyQt5 UI code generator 5.15.4
-#
-# WARNING: Any manual changes made to this file will be lost when pyuic5 is
-# run again.  Do not edit this file unless you know what you are doing.
-
-
-from PyQt5 import QtCore, QtGui, QtWidgets
-
-
-class Ui_Dialog(object):
-    def setupUi(self, Dialog):
-        Dialog.setObjectName("Dialog")
-        Dialog.resize(500, 800)
-        self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
-        self.verticalLayout.setObjectName("verticalLayout")
diff --git a/.vscode/launch.json b/.vscode/launch.json
deleted file mode 100644
index 0f69fb0..0000000
--- a/.vscode/launch.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    // Utilisez IntelliSense pour en savoir plus sur les attributs possibles.
-    // Pointez pour afficher la description des attributs existants.
-    // Pour plus d'informations, visitez : https://go.microsoft.com/fwlink/?linkid=830387
-    "version": "0.2.0",
-    "configurations": [
-        {
-            "name": "Python : Test launcher",
-            "type": "python",
-            "request": "launch",
-            "program": "${workspaceFolder}/guiqwt/tests/__init__.py",
-            "cwd": "${workspaceFolder}/guiqwt/tests",
-            "console": "integratedTerminal"
-        },
-        {
-            "name": "Python : Current file",
-            "type": "python",
-            "request": "launch",
-            "program": "${file}",
-            "console": "integratedTerminal"
-        }
-    ]
-}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a0e9020..08f4d9e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,22 +1,43 @@
 # guiqwt Releases #
 
+## Version 4.1.1 ##
 
-### Version 4.0.2 ###
+Bug fixes:
+
+* Fixed DICOM images support.
+
+## Version 4.1.0 ##
 
 Changes:
 
-* Fixed Python 3.10/PyQt5 compatibility issues
+* (guidata) Dark mode may now be overriden by QT_COLOR_MODE environment variable
+
+* Cross sections: added label to cross section curves, depending on the marker
+  position (e.g. "Cross section @ x=23.3"). This is a requested feature for
+  CodraFT (<https://pypi.org/project/CodraFT/>).
+
+Bug fixes:
+
+* Fixed ValueError with Levels histogram (occuring when removing an image item
+  from plot if histogram has not yet been created)
 
+* Fixed cross section "peritem mode" disabled bug with multiple image items
+  (this bug is at least 10 years old... time passes by)
 
-### Version 4.0.1 ###
+## Version 4.0.2 ##
+
+Changes:
+
+* Fixed Python 3.10/PyQt5 compatibility issues
+
+## Version 4.0.1 ##
 
 Changes:
 
 * Added support for PySide6
 * Fixed remaining Python 3 compatibility issues
 
-
-### Version 4.0.0 ###
+## Version 4.0.0 ##
 
 Changes:
 
@@ -24,8 +45,7 @@ Changes:
 * Added support for dark theme mode on Windows (including windows title bar background),
   MacOS and GNU/Linux.
 
-
-### Version 3.1.0 ###
+## Version 3.1.0 ##
 
 Changes:
 
@@ -38,7 +58,7 @@ Bug fixes:
 
 * CrossSectionTool: enable tool only if there are actually image items on canvas
 
-### Version 3.0.7 ###
+## Version 3.0.7 ##
 
 Changes:
 
@@ -50,7 +70,7 @@ Bug fixes:
 * Fixed io.imwrite TIFF support
 * Fixed image.get_items_in_rectangle function: item_type parameter was ignored
 
-### Version 3.0.6 ###
+## Version 3.0.6 ##
 
 Changes:
 
@@ -62,28 +82,26 @@ Bug fixes:
 
 * Fixed error when adding item at specific Z-value after deleting items around that Z
 
-### Version 3.0.5 ###
+## Version 3.0.5 ##
 
 Changes:
 
 * Added PySide2 support: guiqwt is now compatible with Python 2.7, Python 3.4+, PyQt4,
   PyQt5 and PySide2!
 
-### Version 3.0.4 ###
+## Version 3.0.4 ##
 
 Bug fixes:
 
 * Fixed Python 3.8 / NumPy 1.18 related issues (type errors).
 
-
-### Version 3.0.3 ###
+## Version 3.0.3 ##
 
 Bug fixes:
 
 * Fixed Spyder v3.0 compatibility issues.
 
-
-### Version 3.0.2 ###
+## Version 3.0.2 ##
 
 Bug fixes:
 
@@ -98,7 +116,7 @@ Other changes:
 * Documentation is now built into the "build/doctmp" directory, hence allowing to reuse the previous built doc from a package build to another
 * `plot.CurveWidgetMixin.create_plot` has now the same signature as its `ImageWidgetMixin` counterpart
 
-### Version 3.0.1 ###
+## Version 3.0.1 ##
 
 Bug fixes:
 
@@ -108,8 +126,7 @@ Other changes:
 
 * Added CHM documentation to wheel package
 
-
-### Version 3.0.0 ###
+## Version 3.0.0 ##
 
 Possible API compatibility issues:
 
@@ -144,8 +161,7 @@ Bug fixes:
 * Images with integers: avoid overflows when computing LUT
 * Fixed Issue #50: 16-bit images were saved (io.imwrite) using the wrong PIL mode
 
-
-### Version 2.3.2 ###
+## Version 2.3.2 ##
 
 Possible API compatibility issues:
 
@@ -162,19 +178,17 @@ Other changes:
   * Added support for writing DICOM files
   * Improved support for DICOM metadata
   * Added support for multiple images resizing
-* Updated py2exe example (switched to cxFreeze to show how it's done) following https://groups.google.com/group/guidata_guiqwt/browse_thread/thread/f8db01cf7149e964
+* Updated py2exe example (switched to cxFreeze to show how it's done) following <https://groups.google.com/group/guidata_guiqwt/browse_thread/thread/f8db01cf7149e964>
 * Updated the build in place batch script: building on Windows with Ms Visual C++
 
-
-### Version 2.3.1 ###
+## Version 2.3.1 ##
 
 Bug fixes:
 
 * Fixed build failures occuring on non-Windows platforms (Issue 54)
 * Fixed requirements in README and setup.py: guiqwt v2.3 requires guidata v1.6
 
-
-### Version 2.3.0 ###
+## Version 2.3.0 ##
 
 New features:
 
@@ -192,8 +206,7 @@ Bug fixes:
 * `guiqwt.annotations`: fixed bug when showing an AnnotatedShape object on an empty plot (unit was None)
 * Fixed `PolygonShape` items pickle support (save_items, restore_items)
 
-
-### Version 2.2.1 ###
+## Version 2.2.1 ##
 
 New features:
 
@@ -234,8 +247,7 @@ Bug fixes:
 * (Issue 33) tools.LoadItemsTool: parent constructor was not called
 * (Issue 36) plot.PlotManager: fixed typo when setting the plot manager to `plot_id`
 
-
-### Version 2.2.0 ###
+## Version 2.2.0 ##
 
 New features:
 
@@ -286,8 +298,7 @@ Bug fixes:
   * now fixing ROI orientation to avoid the negative size issue
   * now handling out of memory errors for big images
 
-
-### Version 2.1.6 ###
+## Version 2.1.6 ##
 
 Other changes:
 
@@ -314,16 +325,14 @@ Bug fixes:
 * Sift: upgraded deployment script for compatibility with guidata v1.4+
 * geometry.colvector: fixed major regression in coordinates calculations (significative impact on TrImageItem related features)
 
-
-### Version 2.1.5 ###
+## Version 2.1.5 ##
 
 Other changes:
 
 * guiqwt.io: added function 'eliminate_outliers' to cut image levels histogram (previously available only for display)
 * baseplot: added method 'copy_to_clipboard' + tools: added CopyToClipboardTool (copy canevas window to clipboard)
 
-
-### Version 2.1.4 ###
+## Version 2.1.4 ##
 
 Since this version, `guiqwt` is compatible with PyQt4 API #1 *and* API #2.
 Please read carefully the coding guidelines which have been recently added to
@@ -374,10 +383,10 @@ Possible API compatibility issues:
     * `get_diameter` was renamed to `get_tr_diameter`
     * `get_length` was renamed to `get_tr_length`
 * Removed the following deprecated classes in `guiqwt.plot`:
-    * CurvePlotWidget (renamed to CurveWidget)
-    * CurvePlotDialog (renamed to CurveDialog)
-    * ImagePlotWidget (renamed to ImageWidget)
-    * ImagePlotDialog (renamed to ImageDialog)
+  * CurvePlotWidget (renamed to CurveWidget)
+  * CurvePlotDialog (renamed to CurveDialog)
+  * ImagePlotWidget (renamed to ImageWidget)
+  * ImagePlotDialog (renamed to ImageDialog)
 
 Other changes:
 
@@ -397,8 +406,7 @@ Other changes:
 * plot.ImagePlot, plot.ImageWidget: added keyword arguments 'xunit', 'yunit' and 'zunit' to set axes units (same syntax as labels)
 * pyplot.imshow: added keyword argument 'mask' to support masked arrays display
 
-
-### Version 2.1.3 ###
+## Version 2.1.3 ##
 
 Bug fixes:
 
@@ -427,8 +435,7 @@ Other changes:
 * Cross sections/update_plot: added option 'refresh' (default: True) --> we do not want to refresh the cross section panel systematically after registering a new shape
 * Annotations/annotationparam: added 'readonly' and 'private' options (bugfix: these parameters are now pickled correctly for shapes)
 
-
-### Version 2.1.2 ###
+## Version 2.1.2 ##
 
 Bug fixes:
 
@@ -439,8 +446,7 @@ Other changes:
 
 * guiqwt.fit: code cleaning / reimplementing FitParam.create_widgets is now supported
 
-
-### Version 2.1.1 ###
+## Version 2.1.1 ##
 
 Bug fixes:
 
@@ -475,8 +481,7 @@ Other changes:
 * Added basic function computation on hist2d
 * Allowed Histogram2DItems to have VOI, palettes and transparent backgrounds
 
-
-### Version 2.1.0 ###
+## Version 2.1.0 ##
 
 Bug fixes:
 
diff --git a/Licence_CeCILL_V2-en.txt b/Licence_CeCILL_V2-en.txt
index f85af60..fcc8df2 100644
--- a/Licence_CeCILL_V2-en.txt
+++ b/Licence_CeCILL_V2-en.txt
@@ -1,506 +1,506 @@
-
-CeCILL FREE SOFTWARE LICENSE AGREEMENT
-
-
-    Notice
-
-This Agreement is a Free Software license agreement that is the result
-of discussions between its authors in order to ensure compliance with
-the two main principles guiding its drafting:
-
-    * firstly, compliance with the principles governing the distribution
-      of Free Software: access to source code, broad rights granted to
-      users,
-    * secondly, the election of a governing law, French law, with which
-      it is conformant, both as regards the law of torts and
-      intellectual property law, and the protection that it offers to
-      both authors and holders of the economic rights over software.
-
-The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre])
-license are:
-
-Commissariat � l'Energie Atomique - CEA, a public scientific, technical
-and industrial research establishment, having its principal place of
-business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France.
-
-Centre National de la Recherche Scientifique - CNRS, a public scientific
-and technological establishment, having its principal place of business
-at 3 rue Michel-Ange, 75794 Paris cedex 16, France.
-
-Institut National de Recherche en Informatique et en Automatique -
-INRIA, a public scientific and technological establishment, having its
-principal place of business at Domaine de Voluceau, Rocquencourt, BP
-105, 78153 Le Chesnay cedex, France.
-
-
-    Preamble
-
-The purpose of this Free Software license agreement is to grant users
-the right to modify and redistribute the software governed by this
-license within the framework of an open source distribution model.
-
-The exercising of these rights is conditional upon certain obligations
-for users so as to preserve this status for all subsequent redistributions.
-
-In consideration of access to the source code and the rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty and the software's author, the holder of the
-economic rights, and the successive licensors only have limited liability.
-
-In this respect, the risks associated with loading, using, modifying
-and/or developing or reproducing the software by the user are brought to
-the user's attention, given its Free Software status, which may make it
-complicated to use, with the result that its use is reserved for
-developers and experienced professionals having in-depth computer
-knowledge. Users are therefore encouraged to load and test the
-suitability of the software as regards their requirements in conditions
-enabling the security of their systems and/or data to be ensured and,
-more generally, to use and operate it in the same conditions of
-security. This Agreement may be freely reproduced and published,
-provided it is not altered, and that no provisions are either added or
-removed herefrom.
-
-This Agreement may apply to any or all software for which the holder of
-the economic rights decides to submit the use thereof to its provisions.
-
-
-    Article 1 - DEFINITIONS
-
-For the purpose of this Agreement, when the following expressions
-commence with a capital letter, they shall have the following meaning:
-
-Agreement: means this license agreement, and its possible subsequent
-versions and annexes.
-
-Software: means the software in its Object Code and/or Source Code form
-and, where applicable, its documentation, "as is" when the Licensee
-accepts the Agreement.
-
-Initial Software: means the Software in its Source Code and possibly its
-Object Code form and, where applicable, its documentation, "as is" when
-it is first distributed under the terms and conditions of the Agreement.
-
-Modified Software: means the Software modified by at least one
-Contribution.
-
-Source Code: means all the Software's instructions and program lines to
-which access is required so as to modify the Software.
-
-Object Code: means the binary files originating from the compilation of
-the Source Code.
-
-Holder: means the holder(s) of the economic rights over the Initial
-Software.
-
-Licensee: means the Software user(s) having accepted the Agreement.
-
-Contributor: means a Licensee having made at least one Contribution.
-
-Licensor: means the Holder, or any other individual or legal entity, who
-distributes the Software under the Agreement.
-
-Contribution: means any or all modifications, corrections, translations,
-adaptations and/or new functions integrated into the Software by any or
-all Contributors, as well as any or all Internal Modules.
-
-Module: means a set of sources files including their documentation that
-enables supplementary functions or services in addition to those offered
-by the Software.
-
-External Module: means any or all Modules, not derived from the
-Software, so that this Module and the Software run in separate address
-spaces, with one calling the other when they are run.
-
-Internal Module: means any or all Module, connected to the Software so
-that they both execute in the same address space.
-
-GNU GPL: means the GNU General Public License version 2 or any
-subsequent version, as published by the Free Software Foundation Inc.
-
-Parties: mean both the Licensee and the Licensor.
-
-These expressions may be used both in singular and plural form.
-
-
-    Article 2 - PURPOSE
-
-The purpose of the Agreement is the grant by the Licensor to the
-Licensee of a non-exclusive, transferable and worldwide license for the
-Software as set forth in Article 5 hereinafter for the whole term of the
-protection granted by the rights over said Software. 
-
-
-    Article 3 - ACCEPTANCE
-
-3.1 The Licensee shall be deemed as having accepted the terms and
-conditions of this Agreement upon the occurrence of the first of the
-following events:
-
-    * (i) loading the Software by any or all means, notably, by
-      downloading from a remote server, or by loading from a physical
-      medium;
-    * (ii) the first time the Licensee exercises any of the rights
-      granted hereunder.
-
-3.2 One copy of the Agreement, containing a notice relating to the
-characteristics of the Software, to the limited warranty, and to the
-fact that its use is restricted to experienced users has been provided
-to the Licensee prior to its acceptance as set forth in Article 3.1
-hereinabove, and the Licensee hereby acknowledges that it has read and
-understood it.
-
-
-    Article 4 - EFFECTIVE DATE AND TERM
-
-
-      4.1 EFFECTIVE DATE
-
-The Agreement shall become effective on the date when it is accepted by
-the Licensee as set forth in Article 3.1.
-
-
-      4.2 TERM
-
-The Agreement shall remain in force for the entire legal term of
-protection of the economic rights over the Software.
-
-
-    Article 5 - SCOPE OF RIGHTS GRANTED
-
-The Licensor hereby grants to the Licensee, who accepts, the following
-rights over the Software for any or all use, and for the term of the
-Agreement, on the basis of the terms and conditions set forth hereinafter.
-
-Besides, if the Licensor owns or comes to own one or more patents
-protecting all or part of the functions of the Software or of its
-components, the Licensor undertakes not to enforce the rights granted by
-these patents against successive Licensees using, exploiting or
-modifying the Software. If these patents are transferred, the Licensor
-undertakes to have the transferees subscribe to the obligations set
-forth in this paragraph.
-
-
-      5.1 RIGHT OF USE
-
-The Licensee is authorized to use the Software, without any limitation
-as to its fields of application, with it being hereinafter specified
-that this comprises:
-
-   1. permanent or temporary reproduction of all or part of the Software
-      by any or all means and in any or all form.
-
-   2. loading, displaying, running, or storing the Software on any or
-      all medium.
-
-   3. entitlement to observe, study or test its operation so as to
-      determine the ideas and principles behind any or all constituent
-      elements of said Software. This shall apply when the Licensee
-      carries out any or all loading, displaying, running, transmission
-      or storage operation as regards the Software, that it is entitled
-      to carry out hereunder.
-
-
-      5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS
-
-The right to make Contributions includes the right to translate, adapt,
-arrange, or make any or all modifications to the Software, and the right
-to reproduce the resulting software.
-
-The Licensee is authorized to make any or all Contributions to the
-Software provided that it includes an explicit notice that it is the
-author of said Contribution and indicates the date of the creation thereof.
-
-
-      5.3 RIGHT OF DISTRIBUTION
-
-In particular, the right of distribution includes the right to publish,
-transmit and communicate the Software to the general public on any or
-all medium, and by any or all means, and the right to market, either in
-consideration of a fee, or free of charge, one or more copies of the
-Software by any means.
-
-The Licensee is further authorized to distribute copies of the modified
-or unmodified Software to third parties according to the terms and
-conditions set forth hereinafter.
-
-
-        5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION
-
-The Licensee is authorized to distribute true copies of the Software in
-Source Code or Object Code form, provided that said distribution
-complies with all the provisions of the Agreement and is accompanied by:
-
-   1. a copy of the Agreement,
-
-   2. a notice relating to the limitation of both the Licensor's
-      warranty and liability as set forth in Articles 8 and 9,
-
-and that, in the event that only the Object Code of the Software is
-redistributed, the Licensee allows future Licensees unhindered access to
-the full Source Code of the Software by indicating how to access it, it
-being understood that the additional cost of acquiring the Source Code
-shall not exceed the cost of transferring the data.
-
-
-        5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE
-
-When the Licensee makes a Contribution to the Software, the terms and
-conditions for the distribution of the resulting Modified Software
-become subject to all the provisions of this Agreement.
-
-The Licensee is authorized to distribute the Modified Software, in
-source code or object code form, provided that said distribution
-complies with all the provisions of the Agreement and is accompanied by:
-
-   1. a copy of the Agreement,
-
-   2. a notice relating to the limitation of both the Licensor's
-      warranty and liability as set forth in Articles 8 and 9,
-
-and that, in the event that only the object code of the Modified
-Software is redistributed, the Licensee allows future Licensees
-unhindered access to the full source code of the Modified Software by
-indicating how to access it, it being understood that the additional
-cost of acquiring the source code shall not exceed the cost of
-transferring the data.
-
-
-        5.3.3 DISTRIBUTION OF EXTERNAL MODULES
-
-When the Licensee has developed an External Module, the terms and
-conditions of this Agreement do not apply to said External Module, that
-may be distributed under a separate license agreement.
-
-
-        5.3.4 COMPATIBILITY WITH THE GNU GPL
-
-The Licensee can include a code that is subject to the provisions of one
-of the versions of the GNU GPL in the Modified or unmodified Software,
-and distribute that entire code under the terms of the same version of
-the GNU GPL.
-
-The Licensee can include the Modified or unmodified Software in a code
-that is subject to the provisions of one of the versions of the GNU GPL,
-and distribute that entire code under the terms of the same version of
-the GNU GPL.
-
-
-    Article 6 - INTELLECTUAL PROPERTY
-
-
-      6.1 OVER THE INITIAL SOFTWARE
-
-The Holder owns the economic rights over the Initial Software. Any or
-all use of the Initial Software is subject to compliance with the terms
-and conditions under which the Holder has elected to distribute its work
-and no one shall be entitled to modify the terms and conditions for the
-distribution of said Initial Software.
-
-The Holder undertakes that the Initial Software will remain ruled at
-least by this Agreement, for the duration set forth in Article 4.2.
-
-
-      6.2 OVER THE CONTRIBUTIONS
-
-The Licensee who develops a Contribution is the owner of the
-intellectual property rights over this Contribution as defined by
-applicable law.
-
-
-      6.3 OVER THE EXTERNAL MODULES
-
-The Licensee who develops an External Module is the owner of the
-intellectual property rights over this External Module as defined by
-applicable law and is free to choose the type of agreement that shall
-govern its distribution.
-
-
-      6.4 JOINT PROVISIONS
-
-The Licensee expressly undertakes:
-
-   1. not to remove, or modify, in any manner, the intellectual property
-      notices attached to the Software;
-
-   2. to reproduce said notices, in an identical manner, in the copies
-      of the Software modified or not.
-
-The Licensee undertakes not to directly or indirectly infringe the
-intellectual property rights of the Holder and/or Contributors on the
-Software and to take, where applicable, vis-�-vis its staff, any and all
-measures required to ensure respect of said intellectual property rights
-of the Holder and/or Contributors.
-
-
-    Article 7 - RELATED SERVICES
-
-7.1 Under no circumstances shall the Agreement oblige the Licensor to
-provide technical assistance or maintenance services for the Software.
-
-However, the Licensor is entitled to offer this type of services. The
-terms and conditions of such technical assistance, and/or such
-maintenance, shall be set forth in a separate instrument. Only the
-Licensor offering said maintenance and/or technical assistance services
-shall incur liability therefor.
-
-7.2 Similarly, any Licensor is entitled to offer to its licensees, under
-its sole responsibility, a warranty, that shall only be binding upon
-itself, for the redistribution of the Software and/or the Modified
-Software, under terms and conditions that it is free to decide. Said
-warranty, and the financial terms and conditions of its application,
-shall be subject of a separate instrument executed between the Licensor
-and the Licensee.
-
-
-    Article 8 - LIABILITY
-
-8.1 Subject to the provisions of Article 8.2, the Licensee shall be
-entitled to claim compensation for any direct loss it may have suffered
-from the Software as a result of a fault on the part of the relevant
-Licensor, subject to providing evidence thereof.
-
-8.2 The Licensor's liability is limited to the commitments made under
-this Agreement and shall not be incurred as a result of in particular:
-(i) loss due the Licensee's total or partial failure to fulfill its
-obligations, (ii) direct or consequential loss that is suffered by the
-Licensee due to the use or performance of the Software, and (iii) more
-generally, any consequential loss. In particular the Parties expressly
-agree that any or all pecuniary or business loss (i.e. loss of data,
-loss of profits, operating loss, loss of customers or orders,
-opportunity cost, any disturbance to business activities) or any or all
-legal proceedings instituted against the Licensee by a third party,
-shall constitute consequential loss and shall not provide entitlement to
-any or all compensation from the Licensor.
-
-
-    Article 9 - WARRANTY
-
-9.1 The Licensee acknowledges that the scientific and technical
-state-of-the-art when the Software was distributed did not enable all
-possible uses to be tested and verified, nor for the presence of
-possible defects to be detected. In this respect, the Licensee's
-attention has been drawn to the risks associated with loading, using,
-modifying and/or developing and reproducing the Software which are
-reserved for experienced users.
-
-The Licensee shall be responsible for verifying, by any or all means,
-the suitability of the product for its requirements, its good working
-order, and for ensuring that it shall not cause damage to either persons
-or properties.
-
-9.2 The Licensor hereby represents, in good faith, that it is entitled
-to grant all the rights over the Software (including in particular the
-rights set forth in Article 5).
-
-9.3 The Licensee acknowledges that the Software is supplied "as is" by
-the Licensor without any other express or tacit warranty, other than
-that provided for in Article 9.2 and, in particular, without any warranty 
-as to its commercial value, its secured, safe, innovative or relevant
-nature.
-
-Specifically, the Licensor does not warrant that the Software is free
-from any error, that it will operate without interruption, that it will
-be compatible with the Licensee's own equipment and software
-configuration, nor that it will meet the Licensee's requirements.
-
-9.4 The Licensor does not either expressly or tacitly warrant that the
-Software does not infringe any third party intellectual property right
-relating to a patent, software or any other property right. Therefore,
-the Licensor disclaims any and all liability towards the Licensee
-arising out of any or all proceedings for infringement that may be
-instituted in respect of the use, modification and redistribution of the
-Software. Nevertheless, should such proceedings be instituted against
-the Licensee, the Licensor shall provide it with technical and legal
-assistance for its defense. Such technical and legal assistance shall be
-decided on a case-by-case basis between the relevant Licensor and the
-Licensee pursuant to a memorandum of understanding. The Licensor
-disclaims any and all liability as regards the Licensee's use of the
-name of the Software. No warranty is given as regards the existence of
-prior rights over the name of the Software or as regards the existence
-of a trademark.
-
-
-    Article 10 - TERMINATION
-
-10.1 In the event of a breach by the Licensee of its obligations
-hereunder, the Licensor may automatically terminate this Agreement
-thirty (30) days after notice has been sent to the Licensee and has
-remained ineffective.
-
-10.2 A Licensee whose Agreement is terminated shall no longer be
-authorized to use, modify or distribute the Software. However, any
-licenses that it may have granted prior to termination of the Agreement
-shall remain valid subject to their having been granted in compliance
-with the terms and conditions hereof.
-
-
-    Article 11 - MISCELLANEOUS
-
-
-      11.1 EXCUSABLE EVENTS
-
-Neither Party shall be liable for any or all delay, or failure to
-perform the Agreement, that may be attributable to an event of force
-majeure, an act of God or an outside cause, such as defective
-functioning or interruptions of the electricity or telecommunications
-networks, network paralysis following a virus attack, intervention by
-government authorities, natural disasters, water damage, earthquakes,
-fire, explosions, strikes and labor unrest, war, etc.
-
-11.2 Any failure by either Party, on one or more occasions, to invoke
-one or more of the provisions hereof, shall under no circumstances be
-interpreted as being a waiver by the interested Party of its right to
-invoke said provision(s) subsequently.
-
-11.3 The Agreement cancels and replaces any or all previous agreements,
-whether written or oral, between the Parties and having the same
-purpose, and constitutes the entirety of the agreement between said
-Parties concerning said purpose. No supplement or modification to the
-terms and conditions hereof shall be effective as between the Parties
-unless it is made in writing and signed by their duly authorized
-representatives.
-
-11.4 In the event that one or more of the provisions hereof were to
-conflict with a current or future applicable act or legislative text,
-said act or legislative text shall prevail, and the Parties shall make
-the necessary amendments so as to comply with said act or legislative
-text. All other provisions shall remain effective. Similarly, invalidity
-of a provision of the Agreement, for any reason whatsoever, shall not
-cause the Agreement as a whole to be invalid.
-
-
-      11.5 LANGUAGE
-
-The Agreement is drafted in both French and English and both versions
-are deemed authentic.
-
-
-    Article 12 - NEW VERSIONS OF THE AGREEMENT
-
-12.1 Any person is authorized to duplicate and distribute copies of this
-Agreement.
-
-12.2 So as to ensure coherence, the wording of this Agreement is
-protected and may only be modified by the authors of the License, who
-reserve the right to periodically publish updates or new versions of the
-Agreement, each with a separate number. These subsequent versions may
-address new issues encountered by Free Software.
-
-12.3 Any Software distributed under a given version of the Agreement may
-only be subsequently distributed under the same version of the Agreement
-or a subsequent version, subject to the provisions of Article 5.3.4.
-
-
-    Article 13 - GOVERNING LAW AND JURISDICTION
-
-13.1 The Agreement is governed by French law. The Parties agree to
-endeavor to seek an amicable solution to any disagreements or disputes
-that may arise during the performance of the Agreement.
-
-13.2 Failing an amicable solution within two (2) months as from their
-occurrence, and unless emergency proceedings are necessary, the
-disagreements or disputes shall be referred to the Paris Courts having
-jurisdiction, by the more diligent Party.
-
-
-Version 2.0 dated 2006-09-05.
+
+CeCILL FREE SOFTWARE LICENSE AGREEMENT
+
+
+    Notice
+
+This Agreement is a Free Software license agreement that is the result
+of discussions between its authors in order to ensure compliance with
+the two main principles guiding its drafting:
+
+    * firstly, compliance with the principles governing the distribution
+      of Free Software: access to source code, broad rights granted to
+      users,
+    * secondly, the election of a governing law, French law, with which
+      it is conformant, both as regards the law of torts and
+      intellectual property law, and the protection that it offers to
+      both authors and holders of the economic rights over software.
+
+The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre])
+license are:
+
+Commissariat � l'Energie Atomique - CEA, a public scientific, technical
+and industrial research establishment, having its principal place of
+business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France.
+
+Centre National de la Recherche Scientifique - CNRS, a public scientific
+and technological establishment, having its principal place of business
+at 3 rue Michel-Ange, 75794 Paris cedex 16, France.
+
+Institut National de Recherche en Informatique et en Automatique -
+INRIA, a public scientific and technological establishment, having its
+principal place of business at Domaine de Voluceau, Rocquencourt, BP
+105, 78153 Le Chesnay cedex, France.
+
+
+    Preamble
+
+The purpose of this Free Software license agreement is to grant users
+the right to modify and redistribute the software governed by this
+license within the framework of an open source distribution model.
+
+The exercising of these rights is conditional upon certain obligations
+for users so as to preserve this status for all subsequent redistributions.
+
+In consideration of access to the source code and the rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty and the software's author, the holder of the
+economic rights, and the successive licensors only have limited liability.
+
+In this respect, the risks associated with loading, using, modifying
+and/or developing or reproducing the software by the user are brought to
+the user's attention, given its Free Software status, which may make it
+complicated to use, with the result that its use is reserved for
+developers and experienced professionals having in-depth computer
+knowledge. Users are therefore encouraged to load and test the
+suitability of the software as regards their requirements in conditions
+enabling the security of their systems and/or data to be ensured and,
+more generally, to use and operate it in the same conditions of
+security. This Agreement may be freely reproduced and published,
+provided it is not altered, and that no provisions are either added or
+removed herefrom.
+
+This Agreement may apply to any or all software for which the holder of
+the economic rights decides to submit the use thereof to its provisions.
+
+
+    Article 1 - DEFINITIONS
+
+For the purpose of this Agreement, when the following expressions
+commence with a capital letter, they shall have the following meaning:
+
+Agreement: means this license agreement, and its possible subsequent
+versions and annexes.
+
+Software: means the software in its Object Code and/or Source Code form
+and, where applicable, its documentation, "as is" when the Licensee
+accepts the Agreement.
+
+Initial Software: means the Software in its Source Code and possibly its
+Object Code form and, where applicable, its documentation, "as is" when
+it is first distributed under the terms and conditions of the Agreement.
+
+Modified Software: means the Software modified by at least one
+Contribution.
+
+Source Code: means all the Software's instructions and program lines to
+which access is required so as to modify the Software.
+
+Object Code: means the binary files originating from the compilation of
+the Source Code.
+
+Holder: means the holder(s) of the economic rights over the Initial
+Software.
+
+Licensee: means the Software user(s) having accepted the Agreement.
+
+Contributor: means a Licensee having made at least one Contribution.
+
+Licensor: means the Holder, or any other individual or legal entity, who
+distributes the Software under the Agreement.
+
+Contribution: means any or all modifications, corrections, translations,
+adaptations and/or new functions integrated into the Software by any or
+all Contributors, as well as any or all Internal Modules.
+
+Module: means a set of sources files including their documentation that
+enables supplementary functions or services in addition to those offered
+by the Software.
+
+External Module: means any or all Modules, not derived from the
+Software, so that this Module and the Software run in separate address
+spaces, with one calling the other when they are run.
+
+Internal Module: means any or all Module, connected to the Software so
+that they both execute in the same address space.
+
+GNU GPL: means the GNU General Public License version 2 or any
+subsequent version, as published by the Free Software Foundation Inc.
+
+Parties: mean both the Licensee and the Licensor.
+
+These expressions may be used both in singular and plural form.
+
+
+    Article 2 - PURPOSE
+
+The purpose of the Agreement is the grant by the Licensor to the
+Licensee of a non-exclusive, transferable and worldwide license for the
+Software as set forth in Article 5 hereinafter for the whole term of the
+protection granted by the rights over said Software. 
+
+
+    Article 3 - ACCEPTANCE
+
+3.1 The Licensee shall be deemed as having accepted the terms and
+conditions of this Agreement upon the occurrence of the first of the
+following events:
+
+    * (i) loading the Software by any or all means, notably, by
+      downloading from a remote server, or by loading from a physical
+      medium;
+    * (ii) the first time the Licensee exercises any of the rights
+      granted hereunder.
+
+3.2 One copy of the Agreement, containing a notice relating to the
+characteristics of the Software, to the limited warranty, and to the
+fact that its use is restricted to experienced users has been provided
+to the Licensee prior to its acceptance as set forth in Article 3.1
+hereinabove, and the Licensee hereby acknowledges that it has read and
+understood it.
+
+
+    Article 4 - EFFECTIVE DATE AND TERM
+
+
+      4.1 EFFECTIVE DATE
+
+The Agreement shall become effective on the date when it is accepted by
+the Licensee as set forth in Article 3.1.
+
+
+      4.2 TERM
+
+The Agreement shall remain in force for the entire legal term of
+protection of the economic rights over the Software.
+
+
+    Article 5 - SCOPE OF RIGHTS GRANTED
+
+The Licensor hereby grants to the Licensee, who accepts, the following
+rights over the Software for any or all use, and for the term of the
+Agreement, on the basis of the terms and conditions set forth hereinafter.
+
+Besides, if the Licensor owns or comes to own one or more patents
+protecting all or part of the functions of the Software or of its
+components, the Licensor undertakes not to enforce the rights granted by
+these patents against successive Licensees using, exploiting or
+modifying the Software. If these patents are transferred, the Licensor
+undertakes to have the transferees subscribe to the obligations set
+forth in this paragraph.
+
+
+      5.1 RIGHT OF USE
+
+The Licensee is authorized to use the Software, without any limitation
+as to its fields of application, with it being hereinafter specified
+that this comprises:
+
+   1. permanent or temporary reproduction of all or part of the Software
+      by any or all means and in any or all form.
+
+   2. loading, displaying, running, or storing the Software on any or
+      all medium.
+
+   3. entitlement to observe, study or test its operation so as to
+      determine the ideas and principles behind any or all constituent
+      elements of said Software. This shall apply when the Licensee
+      carries out any or all loading, displaying, running, transmission
+      or storage operation as regards the Software, that it is entitled
+      to carry out hereunder.
+
+
+      5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS
+
+The right to make Contributions includes the right to translate, adapt,
+arrange, or make any or all modifications to the Software, and the right
+to reproduce the resulting software.
+
+The Licensee is authorized to make any or all Contributions to the
+Software provided that it includes an explicit notice that it is the
+author of said Contribution and indicates the date of the creation thereof.
+
+
+      5.3 RIGHT OF DISTRIBUTION
+
+In particular, the right of distribution includes the right to publish,
+transmit and communicate the Software to the general public on any or
+all medium, and by any or all means, and the right to market, either in
+consideration of a fee, or free of charge, one or more copies of the
+Software by any means.
+
+The Licensee is further authorized to distribute copies of the modified
+or unmodified Software to third parties according to the terms and
+conditions set forth hereinafter.
+
+
+        5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION
+
+The Licensee is authorized to distribute true copies of the Software in
+Source Code or Object Code form, provided that said distribution
+complies with all the provisions of the Agreement and is accompanied by:
+
+   1. a copy of the Agreement,
+
+   2. a notice relating to the limitation of both the Licensor's
+      warranty and liability as set forth in Articles 8 and 9,
+
+and that, in the event that only the Object Code of the Software is
+redistributed, the Licensee allows future Licensees unhindered access to
+the full Source Code of the Software by indicating how to access it, it
+being understood that the additional cost of acquiring the Source Code
+shall not exceed the cost of transferring the data.
+
+
+        5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE
+
+When the Licensee makes a Contribution to the Software, the terms and
+conditions for the distribution of the resulting Modified Software
+become subject to all the provisions of this Agreement.
+
+The Licensee is authorized to distribute the Modified Software, in
+source code or object code form, provided that said distribution
+complies with all the provisions of the Agreement and is accompanied by:
+
+   1. a copy of the Agreement,
+
+   2. a notice relating to the limitation of both the Licensor's
+      warranty and liability as set forth in Articles 8 and 9,
+
+and that, in the event that only the object code of the Modified
+Software is redistributed, the Licensee allows future Licensees
+unhindered access to the full source code of the Modified Software by
+indicating how to access it, it being understood that the additional
+cost of acquiring the source code shall not exceed the cost of
+transferring the data.
+
+
+        5.3.3 DISTRIBUTION OF EXTERNAL MODULES
+
+When the Licensee has developed an External Module, the terms and
+conditions of this Agreement do not apply to said External Module, that
+may be distributed under a separate license agreement.
+
+
+        5.3.4 COMPATIBILITY WITH THE GNU GPL
+
+The Licensee can include a code that is subject to the provisions of one
+of the versions of the GNU GPL in the Modified or unmodified Software,
+and distribute that entire code under the terms of the same version of
+the GNU GPL.
+
+The Licensee can include the Modified or unmodified Software in a code
+that is subject to the provisions of one of the versions of the GNU GPL,
+and distribute that entire code under the terms of the same version of
+the GNU GPL.
+
+
+    Article 6 - INTELLECTUAL PROPERTY
+
+
+      6.1 OVER THE INITIAL SOFTWARE
+
+The Holder owns the economic rights over the Initial Software. Any or
+all use of the Initial Software is subject to compliance with the terms
+and conditions under which the Holder has elected to distribute its work
+and no one shall be entitled to modify the terms and conditions for the
+distribution of said Initial Software.
+
+The Holder undertakes that the Initial Software will remain ruled at
+least by this Agreement, for the duration set forth in Article 4.2.
+
+
+      6.2 OVER THE CONTRIBUTIONS
+
+The Licensee who develops a Contribution is the owner of the
+intellectual property rights over this Contribution as defined by
+applicable law.
+
+
+      6.3 OVER THE EXTERNAL MODULES
+
+The Licensee who develops an External Module is the owner of the
+intellectual property rights over this External Module as defined by
+applicable law and is free to choose the type of agreement that shall
+govern its distribution.
+
+
+      6.4 JOINT PROVISIONS
+
+The Licensee expressly undertakes:
+
+   1. not to remove, or modify, in any manner, the intellectual property
+      notices attached to the Software;
+
+   2. to reproduce said notices, in an identical manner, in the copies
+      of the Software modified or not.
+
+The Licensee undertakes not to directly or indirectly infringe the
+intellectual property rights of the Holder and/or Contributors on the
+Software and to take, where applicable, vis-�-vis its staff, any and all
+measures required to ensure respect of said intellectual property rights
+of the Holder and/or Contributors.
+
+
+    Article 7 - RELATED SERVICES
+
+7.1 Under no circumstances shall the Agreement oblige the Licensor to
+provide technical assistance or maintenance services for the Software.
+
+However, the Licensor is entitled to offer this type of services. The
+terms and conditions of such technical assistance, and/or such
+maintenance, shall be set forth in a separate instrument. Only the
+Licensor offering said maintenance and/or technical assistance services
+shall incur liability therefor.
+
+7.2 Similarly, any Licensor is entitled to offer to its licensees, under
+its sole responsibility, a warranty, that shall only be binding upon
+itself, for the redistribution of the Software and/or the Modified
+Software, under terms and conditions that it is free to decide. Said
+warranty, and the financial terms and conditions of its application,
+shall be subject of a separate instrument executed between the Licensor
+and the Licensee.
+
+
+    Article 8 - LIABILITY
+
+8.1 Subject to the provisions of Article 8.2, the Licensee shall be
+entitled to claim compensation for any direct loss it may have suffered
+from the Software as a result of a fault on the part of the relevant
+Licensor, subject to providing evidence thereof.
+
+8.2 The Licensor's liability is limited to the commitments made under
+this Agreement and shall not be incurred as a result of in particular:
+(i) loss due the Licensee's total or partial failure to fulfill its
+obligations, (ii) direct or consequential loss that is suffered by the
+Licensee due to the use or performance of the Software, and (iii) more
+generally, any consequential loss. In particular the Parties expressly
+agree that any or all pecuniary or business loss (i.e. loss of data,
+loss of profits, operating loss, loss of customers or orders,
+opportunity cost, any disturbance to business activities) or any or all
+legal proceedings instituted against the Licensee by a third party,
+shall constitute consequential loss and shall not provide entitlement to
+any or all compensation from the Licensor.
+
+
+    Article 9 - WARRANTY
+
+9.1 The Licensee acknowledges that the scientific and technical
+state-of-the-art when the Software was distributed did not enable all
+possible uses to be tested and verified, nor for the presence of
+possible defects to be detected. In this respect, the Licensee's
+attention has been drawn to the risks associated with loading, using,
+modifying and/or developing and reproducing the Software which are
+reserved for experienced users.
+
+The Licensee shall be responsible for verifying, by any or all means,
+the suitability of the product for its requirements, its good working
+order, and for ensuring that it shall not cause damage to either persons
+or properties.
+
+9.2 The Licensor hereby represents, in good faith, that it is entitled
+to grant all the rights over the Software (including in particular the
+rights set forth in Article 5).
+
+9.3 The Licensee acknowledges that the Software is supplied "as is" by
+the Licensor without any other express or tacit warranty, other than
+that provided for in Article 9.2 and, in particular, without any warranty 
+as to its commercial value, its secured, safe, innovative or relevant
+nature.
+
+Specifically, the Licensor does not warrant that the Software is free
+from any error, that it will operate without interruption, that it will
+be compatible with the Licensee's own equipment and software
+configuration, nor that it will meet the Licensee's requirements.
+
+9.4 The Licensor does not either expressly or tacitly warrant that the
+Software does not infringe any third party intellectual property right
+relating to a patent, software or any other property right. Therefore,
+the Licensor disclaims any and all liability towards the Licensee
+arising out of any or all proceedings for infringement that may be
+instituted in respect of the use, modification and redistribution of the
+Software. Nevertheless, should such proceedings be instituted against
+the Licensee, the Licensor shall provide it with technical and legal
+assistance for its defense. Such technical and legal assistance shall be
+decided on a case-by-case basis between the relevant Licensor and the
+Licensee pursuant to a memorandum of understanding. The Licensor
+disclaims any and all liability as regards the Licensee's use of the
+name of the Software. No warranty is given as regards the existence of
+prior rights over the name of the Software or as regards the existence
+of a trademark.
+
+
+    Article 10 - TERMINATION
+
+10.1 In the event of a breach by the Licensee of its obligations
+hereunder, the Licensor may automatically terminate this Agreement
+thirty (30) days after notice has been sent to the Licensee and has
+remained ineffective.
+
+10.2 A Licensee whose Agreement is terminated shall no longer be
+authorized to use, modify or distribute the Software. However, any
+licenses that it may have granted prior to termination of the Agreement
+shall remain valid subject to their having been granted in compliance
+with the terms and conditions hereof.
+
+
+    Article 11 - MISCELLANEOUS
+
+
+      11.1 EXCUSABLE EVENTS
+
+Neither Party shall be liable for any or all delay, or failure to
+perform the Agreement, that may be attributable to an event of force
+majeure, an act of God or an outside cause, such as defective
+functioning or interruptions of the electricity or telecommunications
+networks, network paralysis following a virus attack, intervention by
+government authorities, natural disasters, water damage, earthquakes,
+fire, explosions, strikes and labor unrest, war, etc.
+
+11.2 Any failure by either Party, on one or more occasions, to invoke
+one or more of the provisions hereof, shall under no circumstances be
+interpreted as being a waiver by the interested Party of its right to
+invoke said provision(s) subsequently.
+
+11.3 The Agreement cancels and replaces any or all previous agreements,
+whether written or oral, between the Parties and having the same
+purpose, and constitutes the entirety of the agreement between said
+Parties concerning said purpose. No supplement or modification to the
+terms and conditions hereof shall be effective as between the Parties
+unless it is made in writing and signed by their duly authorized
+representatives.
+
+11.4 In the event that one or more of the provisions hereof were to
+conflict with a current or future applicable act or legislative text,
+said act or legislative text shall prevail, and the Parties shall make
+the necessary amendments so as to comply with said act or legislative
+text. All other provisions shall remain effective. Similarly, invalidity
+of a provision of the Agreement, for any reason whatsoever, shall not
+cause the Agreement as a whole to be invalid.
+
+
+      11.5 LANGUAGE
+
+The Agreement is drafted in both French and English and both versions
+are deemed authentic.
+
+
+    Article 12 - NEW VERSIONS OF THE AGREEMENT
+
+12.1 Any person is authorized to duplicate and distribute copies of this
+Agreement.
+
+12.2 So as to ensure coherence, the wording of this Agreement is
+protected and may only be modified by the authors of the License, who
+reserve the right to periodically publish updates or new versions of the
+Agreement, each with a separate number. These subsequent versions may
+address new issues encountered by Free Software.
+
+12.3 Any Software distributed under a given version of the Agreement may
+only be subsequently distributed under the same version of the Agreement
+or a subsequent version, subject to the provisions of Article 5.3.4.
+
+
+    Article 13 - GOVERNING LAW AND JURISDICTION
+
+13.1 The Agreement is governed by French law. The Parties agree to
+endeavor to seek an amicable solution to any disagreements or disputes
+that may arise during the performance of the Agreement.
+
+13.2 Failing an amicable solution within two (2) months as from their
+occurrence, and unless emergency proceedings are necessary, the
+disagreements or disputes shall be referred to the Paris Courts having
+jurisdiction, by the more diligent Party.
+
+
+Version 2.0 dated 2006-09-05.
diff --git a/PKG-INFO b/PKG-INFO
index baea617..f031e43 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,71 +1,73 @@
-Metadata-Version: 2.1
-Name: guiqwt
-Version: 4.0.2
-Summary: guiqwt is a set of tools for curve and image plotting (extension to PythonQwt)
-Home-page: https://github.com/PierreRaybaut/guiqwt
-Author: Pierre Raybaut
-Author-email: pierre.raybaut@gmail.com
-License: CeCILL V2
-Description: guiqwt: Python tools for curve and image plotting
-        =================================================
-        
-        .. image:: https://raw.githubusercontent.com/PierreRaybaut/guiqwt/master/doc/images/panorama.png
-        
-        See `documentation`_ for more details on the library and `changelog`_ for
-        recent history of changes.
-        
-        Copyright © 2009-2020 CEA, Pierre Raybaut, licensed under the terms of the
-        `CECILL License`_.
-        
-        .. _documentation: https://guiqwt.readthedocs.io/en/latest/
-        .. _changelog: https://github.com/PierreRaybaut/guiqwt/blob/master/CHANGELOG.md
-        .. _CECILL License: https://github.com/PierreRaybaut/guiqwt/blob/master/Licence_CeCILL_V2-en.txt
-        
-        
-        Overview
-        --------
-        
-        Based on `PythonQwt`_ (a pure Python/PyQt reimplementation of the curve
-        plotting Qwt C++ library, included in guiqwt base source code) and on the
-        scientific modules NumPy and SciPy, ``guiqwt`` is a Python library providing
-        efficient 2D data-plotting features (curve/image visualization and related
-        tools) for interactive computing and signal/image processing application
-        development. It is based on Qt graphical user interfaces library, and
-        currently supports both ``PyQt5`` and ``PySide2``.
-        
-        Extension to `PythonQwt`_:
-        
-        * set of tools for curve and image plotting
-        * GUI-based application development helpers
-        
-        .. _PythonQwt: https://pypi.python.org/pypi/PythonQwt
-        
-        
-        Building, installation, ...
-        ---------------------------
-        
-        The following packages are **required**: `PyQt5`_,
-        `PythonQwt`_, `guidata`_, `NumPy`_, `SciPy`_ and `Pillow`_.
-        
-        .. _PyQt5: https://pypi.python.org/pypi/PyQt5
-        .. _PythonQwt: https://pypi.python.org/pypi/PythonQwt
-        .. _guidata: https://pypi.python.org/pypi/guidata
-        .. _NumPy: https://pypi.python.org/pypi/NumPy
-        .. _SciPy: https://pypi.python.org/pypi/SciPy
-        .. _Pillow: https://pypi.python.org/pypi/Pillow
-        
-        See the `README`_ and `documentation`_ for more details.
-        
-        .. _README: https://github.com/PierreRaybaut/guiqwt/blob/master/README.md
-        
-Platform: UNKNOWN
-Classifier: Topic :: Scientific/Engineering
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Operating System :: MacOS
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Operating System :: OS Independent
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: Unix
-Classifier: Programming Language :: Python :: 3
-Provides-Extra: Doc
-Provides-Extra: DICOM
+Metadata-Version: 2.1
+Name: guiqwt
+Version: 4.1.1
+Summary: guiqwt is a set of tools for curve and image plotting (extension to PythonQwt)
+Home-page: https://github.com/PierreRaybaut/guiqwt
+Author: Pierre Raybaut
+Author-email: pierre.raybaut@gmail.com
+License: CeCILL V2
+Platform: UNKNOWN
+Classifier: Topic :: Scientific/Engineering
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Operating System :: MacOS
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: OS Independent
+Classifier: Operating System :: POSIX
+Classifier: Operating System :: Unix
+Classifier: Programming Language :: Python :: 3
+Provides-Extra: DICOM
+Provides-Extra: Doc
+
+guiqwt: Python tools for curve and image plotting
+=================================================
+
+.. image:: https://raw.githubusercontent.com/PierreRaybaut/guiqwt/master/doc/images/panorama.png
+
+See `documentation`_ for more details on the library and `changelog`_ for
+recent history of changes.
+
+Copyright © 2009-2020 CEA, Pierre Raybaut, licensed under the terms of the
+`CECILL License`_.
+
+.. _documentation: https://guiqwt.readthedocs.io/en/latest/
+.. _changelog: https://github.com/PierreRaybaut/guiqwt/blob/master/CHANGELOG.md
+.. _CECILL License: https://github.com/PierreRaybaut/guiqwt/blob/master/Licence_CeCILL_V2-en.txt
+
+
+Overview
+--------
+
+Based on `PythonQwt`_ (a pure Python/PyQt reimplementation of the curve
+plotting Qwt C++ library, included in guiqwt base source code) and on the
+scientific modules NumPy and SciPy, ``guiqwt`` is a Python library providing
+efficient 2D data-plotting features (curve/image visualization and related
+tools) for interactive computing and signal/image processing application
+development. It is based on Qt graphical user interfaces library, and
+currently supports both ``PyQt5`` and ``PySide2``.
+
+Extension to `PythonQwt`_:
+
+* set of tools for curve and image plotting
+* GUI-based application development helpers
+
+.. _PythonQwt: https://pypi.python.org/pypi/PythonQwt
+
+
+Building, installation, ...
+---------------------------
+
+The following packages are **required**: `PyQt5`_,
+`PythonQwt`_, `guidata`_, `NumPy`_, `SciPy`_ and `Pillow`_.
+
+.. _PyQt5: https://pypi.python.org/pypi/PyQt5
+.. _PythonQwt: https://pypi.python.org/pypi/PythonQwt
+.. _guidata: https://pypi.python.org/pypi/guidata
+.. _NumPy: https://pypi.python.org/pypi/NumPy
+.. _SciPy: https://pypi.python.org/pypi/SciPy
+.. _Pillow: https://pypi.python.org/pypi/Pillow
+
+See the `README`_ and `documentation`_ for more details.
+
+.. _README: https://github.com/PierreRaybaut/guiqwt/blob/master/README.md
+
+
diff --git a/build_dist.bat b/build_dist.bat
deleted file mode 100755
index d09ca01..0000000
--- a/build_dist.bat
+++ /dev/null
@@ -1,4 +0,0 @@
-del MANIFEST
-python setup.py build sdist
-python setup.py --no-user-cfg build -c msvc bdist_wheel --sse2
-python setup.py --no-user-cfg build -c msvc bdist_wheel --plat-name=win32 --sse2
diff --git a/build_doc.bat b/build_doc.bat
deleted file mode 100755
index 6470d36..0000000
--- a/build_doc.bat
+++ /dev/null
@@ -1,14 +0,0 @@
-sphinx-build -b htmlhelp doc doctmp
-"C:\Program Files\HTML Help Workshop\hhc.exe" doctmp\guiqwt.hhp
-"C:\Program Files (x86)\HTML Help Workshop\hhc.exe" doctmp\guiqwt.hhp
-copy doctmp\guiqwt.chm .
-7z a guiqwt.chm.zip guiqwt.chm
-del doctmp\guiqwt.chm
-del doc.zip
-del doctmp\guiqwt.hh*
-sphinx-build -b html doc doctmp
-cd doctmp
-7z a -r ..\doc.zip *.*
-cd ..
-rmdir /S /Q doctmp
-del guiqwt.chm.zip
\ No newline at end of file
diff --git a/build_inplace.bat b/build_inplace.bat
deleted file mode 100755
index 138e10f..0000000
--- a/build_inplace.bat
+++ /dev/null
@@ -1,2 +0,0 @@
-rmdir /S /Q build
-python setup.py --no-user-cfg build_ext -c msvc --inplace --sse2
\ No newline at end of file
diff --git a/deployment_example/create_exe.py b/deployment_example/create_exe.py
deleted file mode 100644
index 01fbc26..0000000
--- a/deployment_example/create_exe.py
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-Deployment example
-==================
-
-Deployment script using `guidata.disthelpers` (py2exe or cx_Freeze)
-"""
-
-from guidata import disthelpers as dh
-
-def create_exe():
-    dist = dh.Distribution()
-    dist.setup('example', '1.0', 'guiqwt app example', 'simpledialog.pyw')
-    dist.add_modules('guidata', 'guiqwt')
-    dist.build_cx_freeze()  # use `build_py2exe` to use py2exe instead
-
-if __name__ == '__main__':
-    create_exe()
-    
\ No newline at end of file
diff --git a/deployment_example/simpledialog.pyw b/deployment_example/simpledialog.pyw
deleted file mode 100644
index 2387449..0000000
--- a/deployment_example/simpledialog.pyw
+++ /dev/null
@@ -1,27 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2009-2010 CEA
-# Pierre Raybaut
-# Licensed under the terms of the CECILL License
-# (see guiqwt/__init__.py for details)
-
-"""Very simple dialog box"""
-
-from guiqwt.plot import ImageDialog
-from guiqwt.builder import make
-
-class VerySimpleDialog(ImageDialog):
-    def set_data(self, data):
-        plot = self.get_plot()
-        item = make.trimage(data)
-        plot.add_item(item, z=0)
-        plot.set_active_item(item)
-        plot.replot()
-
-if __name__ == "__main__":
-    import numpy as np
-    from guidata import qapplication
-    _app = qapplication()
-    dlg = VerySimpleDialog()
-    dlg.set_data(np.random.rand(100, 100))
-    dlg.exec_() # No need to call app.exec_: a dialog box has its own event loop
diff --git a/doc/.hgignore b/doc/.hgignore
deleted file mode 100644
index e69de29..0000000
diff --git a/doc/migrating_from_v2_to_v3.rst b/doc/migrating_from_v2_to_v3.rst
index 2fcff68..fba44db 100644
--- a/doc/migrating_from_v2_to_v3.rst
+++ b/doc/migrating_from_v2_to_v3.rst
@@ -1,38 +1,38 @@
-Migrating from version 2 to version 4
-=====================================
-
-The main change between version 2 and version 4 is the basic plotting library
-on which `guiqwt` is based on:
-
-  * `guiqwt` version 2: depends on `PyQwt`, the Python bindings to `Qwt` C++
-    library -- only supports PyQt4.
-
-  * `guiqwt` version 4: depends on `PythonQwt`, a new library written from
-    scratch to continue supporting `Qwt` API through a pure Python
-    reimplementation of its main classes (`QwtPlot`, `QwtPlotItem`,
-    `QwtPlotCanvas`, ...) -- supports PyQt5 and PySide2.
-
-Another major change is the switch from old-style to new-style signals and
-slots. The :py:mod:`guiqwt.signals` module is now empty because it used to
-collect strings for old-style signals: however, it still contains
-documentation on available signals.
-
-Examples
-~~~~~~~~
-
-Switching from `PyQwt` to `PythonQwt` in your code::
-
-    from PyQt4.Qwt5 import QwtPlot  # PyQwt (supports only PyQt4)
-
-    from qwt import QwtPlot  # PythonQwt (supports PyQt5 and PySide2)
-
-Switching from `guiqwt 2` to `guiqwt 4`::
-
-    plot = get_plot_instance()  # plot is a QwtPlot instance
-
-    ## guiqwt 2:
-    from guiqwt.signals import SIG_ITEM_MOVED
-    plot.connect(plot, SIG_ITEM_MOVED, item_was_moved)
-
-    ## guiqwt 4:
-    plot.SIG_ITEM_MOVED.connect(item_was_moved)
+Migrating from version 2 to version 4
+=====================================
+
+The main change between version 2 and version 4 is the basic plotting library
+on which `guiqwt` is based on:
+
+  * `guiqwt` version 2: depends on `PyQwt`, the Python bindings to `Qwt` C++
+    library -- only supports PyQt4.
+
+  * `guiqwt` version 4: depends on `PythonQwt`, a new library written from
+    scratch to continue supporting `Qwt` API through a pure Python
+    reimplementation of its main classes (`QwtPlot`, `QwtPlotItem`,
+    `QwtPlotCanvas`, ...) -- supports PyQt5 and PySide2.
+
+Another major change is the switch from old-style to new-style signals and
+slots. The :py:mod:`guiqwt.signals` module is now empty because it used to
+collect strings for old-style signals: however, it still contains
+documentation on available signals.
+
+Examples
+~~~~~~~~
+
+Switching from `PyQwt` to `PythonQwt` in your code::
+
+    from PyQt4.Qwt5 import QwtPlot  # PyQwt (supports only PyQt4)
+
+    from qwt import QwtPlot  # PythonQwt (supports PyQt5 and PySide2)
+
+Switching from `guiqwt 2` to `guiqwt 4`::
+
+    plot = get_plot_instance()  # plot is a QwtPlot instance
+
+    ## guiqwt 2:
+    from guiqwt.signals import SIG_ITEM_MOVED
+    plot.connect(plot, SIG_ITEM_MOVED, item_was_moved)
+
+    ## guiqwt 4:
+    plot.SIG_ITEM_MOVED.connect(item_was_moved)
diff --git a/doc/reference/annotations.rst b/doc/reference/annotations.rst
index 135236a..10c4364 100644
--- a/doc/reference/annotations.rst
+++ b/doc/reference/annotations.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.annotations
+.. automodule:: guiqwt.annotations
diff --git a/doc/reference/baseplot.rst b/doc/reference/baseplot.rst
index 749db57..2c4a773 100644
--- a/doc/reference/baseplot.rst
+++ b/doc/reference/baseplot.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.baseplot
+.. automodule:: guiqwt.baseplot
diff --git a/doc/reference/builder.rst b/doc/reference/builder.rst
index cf6c970..c8a6e40 100644
--- a/doc/reference/builder.rst
+++ b/doc/reference/builder.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.builder
+.. automodule:: guiqwt.builder
diff --git a/doc/reference/cross_section.rst b/doc/reference/cross_section.rst
index 7dcc02b..b24bc87 100644
--- a/doc/reference/cross_section.rst
+++ b/doc/reference/cross_section.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.cross_section
+.. automodule:: guiqwt.cross_section
diff --git a/doc/reference/curve.rst b/doc/reference/curve.rst
index 1713f4a..e30778b 100644
--- a/doc/reference/curve.rst
+++ b/doc/reference/curve.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.curve
+.. automodule:: guiqwt.curve
diff --git a/doc/reference/histogram.rst b/doc/reference/histogram.rst
index 56da7c4..84a40a8 100644
--- a/doc/reference/histogram.rst
+++ b/doc/reference/histogram.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.histogram
+.. automodule:: guiqwt.histogram
diff --git a/doc/reference/image.rst b/doc/reference/image.rst
index 2a4c231..9a0c8e0 100644
--- a/doc/reference/image.rst
+++ b/doc/reference/image.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.image
+.. automodule:: guiqwt.image
diff --git a/doc/reference/index.rst b/doc/reference/index.rst
index 22293b2..8170df5 100644
--- a/doc/reference/index.rst
+++ b/doc/reference/index.rst
@@ -1,27 +1,27 @@
-Reference
-=========
-
-guiqwt API:
-
-.. toctree::
-    :maxdepth: 2
-    
-    pyplot
-    widgets_fit
-    plot
-    builder
-    panels
-    signals
-    baseplot
-    curve
-    image
-    histogram
-    cross_section
-    annotations
-    shapes
-    label
-    tools
-    styles
-    io
-    widgets_resizedialog
-    widgets_rotatecrop
+Reference
+=========
+
+guiqwt API:
+
+.. toctree::
+    :maxdepth: 2
+    
+    pyplot
+    widgets_fit
+    plot
+    builder
+    panels
+    signals
+    baseplot
+    curve
+    image
+    histogram
+    cross_section
+    annotations
+    shapes
+    label
+    tools
+    styles
+    io
+    widgets_resizedialog
+    widgets_rotatecrop
diff --git a/doc/reference/io.rst b/doc/reference/io.rst
index 3563fc7..1d35a64 100644
--- a/doc/reference/io.rst
+++ b/doc/reference/io.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.io
+.. automodule:: guiqwt.io
diff --git a/doc/reference/label.rst b/doc/reference/label.rst
index 5da1e31..4ea232c 100644
--- a/doc/reference/label.rst
+++ b/doc/reference/label.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.label
+.. automodule:: guiqwt.label
diff --git a/doc/reference/panels.rst b/doc/reference/panels.rst
index c6f71c1..d604d2c 100644
--- a/doc/reference/panels.rst
+++ b/doc/reference/panels.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.panels
+.. automodule:: guiqwt.panels
diff --git a/doc/reference/plot.rst b/doc/reference/plot.rst
index af72a66..aa73174 100644
--- a/doc/reference/plot.rst
+++ b/doc/reference/plot.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.plot
+.. automodule:: guiqwt.plot
diff --git a/doc/reference/pyplot.rst b/doc/reference/pyplot.rst
index 5a4833f..61a443a 100644
--- a/doc/reference/pyplot.rst
+++ b/doc/reference/pyplot.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.pyplot
+.. automodule:: guiqwt.pyplot
diff --git a/doc/reference/shapes.rst b/doc/reference/shapes.rst
index 45a3ccd..80196c9 100644
--- a/doc/reference/shapes.rst
+++ b/doc/reference/shapes.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.shapes
+.. automodule:: guiqwt.shapes
diff --git a/doc/reference/signals.rst b/doc/reference/signals.rst
index a797ea8..46e7805 100644
--- a/doc/reference/signals.rst
+++ b/doc/reference/signals.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.signals
+.. automodule:: guiqwt.signals
diff --git a/doc/reference/styles.rst b/doc/reference/styles.rst
index b00b355..b6668ad 100644
--- a/doc/reference/styles.rst
+++ b/doc/reference/styles.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.styles
+.. automodule:: guiqwt.styles
diff --git a/doc/reference/tools.rst b/doc/reference/tools.rst
index 9f31bbe..a1d901f 100644
--- a/doc/reference/tools.rst
+++ b/doc/reference/tools.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.tools
+.. automodule:: guiqwt.tools
diff --git a/doc/reference/widgets_fit.rst b/doc/reference/widgets_fit.rst
index 0daaa24..7444af7 100644
--- a/doc/reference/widgets_fit.rst
+++ b/doc/reference/widgets_fit.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.widgets.fit
+.. automodule:: guiqwt.widgets.fit
diff --git a/doc/reference/widgets_resizedialog.rst b/doc/reference/widgets_resizedialog.rst
index 7035fd2..fb709fa 100644
--- a/doc/reference/widgets_resizedialog.rst
+++ b/doc/reference/widgets_resizedialog.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.widgets.resizedialog
+.. automodule:: guiqwt.widgets.resizedialog
diff --git a/doc/reference/widgets_rotatecrop.rst b/doc/reference/widgets_rotatecrop.rst
index a7659fe..0ebc812 100644
--- a/doc/reference/widgets_rotatecrop.rst
+++ b/doc/reference/widgets_rotatecrop.rst
@@ -1 +1 @@
-.. automodule:: guiqwt.widgets.rotatecrop
+.. automodule:: guiqwt.widgets.rotatecrop
diff --git a/doc/requirements.txt b/doc/requirements.txt
deleted file mode 100644
index e9e1b88..0000000
--- a/doc/requirements.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-Cython==0.29.21
-numpy==1.19.1
-PyQt5==5.15.0
-PyQt5-sip==12.8.0
-guidata==1.7.8
\ No newline at end of file
diff --git a/gettext_compile.py b/gettext_compile.py
deleted file mode 100644
index a240673..0000000
--- a/gettext_compile.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2009-2010 CEA
-# Pierre Raybaut
-# Licensed under the terms of the CECILL License
-# (see guiqwt/__init__.py for details)
-
-"""Compile new translations for this module
-must be run from toplevel directory !
-"""
-from guidata.gettext_helpers import do_compile
-
-if __name__ == "__main__":
-    do_compile("guiqwt")
diff --git a/gettext_scan.py b/gettext_scan.py
deleted file mode 100644
index d3cd66b..0000000
--- a/gettext_scan.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2009-2010 CEA
-# Pierre Raybaut
-# Licensed under the terms of the CECILL License
-# (see guiqwt/__init__.py for details)
-
-"""Scan this module to include new translatable strings
-must be run from toplevel directory !
-"""
-from guidata.gettext_helpers import do_rescan
-
-if __name__ == "__main__":
-    do_rescan("guiqwt")
diff --git a/guiqwt.egg-info/PKG-INFO b/guiqwt.egg-info/PKG-INFO
index baea617..f031e43 100644
--- a/guiqwt.egg-info/PKG-INFO
+++ b/guiqwt.egg-info/PKG-INFO
@@ -1,71 +1,73 @@
-Metadata-Version: 2.1
-Name: guiqwt
-Version: 4.0.2
-Summary: guiqwt is a set of tools for curve and image plotting (extension to PythonQwt)
-Home-page: https://github.com/PierreRaybaut/guiqwt
-Author: Pierre Raybaut
-Author-email: pierre.raybaut@gmail.com
-License: CeCILL V2
-Description: guiqwt: Python tools for curve and image plotting
-        =================================================
-        
-        .. image:: https://raw.githubusercontent.com/PierreRaybaut/guiqwt/master/doc/images/panorama.png
-        
-        See `documentation`_ for more details on the library and `changelog`_ for
-        recent history of changes.
-        
-        Copyright © 2009-2020 CEA, Pierre Raybaut, licensed under the terms of the
-        `CECILL License`_.
-        
-        .. _documentation: https://guiqwt.readthedocs.io/en/latest/
-        .. _changelog: https://github.com/PierreRaybaut/guiqwt/blob/master/CHANGELOG.md
-        .. _CECILL License: https://github.com/PierreRaybaut/guiqwt/blob/master/Licence_CeCILL_V2-en.txt
-        
-        
-        Overview
-        --------
-        
-        Based on `PythonQwt`_ (a pure Python/PyQt reimplementation of the curve
-        plotting Qwt C++ library, included in guiqwt base source code) and on the
-        scientific modules NumPy and SciPy, ``guiqwt`` is a Python library providing
-        efficient 2D data-plotting features (curve/image visualization and related
-        tools) for interactive computing and signal/image processing application
-        development. It is based on Qt graphical user interfaces library, and
-        currently supports both ``PyQt5`` and ``PySide2``.
-        
-        Extension to `PythonQwt`_:
-        
-        * set of tools for curve and image plotting
-        * GUI-based application development helpers
-        
-        .. _PythonQwt: https://pypi.python.org/pypi/PythonQwt
-        
-        
-        Building, installation, ...
-        ---------------------------
-        
-        The following packages are **required**: `PyQt5`_,
-        `PythonQwt`_, `guidata`_, `NumPy`_, `SciPy`_ and `Pillow`_.
-        
-        .. _PyQt5: https://pypi.python.org/pypi/PyQt5
-        .. _PythonQwt: https://pypi.python.org/pypi/PythonQwt
-        .. _guidata: https://pypi.python.org/pypi/guidata
-        .. _NumPy: https://pypi.python.org/pypi/NumPy
-        .. _SciPy: https://pypi.python.org/pypi/SciPy
-        .. _Pillow: https://pypi.python.org/pypi/Pillow
-        
-        See the `README`_ and `documentation`_ for more details.
-        
-        .. _README: https://github.com/PierreRaybaut/guiqwt/blob/master/README.md
-        
-Platform: UNKNOWN
-Classifier: Topic :: Scientific/Engineering
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Operating System :: MacOS
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Operating System :: OS Independent
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: Unix
-Classifier: Programming Language :: Python :: 3
-Provides-Extra: Doc
-Provides-Extra: DICOM
+Metadata-Version: 2.1
+Name: guiqwt
+Version: 4.1.1
+Summary: guiqwt is a set of tools for curve and image plotting (extension to PythonQwt)
+Home-page: https://github.com/PierreRaybaut/guiqwt
+Author: Pierre Raybaut
+Author-email: pierre.raybaut@gmail.com
+License: CeCILL V2
+Platform: UNKNOWN
+Classifier: Topic :: Scientific/Engineering
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Operating System :: MacOS
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: OS Independent
+Classifier: Operating System :: POSIX
+Classifier: Operating System :: Unix
+Classifier: Programming Language :: Python :: 3
+Provides-Extra: DICOM
+Provides-Extra: Doc
+
+guiqwt: Python tools for curve and image plotting
+=================================================
+
+.. image:: https://raw.githubusercontent.com/PierreRaybaut/guiqwt/master/doc/images/panorama.png
+
+See `documentation`_ for more details on the library and `changelog`_ for
+recent history of changes.
+
+Copyright © 2009-2020 CEA, Pierre Raybaut, licensed under the terms of the
+`CECILL License`_.
+
+.. _documentation: https://guiqwt.readthedocs.io/en/latest/
+.. _changelog: https://github.com/PierreRaybaut/guiqwt/blob/master/CHANGELOG.md
+.. _CECILL License: https://github.com/PierreRaybaut/guiqwt/blob/master/Licence_CeCILL_V2-en.txt
+
+
+Overview
+--------
+
+Based on `PythonQwt`_ (a pure Python/PyQt reimplementation of the curve
+plotting Qwt C++ library, included in guiqwt base source code) and on the
+scientific modules NumPy and SciPy, ``guiqwt`` is a Python library providing
+efficient 2D data-plotting features (curve/image visualization and related
+tools) for interactive computing and signal/image processing application
+development. It is based on Qt graphical user interfaces library, and
+currently supports both ``PyQt5`` and ``PySide2``.
+
+Extension to `PythonQwt`_:
+
+* set of tools for curve and image plotting
+* GUI-based application development helpers
+
+.. _PythonQwt: https://pypi.python.org/pypi/PythonQwt
+
+
+Building, installation, ...
+---------------------------
+
+The following packages are **required**: `PyQt5`_,
+`PythonQwt`_, `guidata`_, `NumPy`_, `SciPy`_ and `Pillow`_.
+
+.. _PyQt5: https://pypi.python.org/pypi/PyQt5
+.. _PythonQwt: https://pypi.python.org/pypi/PythonQwt
+.. _guidata: https://pypi.python.org/pypi/guidata
+.. _NumPy: https://pypi.python.org/pypi/NumPy
+.. _SciPy: https://pypi.python.org/pypi/SciPy
+.. _Pillow: https://pypi.python.org/pypi/Pillow
+
+See the `README`_ and `documentation`_ for more details.
+
+.. _README: https://github.com/PierreRaybaut/guiqwt/blob/master/README.md
+
+
diff --git a/guiqwt.egg-info/SOURCES.txt b/guiqwt.egg-info/SOURCES.txt
index e3c3f59..6882506 100644
--- a/guiqwt.egg-info/SOURCES.txt
+++ b/guiqwt.egg-info/SOURCES.txt
@@ -1,26 +1,8 @@
-.gitignore
-.hgignore
-.hgtags
-.project
 CHANGELOG.md
 Licence_CeCILL_V2-en.txt
 MANIFEST.in
 README.md
-build_dist.bat
-build_doc.bat
-build_inplace.bat
-gettext_compile.py
-gettext_scan.py
-private.hgtags
-run_test_launcher.bat
 setup.py
-upload.bat
-.qt_for_python/uic/qtdesigner.py
-.vscode/launch.json
-C:/Python/guiqwt/build/doctmp/guiqwt.chm
-deployment_example/create_exe.py
-deployment_example/simpledialog.pyw
-doc/.hgignore
 doc/conf.py
 doc/development.rst
 doc/disthelpers.rst
@@ -29,7 +11,6 @@ doc/index.rst
 doc/installation.rst
 doc/migrating_from_v2_to_v3.rst
 doc/overview.rst
-doc/requirements.txt
 doc/sift.rst
 doc/_static/favicon.ico
 doc/images/curve_widgets.png
@@ -205,7 +186,6 @@ guiqwt/images/scales/lin_lin.png
 guiqwt/images/scales/lin_log.png
 guiqwt/images/scales/log_lin.png
 guiqwt/images/scales/log_log.png
-guiqwt/images/scales/source.pdn
 guiqwt/images/shapes/circle.png
 guiqwt/images/shapes/ellipse_shape.png
 guiqwt/images/shapes/freeform.png
@@ -221,7 +201,6 @@ guiqwt/images/styles/dashdot.png
 guiqwt/images/styles/dashdotdot.png
 guiqwt/images/styles/dot.png
 guiqwt/images/styles/solid.png
-guiqwt/locale/guiqwt.pot
 guiqwt/locale/fr/LC_MESSAGES/guiqwt.mo
 guiqwt/locale/fr/LC_MESSAGES/guiqwt.po
 guiqwt/tests/__init__.py
@@ -229,7 +208,6 @@ guiqwt/tests/benchmarks.py
 guiqwt/tests/brain.png
 guiqwt/tests/brain_cylinder.png
 guiqwt/tests/computations.py
-guiqwt/tests/contrast.png
 guiqwt/tests/contrast.py
 guiqwt/tests/cross_section.py
 guiqwt/tests/cross_section_oblique.py
@@ -277,9 +255,6 @@ guiqwt/tests/simple_dialog.py
 guiqwt/tests/simple_window.py
 guiqwt/tests/styles.py
 guiqwt/tests/syncplot.py
-guiqwt/tests/test.png
-guiqwt/tests/test1.u8.png
-guiqwt/tests/test2.u8.png
 guiqwt/tests/test_line.py
 guiqwt/tests/transform.py
 guiqwt/widgets/__init__.py
@@ -288,9 +263,6 @@ guiqwt/widgets/fit.py
 guiqwt/widgets/fliprotate.py
 guiqwt/widgets/resizedialog.py
 guiqwt/widgets/rotatecrop.py
-img_src/guiqwt.pdn
-img_src/panorama.pdn
-img_src/panorama2.pdn
 qtdesigner/imageplotplugin.py
 qtdesigner/plotplugin.py
 sift/create_exe.py
diff --git a/guiqwt.egg-info/requires.txt b/guiqwt.egg-info/requires.txt
index ce4d5cf..2d09333 100644
--- a/guiqwt.egg-info/requires.txt
+++ b/guiqwt.egg-info/requires.txt
@@ -1,9 +1,9 @@
 NumPy>=1.3
-SciPy>=0.7
-guidata>=2.0.0
-PythonQwt>=0.5.0
 Pillow
+PythonQwt>=0.5.0
 QtPy>=1.3
+SciPy>=0.7
+guidata>=2.0.0
 
 [DICOM]
 pydicom>=0.9.3
diff --git a/guiqwt/__init__.py b/guiqwt/__init__.py
index e43e900..d60882a 100644
--- a/guiqwt/__init__.py
+++ b/guiqwt/__init__.py
@@ -23,7 +23,7 @@ External resources:
 """
 
 
-__version__ = "4.0.2"
+__version__ = "4.1.1"
 __description__ = (
     "guiqwt is a set of tools for curve and image plotting " "(extension to PythonQwt)"
 )
@@ -39,7 +39,7 @@ def about(html=True, copyright_only=False):
     tf1 = (name, __version__, __description__)
     tf2 = (
         platform.python_version(),
-        "64 bits" if sys.maxsize > 2 ** 32 else "32 bits",
+        "64 bits" if sys.maxsize > 2**32 else "32 bits",
         QC.__version__,
         qwt.__version__,
         guidata.__version__,
diff --git a/guiqwt/builder.py b/guiqwt/builder.py
index a1d95b9..4b3db3c 100644
--- a/guiqwt/builder.py
+++ b/guiqwt/builder.py
@@ -757,6 +757,18 @@ class PlotItemBuilder(object):
         data, filename, title = self._get_image_data(
             data, filename, title, to_grayscale=True
         )
+        if isinstance(filename, str) and filename.lower().endswith(".dcm"):
+            from pydicom import dicomio
+
+            template = dicomio.read_file(filename, stop_before_pixels=True, force=True)
+            ipp = getattr(template, "ImagePositionPatient", ["0", "0", "0"])
+            pxs = getattr(template, "PixelSpacing", ["1", "1"])
+            ipx, ipy = float(ipp[0]), float(ipp[1])
+            pixel_size = dy, dx = float(pxs[0]), float(pxs[1])
+            xc = (0.5 * data.shape[1] - 1) * dx + ipx
+            yc = (0.5 * data.shape[0] - 1) * dy + ipy
+            center_on = xc, yc
+
         if data.ndim == 3:
             return self.rgbimage(
                 data=data,
diff --git a/guiqwt/config.py b/guiqwt/config.py
index 0055a79..efe0b0a 100644
--- a/guiqwt/config.py
+++ b/guiqwt/config.py
@@ -15,10 +15,9 @@ The `config` module handles `guiqwt` configuration (options, images and icons).
 import os.path as osp
 
 from guidata.configtools import add_image_module_path, get_translation
+from guidata import qthelpers
 
-from guidata.external import darkdetect
-
-IS_DARK = darkdetect.isDark()
+IS_DARK = qthelpers.is_dark_mode()
 MAIN_FG_COLOR = "white" if IS_DARK else "black"
 MAIN_BG_COLOR = "#222222" if IS_DARK else "white"
 
diff --git a/guiqwt/cross_section.py b/guiqwt/cross_section.py
index 112c878..d741929 100644
--- a/guiqwt/cross_section.py
+++ b/guiqwt/cross_section.py
@@ -296,21 +296,27 @@ class XCrossSectionItem(CrossSectionItem):
         """Get x-cross section data from source image"""
         source = self.get_source_image()
         rect = get_rectangular_area(obj)
+        fmt = source.imageparam.yformat
         if rect is None:
             # Object is a marker or an annotated point
             _x0, y0 = get_object_coordinates(obj)
+            self.curveparam.label = _("Cross section") + " @ y=" + (fmt % y0)
             if self.perimage_mode:
-                return source.get_xsection(y0, apply_lut=self.apply_lut)
+                data = source.get_xsection(y0, apply_lut=self.apply_lut)
             else:
-                return get_plot_x_section(obj, apply_lut=self.apply_lut)
+                data = get_plot_x_section(obj, apply_lut=self.apply_lut)
         else:
             if self.perimage_mode:
                 x0, y0, x1, y1 = rect
-                return source.get_average_xsection(
+                data = source.get_average_xsection(
                     x0, y0, x1, y1, apply_lut=self.apply_lut
                 )
             else:
-                return get_plot_average_x_section(obj, apply_lut=self.apply_lut)
+                data = get_plot_average_x_section(obj, apply_lut=self.apply_lut)
+                x0, y0, x1, y1 = obj.get_rect()
+            text = _("Average cross section")
+            self.curveparam.label = f'{text} @ y=[{fmt % y0} ; {fmt % y1}]'
+        return data
 
 
 class YCrossSectionItem(CrossSectionItem):
@@ -322,21 +328,27 @@ class YCrossSectionItem(CrossSectionItem):
         """Get y-cross section data from source image"""
         source = self.get_source_image()
         rect = get_rectangular_area(obj)
+        fmt = source.imageparam.xformat
         if rect is None:
             # Object is a marker or an annotated point
             x0, _y0 = get_object_coordinates(obj)
+            self.curveparam.label = _("Cross section") + " @ x=" + (fmt % x0)
             if self.perimage_mode:
-                return source.get_ysection(x0, apply_lut=self.apply_lut)
+                data = source.get_ysection(x0, apply_lut=self.apply_lut)
             else:
-                return get_plot_y_section(obj, apply_lut=self.apply_lut)
+                data = get_plot_y_section(obj, apply_lut=self.apply_lut)
         else:
             if self.perimage_mode:
                 x0, y0, x1, y1 = rect
-                return source.get_average_ysection(
+                data = source.get_average_ysection(
                     x0, y0, x1, y1, apply_lut=self.apply_lut
                 )
             else:
-                return get_plot_average_y_section(obj, apply_lut=self.apply_lut)
+                data = get_plot_average_y_section(obj, apply_lut=self.apply_lut)
+                x0, y0, x1, y1 = obj.get_rect()
+            text = _("Average cross section")
+            self.curveparam.label = f"{text} @ x=[{fmt % x0} ; {fmt % x1}]"
+        return data
 
 
 LUT_AXIS_TITLE = _("LUT scale") + (" (0-%d)" % LUT_MAX)
@@ -525,8 +537,8 @@ class CrossSectionPlot(CurvePlot):
         if self.label.isVisible():
             self.label.hide()
         items = list(self.known_items.items())
-        for index, (item, curve) in enumerate(iter(items)):
-            if (not self.perimage_mode and index > 0) or not item.isVisible():
+        for item, curve in iter(items):
+            if not item.isVisible():
                 curve.hide()
             else:
                 curve.show()
diff --git a/guiqwt/histogram.py b/guiqwt/histogram.py
index 05de524..fed0636 100644
--- a/guiqwt/histogram.py
+++ b/guiqwt/histogram.py
@@ -13,14 +13,14 @@ guiqwt.histogram
 
 The `histogram` module provides histogram related objects:
     * :py:class:`guiqwt.histogram.HistogramItem`: an histogram plot item
-    * :py:class:`guiqwt.histogram.ContrastAdjustment`: the `contrast 
+    * :py:class:`guiqwt.histogram.ContrastAdjustment`: the `contrast
       adjustment panel`
-    * :py:class:`guiqwt.histogram.LevelsHistogram`: a curve plotting widget 
-      used by the `contrast adjustment panel` to compute, manipulate and 
+    * :py:class:`guiqwt.histogram.LevelsHistogram`: a curve plotting widget
+      used by the `contrast adjustment panel` to compute, manipulate and
       display the image levels histogram
 
-``HistogramItem`` objects are plot items (derived from QwtPlotItem) that may 
-be displayed on a 2D plotting widget like :py:class:`guiqwt.curve.CurvePlot` 
+``HistogramItem`` objects are plot items (derived from QwtPlotItem) that may
+be displayed on a 2D plotting widget like :py:class:`guiqwt.curve.CurvePlot`
 or :py:class:`guiqwt.image.ImagePlot`.
 
 Example
@@ -326,9 +326,11 @@ class LevelsHistogram(CurvePlot):
     def item_removed(self, item):
         for plot, items in list(self._tracked_items.items()):
             if item in items:
-                curve = items.pop(item)
-                self.del_items([curve])
-                self.replot()
+                try:
+                    self.del_item(item)
+                except ValueError:
+                    pass  # Histogram has not yet been created
+                items.pop(item)
                 break
 
     def active_item_changed(self, plot):
diff --git a/guiqwt/images/scales/source.pdn b/guiqwt/images/scales/source.pdn
deleted file mode 100644
index 1820c55..0000000
Binary files a/guiqwt/images/scales/source.pdn and /dev/null differ
diff --git a/guiqwt/images/sift.svg b/guiqwt/images/sift.svg
index 50ceb2d..8199aef 100644
--- a/guiqwt/images/sift.svg
+++ b/guiqwt/images/sift.svg
@@ -1,376 +1,376 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   version="1.0"
-   width="150.00002"
-   height="150"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.48.2 r9819"
-   sodipodi:docname="sift.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   inkscape:export-filename="D:\Python\spyder\doc_src\_static\spyder.png"
-   inkscape:export-xdpi="77.629997"
-   inkscape:export-ydpi="77.629997">
-  <metadata
-     id="metadata2193">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-        <cc:license
-           rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" />
-      </cc:Work>
-      <cc:License
-         rdf:about="http://creativecommons.org/licenses/by-sa/3.0/">
-        <cc:permits
-           rdf:resource="http://creativecommons.org/ns#Reproduction" />
-        <cc:permits
-           rdf:resource="http://creativecommons.org/ns#Distribution" />
-        <cc:requires
-           rdf:resource="http://creativecommons.org/ns#Notice" />
-        <cc:requires
-           rdf:resource="http://creativecommons.org/ns#Attribution" />
-        <cc:permits
-           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
-        <cc:requires
-           rdf:resource="http://creativecommons.org/ns#ShareAlike" />
-      </cc:License>
-    </rdf:RDF>
-  </metadata>
-  <sodipodi:namedview
-     inkscape:window-height="744"
-     inkscape:window-width="1280"
-     inkscape:pageshadow="2"
-     inkscape:pageopacity="0.0"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base"
-     inkscape:zoom="1.8528087"
-     inkscape:cx="-207.60769"
-     inkscape:cy="69.622169"
-     inkscape:window-x="103"
-     inkscape:window-y="214"
-     inkscape:current-layer="svg2"
-     showgrid="false"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     inkscape:window-maximized="0" />
-  <defs
-     id="defs4">
-    <linearGradient
-       id="linearGradient3350">
-      <stop
-         style="stop-color:#00cb2b;stop-opacity:0.24793388;"
-         offset="0"
-         id="stop3352" />
-      <stop
-         style="stop-color:#00cb2b;stop-opacity:1;"
-         offset="1"
-         id="stop3354" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3342">
-      <stop
-         style="stop-color:#005a85;stop-opacity:1;"
-         offset="0"
-         id="stop3344" />
-      <stop
-         style="stop-color:#005a85;stop-opacity:0.75206614;"
-         offset="1"
-         id="stop3346" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3310">
-      <stop
-         id="stop3312"
-         offset="0"
-         style="stop-color:#ae0202;stop-opacity:1;" />
-      <stop
-         id="stop3314"
-         offset="1"
-         style="stop-color:#b47575;stop-opacity:1;" />
-    </linearGradient>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 71.887497 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="486.04999 : 71.887497 : 1"
-       inkscape:persp3d-origin="243.02499 : 47.924998 : 1"
-       id="perspective47" />
-    <linearGradient
-       id="linearGradient2795">
-      <stop
-         style="stop-color:#b8b8b8;stop-opacity:0.49803922"
-         offset="0"
-         id="stop2797" />
-      <stop
-         style="stop-color:#7f7f7f;stop-opacity:0"
-         offset="1"
-         id="stop2799" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2787">
-      <stop
-         style="stop-color:#7f7f7f;stop-opacity:0.5"
-         offset="0"
-         id="stop2789" />
-      <stop
-         style="stop-color:#7f7f7f;stop-opacity:0"
-         offset="1"
-         id="stop2791" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3676">
-      <stop
-         style="stop-color:#b2b2b2;stop-opacity:0.5"
-         offset="0"
-         id="stop3678" />
-      <stop
-         style="stop-color:#b3b3b3;stop-opacity:0"
-         offset="1"
-         id="stop3680" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3236">
-      <stop
-         style="stop-color:#f4f4f4;stop-opacity:1"
-         offset="0"
-         id="stop3244" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1"
-         offset="1"
-         id="stop3240" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4671">
-      <stop
-         style="stop-color:#ffd43b;stop-opacity:1"
-         offset="0"
-         id="stop4673" />
-      <stop
-         style="stop-color:#ffe873;stop-opacity:1"
-         offset="1"
-         id="stop4675" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4689">
-      <stop
-         style="stop-color:#5a9fd4;stop-opacity:1"
-         offset="0"
-         id="stop4691" />
-      <stop
-         style="stop-color:#306998;stop-opacity:1"
-         offset="1"
-         id="stop4693" />
-    </linearGradient>
-    <linearGradient
-       x1="224.23996"
-       y1="144.75717"
-       x2="-65.308502"
-       y2="144.75717"
-       id="linearGradient2987"
-       xlink:href="#linearGradient4671"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(100.2702,99.61116)" />
-    <linearGradient
-       x1="172.94208"
-       y1="77.475983"
-       x2="26.670298"
-       y2="76.313133"
-       id="linearGradient2990"
-       xlink:href="#linearGradient4689"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(100.2702,99.61116)" />
-    <linearGradient
-       x1="172.94208"
-       y1="77.475983"
-       x2="26.670298"
-       y2="76.313133"
-       id="linearGradient2587"
-       xlink:href="#linearGradient4689"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(100.2702,99.61116)" />
-    <linearGradient
-       x1="224.23996"
-       y1="144.75717"
-       x2="-65.308502"
-       y2="144.75717"
-       id="linearGradient2589"
-       xlink:href="#linearGradient4671"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(100.2702,99.61116)" />
-    <linearGradient
-       x1="172.94208"
-       y1="77.475983"
-       x2="26.670298"
-       y2="76.313133"
-       id="linearGradient2248"
-       xlink:href="#linearGradient4689"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(100.2702,99.61116)" />
-    <linearGradient
-       x1="224.23996"
-       y1="144.75717"
-       x2="-65.308502"
-       y2="144.75717"
-       id="linearGradient2250"
-       xlink:href="#linearGradient4671"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(100.2702,99.61116)" />
-    <linearGradient
-       x1="224.23996"
-       y1="144.75717"
-       x2="-65.308502"
-       y2="144.75717"
-       id="linearGradient2255"
-       xlink:href="#linearGradient4671"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)" />
-    <linearGradient
-       x1="172.94208"
-       y1="76.176224"
-       x2="26.670298"
-       y2="76.313133"
-       id="linearGradient2258"
-       xlink:href="#linearGradient4689"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)" />
-    <radialGradient
-       cx="61.518883"
-       cy="132.28575"
-       r="29.036913"
-       fx="61.518883"
-       fy="132.28575"
-       id="radialGradient2801"
-       xlink:href="#linearGradient2795"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.177966,0,108.7434)" />
-    <linearGradient
-       x1="150.96111"
-       y1="192.35176"
-       x2="112.03144"
-       y2="137.27299"
-       id="linearGradient1475"
-       xlink:href="#linearGradient4671"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)" />
-    <linearGradient
-       x1="26.648937"
-       y1="20.603781"
-       x2="135.66525"
-       y2="114.39767"
-       id="linearGradient1478"
-       xlink:href="#linearGradient4689"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)" />
-    <radialGradient
-       cx="61.518883"
-       cy="132.28575"
-       r="29.036913"
-       fx="61.518883"
-       fy="132.28575"
-       id="radialGradient1480"
-       xlink:href="#linearGradient2795"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.382716e-8,-0.296405,1.43676,4.683673e-7,-128.544,150.5202)" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2795"
-       id="radialGradient2421"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.7490565e-8,-0.239947,1.054668,3.7915457e-7,-78.109429,148.85906)"
-       cx="61.518883"
-       cy="132.28575"
-       fx="61.518883"
-       fy="132.28575"
-       r="29.036913" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4671"
-       id="linearGradient3826"
-       x1="36.970898"
-       y1="54.646763"
-       x2="87.704681"
-       y2="54.646763"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4671-8"
-       id="linearGradient3826-6"
-       x1="36.970898"
-       y1="54.646763"
-       x2="87.704681"
-       y2="54.646763"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       id="linearGradient4671-8">
-      <stop
-         style="stop-color:#ffd43b;stop-opacity:1"
-         offset="0"
-         id="stop4673-8" />
-      <stop
-         style="stop-color:#ffe873;stop-opacity:1"
-         offset="1"
-         id="stop4675-2" />
-    </linearGradient>
-    <linearGradient
-       y2="54.646763"
-       x2="87.704681"
-       y1="54.646763"
-       x1="36.970898"
-       gradientUnits="userSpaceOnUse"
-       id="linearGradient3843"
-       xlink:href="#linearGradient4689"
-       inkscape:collect="always" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3310"
-       id="linearGradient3827"
-       x1="2.844801e-006"
-       y1="74.999992"
-       x2="150"
-       y2="74.999992"
-       gradientUnits="userSpaceOnUse" />
-  </defs>
-  <path
-     sodipodi:type="arc"
-     style="fill:url(#linearGradient3843);fill-opacity:1;fill-rule:nonzero"
-     id="path3040-7"
-     sodipodi:cx="62.337788"
-     sodipodi:cy="54.646763"
-     sodipodi:rx="25.366892"
-     sodipodi:ry="48.709831"
-     d="m 87.704679,54.646763 a 25.366892,48.709831 0 1 1 -50.733783,0 25.366892,48.709831 0 1 1 50.733783,0 z"
-     transform="matrix(1.1747503,-0.05200103,-0.13636762,-0.9831363,33.068466,133.17576)" />
-  <path
-     sodipodi:type="arc"
-     style="fill:url(#linearGradient3826);fill-opacity:1;fill-rule:nonzero"
-     id="path3040"
-     sodipodi:cx="62.337788"
-     sodipodi:cy="54.646763"
-     sodipodi:rx="25.366892"
-     sodipodi:ry="48.709831"
-     d="m 87.704679,54.646763 a 25.366892,48.709831 0 1 1 -50.733783,0 25.366892,48.709831 0 1 1 50.733783,0 z"
-     transform="matrix(-1.1747503,-0.05200103,0.13636762,-0.9831363,109.86108,126.35739)" />
-  <path
-     inkscape:connector-curvature="0"
-     id="path3045"
-     style="font-size:219.19166565000000000px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:url(#linearGradient3827);fill-opacity:1.0;stroke:none;font-family:Verdana;-inkscape-font-specification:Verdana Bold"
-     d="M 48.120545,149.99999 C 33.862575,149.99982 22.278011,142.67462 13.366819,128.02434 4.4556055,113.37378 4.5630392e-6,93.479856 2.8448009e-6,68.342493 5.9936438e-6,53.809828 1.0531487,41.142913 3.159434,30.34171 5.2657183,19.540422 7.9390796,9.4265293 11.179526,9.5361943e-7 l 34.705121,1.83876257e-6 0,4.948939107618 C 39.727772,14.296911 34.996732,24.764299 31.691515,36.351138 28.386239,47.937879 26.733616,59.072981 26.73364,69.756477 c -2.5e-5,2.749326 0.194401,6.362833 0.583278,10.840534 0.388828,4.477514 1.036915,8.130298 1.944265,10.958365 1.16653,3.456294 2.624727,6.303896 4.374594,8.542814 1.749805,2.23869 4.342156,3.35809 7.777058,3.35821 3.17559,-1.2e-4 5.91376,-1.63013 8.214518,-4.890026 2.300663,-3.260123 4.066701,-8.03231 5.29812,-14.316573 1.296124,-6.598676 2.511288,-13.570389 3.645498,-20.915159 1.134096,-7.344924 2.576092,-14.238081 4.325989,-20.679496 3.953273,-14.768303 9.316198,-25.392801 16.08879,-31.873524 6.772437,-6.4807704 15.181376,-9.7211436 25.22683,-9.7211292 13.48012,-1.31e-5 24.48141,7.3251956 33.00389,21.9756482 8.52222,14.650381 12.78339,33.483825 12.78353,56.500389 -1.4e-4,11.547422 -0.92367,22.95746 -2.77057,34.23016 -1.8472,11.27245 -4.16411,21.03285 -6.95075,29.28122 l -33.34413,0 0,-4.8311 c 4.66612,-7.07006 8.57085,-15.73069 11.7142,-25.98193 3.1431,-10.25149 4.71471,-20.71888 4.71483,-31.4022 -1.2e-4,-3.77071 -0.21075,-7.521688 -0.63188,-11.252946 -0.42138,-3.731421 -1.21528,-7.32529 -2.38173,-10.781617 -0.97225,-3.063698 -2.44664,-5.695273 -4.42319,-7.894736 -1.97679,-2.199591 -4.2289,-3.299353 -6.75632,-3.299293 -3.82383,-6.2e-5 -6.75642,1.767415 -8.7978,5.302434 -2.041578,3.534888 -3.904827,10.21202 -5.589768,20.03142 -1.101836,6.441384 -2.171183,12.627551 -3.20803,18.558521 -1.037032,5.930762 -2.462826,12.313317 -4.277385,19.147687 -3.629376,13.43269 -8.571044,23.3502 -14.825019,29.75255 -6.254114,6.40204 -14.37141,9.60313 -24.351913,9.60329 z" />
-</svg>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.0"
+   width="150.00002"
+   height="150"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.2 r9819"
+   sodipodi:docname="sift.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   inkscape:export-filename="D:\Python\spyder\doc_src\_static\spyder.png"
+   inkscape:export-xdpi="77.629997"
+   inkscape:export-ydpi="77.629997">
+  <metadata
+     id="metadata2193">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" />
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/by-sa/3.0/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Notice" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Attribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#ShareAlike" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     inkscape:window-height="744"
+     inkscape:window-width="1280"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     inkscape:zoom="1.8528087"
+     inkscape:cx="-207.60769"
+     inkscape:cy="69.622169"
+     inkscape:window-x="103"
+     inkscape:window-y="214"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-maximized="0" />
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3350">
+      <stop
+         style="stop-color:#00cb2b;stop-opacity:0.24793388;"
+         offset="0"
+         id="stop3352" />
+      <stop
+         style="stop-color:#00cb2b;stop-opacity:1;"
+         offset="1"
+         id="stop3354" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3342">
+      <stop
+         style="stop-color:#005a85;stop-opacity:1;"
+         offset="0"
+         id="stop3344" />
+      <stop
+         style="stop-color:#005a85;stop-opacity:0.75206614;"
+         offset="1"
+         id="stop3346" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3310">
+      <stop
+         id="stop3312"
+         offset="0"
+         style="stop-color:#ae0202;stop-opacity:1;" />
+      <stop
+         id="stop3314"
+         offset="1"
+         style="stop-color:#b47575;stop-opacity:1;" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 71.887497 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="486.04999 : 71.887497 : 1"
+       inkscape:persp3d-origin="243.02499 : 47.924998 : 1"
+       id="perspective47" />
+    <linearGradient
+       id="linearGradient2795">
+      <stop
+         style="stop-color:#b8b8b8;stop-opacity:0.49803922"
+         offset="0"
+         id="stop2797" />
+      <stop
+         style="stop-color:#7f7f7f;stop-opacity:0"
+         offset="1"
+         id="stop2799" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2787">
+      <stop
+         style="stop-color:#7f7f7f;stop-opacity:0.5"
+         offset="0"
+         id="stop2789" />
+      <stop
+         style="stop-color:#7f7f7f;stop-opacity:0"
+         offset="1"
+         id="stop2791" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3676">
+      <stop
+         style="stop-color:#b2b2b2;stop-opacity:0.5"
+         offset="0"
+         id="stop3678" />
+      <stop
+         style="stop-color:#b3b3b3;stop-opacity:0"
+         offset="1"
+         id="stop3680" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3236">
+      <stop
+         style="stop-color:#f4f4f4;stop-opacity:1"
+         offset="0"
+         id="stop3244" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop3240" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4671">
+      <stop
+         style="stop-color:#ffd43b;stop-opacity:1"
+         offset="0"
+         id="stop4673" />
+      <stop
+         style="stop-color:#ffe873;stop-opacity:1"
+         offset="1"
+         id="stop4675" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4689">
+      <stop
+         style="stop-color:#5a9fd4;stop-opacity:1"
+         offset="0"
+         id="stop4691" />
+      <stop
+         style="stop-color:#306998;stop-opacity:1"
+         offset="1"
+         id="stop4693" />
+    </linearGradient>
+    <linearGradient
+       x1="224.23996"
+       y1="144.75717"
+       x2="-65.308502"
+       y2="144.75717"
+       id="linearGradient2987"
+       xlink:href="#linearGradient4671"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(100.2702,99.61116)" />
+    <linearGradient
+       x1="172.94208"
+       y1="77.475983"
+       x2="26.670298"
+       y2="76.313133"
+       id="linearGradient2990"
+       xlink:href="#linearGradient4689"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(100.2702,99.61116)" />
+    <linearGradient
+       x1="172.94208"
+       y1="77.475983"
+       x2="26.670298"
+       y2="76.313133"
+       id="linearGradient2587"
+       xlink:href="#linearGradient4689"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(100.2702,99.61116)" />
+    <linearGradient
+       x1="224.23996"
+       y1="144.75717"
+       x2="-65.308502"
+       y2="144.75717"
+       id="linearGradient2589"
+       xlink:href="#linearGradient4671"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(100.2702,99.61116)" />
+    <linearGradient
+       x1="172.94208"
+       y1="77.475983"
+       x2="26.670298"
+       y2="76.313133"
+       id="linearGradient2248"
+       xlink:href="#linearGradient4689"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(100.2702,99.61116)" />
+    <linearGradient
+       x1="224.23996"
+       y1="144.75717"
+       x2="-65.308502"
+       y2="144.75717"
+       id="linearGradient2250"
+       xlink:href="#linearGradient4671"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(100.2702,99.61116)" />
+    <linearGradient
+       x1="224.23996"
+       y1="144.75717"
+       x2="-65.308502"
+       y2="144.75717"
+       id="linearGradient2255"
+       xlink:href="#linearGradient4671"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)" />
+    <linearGradient
+       x1="172.94208"
+       y1="76.176224"
+       x2="26.670298"
+       y2="76.313133"
+       id="linearGradient2258"
+       xlink:href="#linearGradient4689"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)" />
+    <radialGradient
+       cx="61.518883"
+       cy="132.28575"
+       r="29.036913"
+       fx="61.518883"
+       fy="132.28575"
+       id="radialGradient2801"
+       xlink:href="#linearGradient2795"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.177966,0,108.7434)" />
+    <linearGradient
+       x1="150.96111"
+       y1="192.35176"
+       x2="112.03144"
+       y2="137.27299"
+       id="linearGradient1475"
+       xlink:href="#linearGradient4671"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)" />
+    <linearGradient
+       x1="26.648937"
+       y1="20.603781"
+       x2="135.66525"
+       y2="114.39767"
+       id="linearGradient1478"
+       xlink:href="#linearGradient4689"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)" />
+    <radialGradient
+       cx="61.518883"
+       cy="132.28575"
+       r="29.036913"
+       fx="61.518883"
+       fy="132.28575"
+       id="radialGradient1480"
+       xlink:href="#linearGradient2795"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.382716e-8,-0.296405,1.43676,4.683673e-7,-128.544,150.5202)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2795"
+       id="radialGradient2421"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.7490565e-8,-0.239947,1.054668,3.7915457e-7,-78.109429,148.85906)"
+       cx="61.518883"
+       cy="132.28575"
+       fx="61.518883"
+       fy="132.28575"
+       r="29.036913" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4671"
+       id="linearGradient3826"
+       x1="36.970898"
+       y1="54.646763"
+       x2="87.704681"
+       y2="54.646763"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4671-8"
+       id="linearGradient3826-6"
+       x1="36.970898"
+       y1="54.646763"
+       x2="87.704681"
+       y2="54.646763"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4671-8">
+      <stop
+         style="stop-color:#ffd43b;stop-opacity:1"
+         offset="0"
+         id="stop4673-8" />
+      <stop
+         style="stop-color:#ffe873;stop-opacity:1"
+         offset="1"
+         id="stop4675-2" />
+    </linearGradient>
+    <linearGradient
+       y2="54.646763"
+       x2="87.704681"
+       y1="54.646763"
+       x1="36.970898"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3843"
+       xlink:href="#linearGradient4689"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3310"
+       id="linearGradient3827"
+       x1="2.844801e-006"
+       y1="74.999992"
+       x2="150"
+       y2="74.999992"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <path
+     sodipodi:type="arc"
+     style="fill:url(#linearGradient3843);fill-opacity:1;fill-rule:nonzero"
+     id="path3040-7"
+     sodipodi:cx="62.337788"
+     sodipodi:cy="54.646763"
+     sodipodi:rx="25.366892"
+     sodipodi:ry="48.709831"
+     d="m 87.704679,54.646763 a 25.366892,48.709831 0 1 1 -50.733783,0 25.366892,48.709831 0 1 1 50.733783,0 z"
+     transform="matrix(1.1747503,-0.05200103,-0.13636762,-0.9831363,33.068466,133.17576)" />
+  <path
+     sodipodi:type="arc"
+     style="fill:url(#linearGradient3826);fill-opacity:1;fill-rule:nonzero"
+     id="path3040"
+     sodipodi:cx="62.337788"
+     sodipodi:cy="54.646763"
+     sodipodi:rx="25.366892"
+     sodipodi:ry="48.709831"
+     d="m 87.704679,54.646763 a 25.366892,48.709831 0 1 1 -50.733783,0 25.366892,48.709831 0 1 1 50.733783,0 z"
+     transform="matrix(-1.1747503,-0.05200103,0.13636762,-0.9831363,109.86108,126.35739)" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path3045"
+     style="font-size:219.19166565000000000px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:url(#linearGradient3827);fill-opacity:1.0;stroke:none;font-family:Verdana;-inkscape-font-specification:Verdana Bold"
+     d="M 48.120545,149.99999 C 33.862575,149.99982 22.278011,142.67462 13.366819,128.02434 4.4556055,113.37378 4.5630392e-6,93.479856 2.8448009e-6,68.342493 5.9936438e-6,53.809828 1.0531487,41.142913 3.159434,30.34171 5.2657183,19.540422 7.9390796,9.4265293 11.179526,9.5361943e-7 l 34.705121,1.83876257e-6 0,4.948939107618 C 39.727772,14.296911 34.996732,24.764299 31.691515,36.351138 28.386239,47.937879 26.733616,59.072981 26.73364,69.756477 c -2.5e-5,2.749326 0.194401,6.362833 0.583278,10.840534 0.388828,4.477514 1.036915,8.130298 1.944265,10.958365 1.16653,3.456294 2.624727,6.303896 4.374594,8.542814 1.749805,2.23869 4.342156,3.35809 7.777058,3.35821 3.17559,-1.2e-4 5.91376,-1.63013 8.214518,-4.890026 2.300663,-3.260123 4.066701,-8.03231 5.29812,-14.316573 1.296124,-6.598676 2.511288,-13.570389 3.645498,-20.915159 1.134096,-7.344924 2.576092,-14.238081 4.325989,-20.679496 3.953273,-14.768303 9.316198,-25.392801 16.08879,-31.873524 6.772437,-6.4807704 15.181376,-9.7211436 25.22683,-9.7211292 13.48012,-1.31e-5 24.48141,7.3251956 33.00389,21.9756482 8.52222,14.650381 12.78339,33.483825 12.78353,56.500389 -1.4e-4,11.547422 -0.92367,22.95746 -2.77057,34.23016 -1.8472,11.27245 -4.16411,21.03285 -6.95075,29.28122 l -33.34413,0 0,-4.8311 c 4.66612,-7.07006 8.57085,-15.73069 11.7142,-25.98193 3.1431,-10.25149 4.71471,-20.71888 4.71483,-31.4022 -1.2e-4,-3.77071 -0.21075,-7.521688 -0.63188,-11.252946 -0.42138,-3.731421 -1.21528,-7.32529 -2.38173,-10.781617 -0.97225,-3.063698 -2.44664,-5.695273 -4.42319,-7.894736 -1.97679,-2.199591 -4.2289,-3.299353 -6.75632,-3.299293 -3.82383,-6.2e-5 -6.75642,1.767415 -8.7978,5.302434 -2.041578,3.534888 -3.904827,10.21202 -5.589768,20.03142 -1.101836,6.441384 -2.171183,12.627551 -3.20803,18.558521 -1.037032,5.930762 -2.462826,12.313317 -4.277385,19.147687 -3.629376,13.43269 -8.571044,23.3502 -14.825019,29.75255 -6.254114,6.40204 -14.37141,9.60313 -24.351913,9.60329 z" />
+</svg>
diff --git a/guiqwt/io.py b/guiqwt/io.py
index 0583574..952534b 100644
--- a/guiqwt/io.py
+++ b/guiqwt/io.py
@@ -304,23 +304,15 @@ def _import_dcm():
 
     logger = logging.getLogger("pydicom")
     logger.setLevel(logging.CRITICAL)
-    try:
-        # pydicom 1.0
-        from pydicom import dicomio  # analysis:ignore
-    except ImportError:
-        # pydicom 0.9
-        import dicom as dicomio  # analysis:ignore
+    from pydicom import dicomio  # analysis:ignore
+
     logger.setLevel(logging.WARNING)
 
 
 def _imread_dcm(filename):
     """Open DICOM image with pydicom and return a NumPy array"""
-    try:
-        # pydicom 1.0
-        from pydicom import dicomio
-    except ImportError:
-        # pydicom 0.9
-        import dicom as dicomio
+    from pydicom import dicomio
+
     dcm = dicomio.read_file(filename, force=True)
     # **********************************************************************
     # The following is necessary until pydicom numpy support is improved:
@@ -343,17 +335,16 @@ def _imread_dcm(filename):
         dcm_is_little_endian = dcm.is_little_endian
     if dcm_is_little_endian != (sys.byteorder == "little"):
         arr.byteswap(True)
+    spp = getattr(dcm, "SamplesperPixel", 1)
     if hasattr(dcm, "NumberofFrames") and dcm.NumberofFrames > 1:
-        if dcm.SamplesperPixel > 1:
-            arr = arr.reshape(
-                dcm.SamplesperPixel, dcm.NumberofFrames, dcm.Rows, dcm.Columns
-            )
+        if spp > 1:
+            arr = arr.reshape(spp, dcm.NumberofFrames, dcm.Rows, dcm.Columns)
         else:
             arr = arr.reshape(dcm.NumberofFrames, dcm.Rows, dcm.Columns)
     else:
-        if dcm.SamplesperPixel > 1:
+        if spp > 1:
             if dcm.BitsAllocated == 8:
-                arr = arr.reshape(dcm.SamplesperPixel, dcm.Rows, dcm.Columns)
+                arr = arr.reshape(spp, dcm.Rows, dcm.Columns)
             else:
                 raise NotImplementedError(
                     "This code only handles "
diff --git a/guiqwt/locale/guiqwt.pot b/guiqwt/locale/guiqwt.pot
deleted file mode 100644
index baa9b6a..0000000
--- a/guiqwt/locale/guiqwt.pot
+++ /dev/null
@@ -1,2229 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR ORGANIZATION
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2015-10-25 10:07+Paris, Madrid\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=CHARSET\n"
-"Content-Transfer-Encoding: ENCODING\n"
-"Generated-By: pygettext.py 1.5\n"
-
-
-#: guiqwt\annotations.py:104 guiqwt\annotations.py:133 guiqwt\builder.py:1073
-msgid "Annotation"
-msgstr ""
-
-#: guiqwt\annotations.py:157 guiqwt\builder.py:863 guiqwt\label.py:95
-#: guiqwt\label.py:114 guiqwt\tools.py:684 guiqwt\tools.py:717
-msgid "Label"
-msgstr ""
-
-#: guiqwt\annotations.py:407
-msgid "Distance:"
-msgstr ""
-
-#: guiqwt\annotations.py:459 guiqwt\annotations.py:536
-#: guiqwt\annotations.py:615 guiqwt\annotations.py:638
-msgid "Center:"
-msgstr ""
-
-#: guiqwt\annotations.py:460 guiqwt\annotations.py:537
-#: guiqwt\annotations.py:616
-msgid "Size:"
-msgstr ""
-
-#: guiqwt\annotations.py:538 guiqwt\annotations.py:617
-msgid "Angle:"
-msgstr ""
-
-#: guiqwt\annotations.py:639
-msgid "Diameter:"
-msgstr ""
-
-#: guiqwt\baseplot.py:91
-msgid "Grid..."
-msgstr ""
-
-#: guiqwt\baseplot.py:92
-msgid "Axes style..."
-msgstr ""
-
-#: guiqwt\baseplot.py:93 guiqwt\curve.py:1126
-msgid "Parameters..."
-msgstr ""
-
-#: guiqwt\baseplot.py:172 guiqwt\styles.py:736 guiqwt\styles.py:781
-#: guiqwt\styles.py:1232
-msgid "Left"
-msgstr ""
-
-#: guiqwt\baseplot.py:173 guiqwt\styles.py:737 guiqwt\styles.py:782
-#: guiqwt\styles.py:1233
-msgid "Right"
-msgstr ""
-
-#: guiqwt\baseplot.py:174 guiqwt\styles.py:739 guiqwt\styles.py:784
-#: guiqwt\styles.py:1235
-msgid "Bottom"
-msgstr ""
-
-#: guiqwt\baseplot.py:175 guiqwt\styles.py:738 guiqwt\styles.py:783
-#: guiqwt\styles.py:1234
-msgid "Top"
-msgstr ""
-
-#: guiqwt\baseplot.py:452
-msgid "Unknown file extension"
-msgstr ""
-
-#: guiqwt\baseplot.py:853 guiqwt\shapes.py:1183 guiqwt\shapes.py:1211
-#: guiqwt\tools.py:898
-msgid "Axes"
-msgstr ""
-
-#: guiqwt\baseplot.py:854
-msgid "Axes associated to selected item"
-msgstr ""
-
-#: guiqwt\baseplot.py:884 guiqwt\styles.py:557 guiqwt\styles.py:563
-#: guiqwt\styles.py:646 guiqwt\styles.py:668
-msgid "Y Axis"
-msgstr ""
-
-#: guiqwt\baseplot.py:886 guiqwt\styles.py:556 guiqwt\styles.py:562
-#: guiqwt\styles.py:641 guiqwt\styles.py:664
-msgid "X Axis"
-msgstr ""
-
-#: guiqwt\builder.py:125 guiqwt\curve.py:227 guiqwt\curve.py:1387
-#: guiqwt\curve.py:1416
-msgid "Grid"
-msgstr ""
-
-#: guiqwt\builder.py:306 guiqwt\builder.py:373 guiqwt\builder.py:394
-#: guiqwt\builder.py:476 guiqwt\builder.py:511 guiqwt\cross_section.py:349
-#: guiqwt\curve.py:334 guiqwt\curve.py:415 guiqwt\curve.py:864
-#: guiqwt\histogram.py:114 guiqwt\histogram.py:222
-msgid "Curve"
-msgstr ""
-
-#: guiqwt\builder.py:396 guiqwt\builder.py:478 guiqwt\curve.py:845
-#: guiqwt\curve.py:866
-msgid "Error bars"
-msgstr ""
-
-#: guiqwt\builder.py:509 guiqwt\histogram.py:117 guiqwt\histogram.py:225
-#: guiqwt\styles.py:1325
-msgid "Histogram"
-msgstr ""
-
-#: guiqwt\builder.py:551 guiqwt\builder.py:603 guiqwt\builder.py:645
-#: guiqwt\builder.py:682 guiqwt\builder.py:707 guiqwt\builder.py:752
-#: guiqwt\builder.py:781 guiqwt\image.py:786 guiqwt\image.py:924
-#: guiqwt\image.py:1180 guiqwt\image.py:1595 guiqwt\image.py:1728
-#: guiqwt\image.py:1842 guiqwt\image.py:2269 guiqwt\styles.py:961
-#: guiqwt\styles.py:1021
-msgid "Image"
-msgstr ""
-
-#: guiqwt\builder.py:802 guiqwt\styles.py:1201
-msgid "Filter"
-msgstr ""
-
-#: guiqwt\builder.py:826
-msgid "2D Histogram"
-msgstr ""
-
-#: guiqwt\builder.py:897
-msgid "Legend"
-msgstr ""
-
-#: guiqwt\builder.py:992 guiqwt\shapes.py:280
-msgid "Marker"
-msgstr ""
-
-#: guiqwt\builder.py:1139 guiqwt\styles.py:1333
-msgid "Computation"
-msgstr ""
-
-#: guiqwt\config.py:25
-msgid "#"
-msgstr ""
-
-#: guiqwt\config.py:61
-msgid "pixels"
-msgstr ""
-
-#: guiqwt\config.py:73
-msgid "Intensity"
-msgstr ""
-
-#: guiqwt\config.py:74
-msgid "lsb"
-msgstr ""
-
-#: guiqwt\cross_section.py:323
-msgid "LUT scale"
-msgstr ""
-
-#: guiqwt\cross_section.py:327 guiqwt\tools.py:1021
-msgid "Cross section"
-msgstr ""
-
-#: guiqwt\cross_section.py:328
-msgid "Enable a marker"
-msgstr ""
-
-#: guiqwt\cross_section.py:605
-msgid "Cross section tool"
-msgstr ""
-
-#: guiqwt\cross_section.py:678
-msgid "Auto-scale"
-msgstr ""
-
-#: guiqwt\cross_section.py:682
-msgid "Refresh"
-msgstr ""
-
-#: guiqwt\cross_section.py:685
-msgid "Auto-refresh"
-msgstr ""
-
-#: guiqwt\cross_section.py:689
-msgid "Lock scales"
-msgstr ""
-
-#: guiqwt\cross_section.py:692
-msgid "Lock scales to main plot axes"
-msgstr ""
-
-#: guiqwt\cross_section.py:776
-msgid "Per image cross-section"
-msgstr ""
-
-#: guiqwt\cross_section.py:779
-msgid ""
-"Enable the per-image cross-section mode, which works directly on image rows/columns.\n"
-"That is the fastest method to compute cross-section curves but it ignores image transformations (e.g. rotation)"
-msgstr ""
-
-#: guiqwt\cross_section.py:785
-msgid ""
-"Apply LUT\n"
-"(contrast settings)"
-msgstr ""
-
-#: guiqwt\cross_section.py:788
-msgid ""
-"Apply LUT (Look-Up Table) contrast settings.\n"
-"This is the easiest way to compare images which have slightly different level ranges.\n"
-"\n"
-"Note: LUT is coded over 1024 levels (0...1023)"
-msgstr ""
-
-#: guiqwt\cross_section.py:922 guiqwt\cross_section.py:923
-#: guiqwt\tools.py:1076 guiqwt\tools.py:1493
-msgid "Oblique averaged cross section"
-msgstr ""
-
-#: guiqwt\cross_section.py:924
-msgid "Activate the oblique cross section tool"
-msgstr ""
-
-#: guiqwt\curve.py:607 guiqwt\curve.py:685
-msgid "PolygonMap"
-msgstr ""
-
-#: guiqwt\curve.py:1120
-msgid "Move to back"
-msgstr ""
-
-#: guiqwt\curve.py:1123
-msgid "Move to front"
-msgstr ""
-
-#: guiqwt\curve.py:1129 guiqwt\curve.py:1281 guiqwt\tests\sift.py:245
-#: guiqwt\tools.py:1992 guiqwt\tools.py:2009
-msgid "Remove"
-msgstr ""
-
-#: guiqwt\curve.py:1278 guiqwt\tools.py:2006
-msgid "Do you really want to remove this item?"
-msgstr ""
-
-#: guiqwt\curve.py:1280 guiqwt\tools.py:2008
-msgid "Do you really want to remove selected items?"
-msgstr ""
-
-#: guiqwt\curve.py:1293 guiqwt\tools.py:1497
-msgid "Item list"
-msgstr ""
-
-#: guiqwt\histogram.py:419 guiqwt\histogram.py:513
-msgid "Eliminate outliers"
-msgstr ""
-
-#: guiqwt\histogram.py:427
-msgid "Contrast adjustment tool"
-msgstr ""
-
-#: guiqwt\histogram.py:488
-msgid "Minimum level"
-msgstr ""
-
-#: guiqwt\histogram.py:490
-msgid "Select minimum level on image"
-msgstr ""
-
-#: guiqwt\histogram.py:494
-msgid "Maximum level"
-msgstr ""
-
-#: guiqwt\histogram.py:496
-msgid "Select maximum level on image"
-msgstr ""
-
-#: guiqwt\histogram.py:508
-msgid "Full range"
-msgstr ""
-
-#: guiqwt\histogram.py:511
-msgid "Scale the image's display range according to data range"
-msgstr ""
-
-#: guiqwt\histogram.py:516
-msgid "Eliminate levels histogram outliers and scale the image's display range accordingly"
-msgstr ""
-
-#: guiqwt\image.py:1100
-msgid "Quadrilaterals"
-msgstr ""
-
-#: guiqwt\image.py:1488
-msgid "There is no supported image item in current plot."
-msgstr ""
-
-#: guiqwt\io.py:113
-msgid "All supported files"
-msgstr ""
-
-#: guiqwt\io.py:342
-msgid "PNG files"
-msgstr ""
-
-#: guiqwt\io.py:345
-msgid "TIFF files"
-msgstr ""
-
-#: guiqwt\io.py:347
-msgid "8-bit images"
-msgstr ""
-
-#: guiqwt\io.py:350 guiqwt\tests\sift.py:702
-msgid "NumPy arrays"
-msgstr ""
-
-#: guiqwt\io.py:352 guiqwt\tests\sift.py:702
-msgid "Text files"
-msgstr ""
-
-#: guiqwt\io.py:354
-msgid "DICOM files"
-msgstr ""
-
-#: guiqwt\plot.py:792 guiqwt\pyplot.py:143
-msgid "Tools"
-msgstr ""
-
-#: guiqwt\pyplot.py:775
-msgid ""
-"Function 'savefig' currently supports the following formats:\n"
-"%s"
-msgstr ""
-
-#: guiqwt\qthelpers.py:62 guiqwt\tests\sift.py:752 guiqwt\tools.py:1518
-#: guiqwt\tools.py:1615
-msgid "Save as"
-msgstr ""
-
-#: guiqwt\qthelpers.py:77 guiqwt\qthelpers.py:106 guiqwt\qthelpers.py:137
-msgid "Error"
-msgstr ""
-
-#: guiqwt\qthelpers.py:78 guiqwt\tests\sift.py:765
-msgid "%s could not be written:"
-msgstr ""
-
-#: guiqwt\qthelpers.py:96 guiqwt\qthelpers.py:126 guiqwt\tests\sift.py:703
-#: guiqwt\tests\simple_window.py:227 guiqwt\tools.py:1717
-msgid "Open"
-msgstr ""
-
-#: guiqwt\qthelpers.py:107 guiqwt\qthelpers.py:138 guiqwt\tests\sift.py:729
-msgid "%s could not be opened:"
-msgstr ""
-
-#: guiqwt\shapes.py:554 guiqwt\shapes.py:593
-msgid "Shape"
-msgstr ""
-
-#: guiqwt\shapes.py:1337
-msgid "Range"
-msgstr ""
-
-#: guiqwt\styles.py:284
-msgid "Solid line"
-msgstr ""
-
-#: guiqwt\styles.py:285
-msgid "Dashed line"
-msgstr ""
-
-#: guiqwt\styles.py:286
-msgid "Dotted line"
-msgstr ""
-
-#: guiqwt\styles.py:287
-msgid "Dash-dot line"
-msgstr ""
-
-#: guiqwt\styles.py:288
-msgid "Dash-dot-dot line"
-msgstr ""
-
-#: guiqwt\styles.py:289
-msgid "No line"
-msgstr ""
-
-#: guiqwt\styles.py:291 guiqwt\styles.py:337
-msgid "Cross"
-msgstr ""
-
-#: guiqwt\styles.py:292 guiqwt\tools.py:886
-msgid "Ellipse"
-msgstr ""
-
-#: guiqwt\styles.py:293
-msgid "Star"
-msgstr ""
-
-#: guiqwt\styles.py:294
-msgid "X-Cross"
-msgstr ""
-
-#: guiqwt\styles.py:295
-msgid "Square"
-msgstr ""
-
-#: guiqwt\styles.py:296
-msgid "Diamond"
-msgstr ""
-
-#: guiqwt\styles.py:297 guiqwt\styles.py:298 guiqwt\styles.py:299
-#: guiqwt\styles.py:300
-msgid "Triangle"
-msgstr ""
-
-#: guiqwt\styles.py:301
-msgid "Hexagon"
-msgstr ""
-
-#: guiqwt\styles.py:302
-msgid "No symbol"
-msgstr ""
-
-#: guiqwt\styles.py:304
-msgid "Lines"
-msgstr ""
-
-#: guiqwt\styles.py:305
-msgid "Sticks"
-msgstr ""
-
-#: guiqwt\styles.py:306 guiqwt\widgets\fit.py:94
-msgid "Steps"
-msgstr ""
-
-#: guiqwt\styles.py:307
-msgid "Dots"
-msgstr ""
-
-#: guiqwt\styles.py:308
-msgid "No curve"
-msgstr ""
-
-#: guiqwt\styles.py:312
-msgid "No brush pattern"
-msgstr ""
-
-#: guiqwt\styles.py:313
-msgid "Uniform color"
-msgstr ""
-
-#: guiqwt\styles.py:314
-msgid "Extremely dense brush pattern"
-msgstr ""
-
-#: guiqwt\styles.py:315
-msgid "Very dense brush pattern"
-msgstr ""
-
-#: guiqwt\styles.py:316
-msgid "Somewhat dense brush pattern"
-msgstr ""
-
-#: guiqwt\styles.py:317
-msgid "Half dense brush pattern"
-msgstr ""
-
-#: guiqwt\styles.py:318
-msgid "Somewhat sparse brush pattern"
-msgstr ""
-
-#: guiqwt\styles.py:319
-msgid "Very sparse brush pattern"
-msgstr ""
-
-#: guiqwt\styles.py:320
-msgid "Extremely sparse brush pattern"
-msgstr ""
-
-#: guiqwt\styles.py:321
-msgid "Horizontal lines"
-msgstr ""
-
-#: guiqwt\styles.py:322
-msgid "Vertical lines"
-msgstr ""
-
-#: guiqwt\styles.py:323
-msgid "Crossing horizontal and vertical lines"
-msgstr ""
-
-#: guiqwt\styles.py:325
-msgid "Backward diagonal lines"
-msgstr ""
-
-#: guiqwt\styles.py:326
-msgid "Forward diagonal lines"
-msgstr ""
-
-#: guiqwt\styles.py:327
-msgid "Crossing diagonal lines"
-msgstr ""
-
-#: guiqwt\styles.py:334
-msgid "None"
-msgstr ""
-
-#: guiqwt\styles.py:335
-msgid "Horizontal"
-msgstr ""
-
-#: guiqwt\styles.py:336
-msgid "Vertical"
-msgstr ""
-
-#: guiqwt\styles.py:357
-msgid "Family"
-msgstr ""
-
-#: guiqwt\styles.py:358
-msgid "Choose font"
-msgstr ""
-
-#: guiqwt\styles.py:360
-msgid "Size in point"
-msgstr ""
-
-#: guiqwt\styles.py:361
-msgid "Bold"
-msgstr ""
-
-#: guiqwt\styles.py:362
-msgid "Italic"
-msgstr ""
-
-#: guiqwt\styles.py:391 guiqwt\styles.py:436 guiqwt\styles.py:471
-msgid "Style"
-msgstr ""
-
-#: guiqwt\styles.py:393 guiqwt\tests\sift.py:117
-msgid "Size"
-msgstr ""
-
-#: guiqwt\styles.py:394 guiqwt\styles.py:716
-msgid "Border"
-msgstr ""
-
-#: guiqwt\styles.py:395 guiqwt\styles.py:519 guiqwt\styles.py:554
-#: guiqwt\styles.py:723 guiqwt\styles.py:1071 guiqwt\styles.py:1348
-msgid "Background color"
-msgstr ""
-
-#: guiqwt\styles.py:396 guiqwt\styles.py:520
-msgid "Background alpha"
-msgstr ""
-
-#: guiqwt\styles.py:437 guiqwt\styles.py:473 guiqwt\styles.py:601
-#: guiqwt\styles.py:926
-msgid "Color"
-msgstr ""
-
-#: guiqwt\styles.py:438 guiqwt\styles.py:929 guiqwt\tests\sift.py:176
-#: guiqwt\tests\simple_dialog.py:28 guiqwt\tests\simple_window.py:42
-msgid "Width"
-msgstr ""
-
-#: guiqwt\styles.py:474 guiqwt\styles.py:927
-msgid "Alpha"
-msgstr ""
-
-#: guiqwt\styles.py:475 guiqwt\tests\sift.py:869
-msgid "Angle"
-msgstr ""
-
-#: guiqwt\styles.py:476
-msgid "sx"
-msgstr ""
-
-#: guiqwt\styles.py:477
-msgid "sy"
-msgstr ""
-
-#: guiqwt\styles.py:517
-msgid "Font"
-msgstr ""
-
-#: guiqwt\styles.py:518 guiqwt\styles.py:722
-msgid "Text color"
-msgstr ""
-
-#: guiqwt\styles.py:555
-msgid "Major grid"
-msgstr ""
-
-#: guiqwt\styles.py:558 guiqwt\styles.py:564 guiqwt\styles.py:872
-#: guiqwt\styles.py:1374 guiqwt\styles.py:1377 guiqwt\styles.py:1434
-#: guiqwt\styles.py:1437 guiqwt\styles.py:1491 guiqwt\styles.py:1494
-#: guiqwt\styles.py:1567 guiqwt\styles.py:1570
-msgid "Line"
-msgstr ""
-
-#: guiqwt\styles.py:561
-msgid "Minor grid"
-msgstr ""
-
-#: guiqwt\styles.py:599 guiqwt\styles.py:701 guiqwt\styles.py:830
-#: guiqwt\styles.py:870 guiqwt\styles.py:1201 guiqwt\styles.py:1325
-#: guiqwt\styles.py:1431 guiqwt\styles.py:1524 guiqwt\tests\sift.py:100
-#: guiqwt\tests\sift.py:114 guiqwt\tests\sift.py:163 guiqwt\tests\sift.py:173
-#: guiqwt\tests\simple_dialog.py:27 guiqwt\tests\simple_window.py:39
-msgid "Title"
-msgstr ""
-
-#: guiqwt\styles.py:600 guiqwt\widgets\fit.py:97
-msgid "Unit"
-msgstr ""
-
-#: guiqwt\styles.py:602
-msgid "Title font"
-msgstr ""
-
-#: guiqwt\styles.py:603
-msgid "Values font"
-msgstr ""
-
-#: guiqwt\styles.py:610 guiqwt\tools.py:1770 guiqwt\widgets\fit.py:96
-msgid "Scale"
-msgstr ""
-
-#: guiqwt\styles.py:611
-msgid "linear"
-msgstr ""
-
-#: guiqwt\styles.py:611 guiqwt\styles.py:1308 guiqwt\styles.py:1331
-msgid "logarithmic"
-msgstr ""
-
-#: guiqwt\styles.py:613
-msgid "Lower axis limit"
-msgstr ""
-
-#: guiqwt\styles.py:614
-msgid "Upper axis limit"
-msgstr ""
-
-#: guiqwt\styles.py:637
-msgid "X-axis position"
-msgstr ""
-
-#: guiqwt\styles.py:638
-msgid "bottom"
-msgstr ""
-
-#: guiqwt\styles.py:639
-msgid "top"
-msgstr ""
-
-#: guiqwt\styles.py:642
-msgid "Y-axis position"
-msgstr ""
-
-#: guiqwt\styles.py:643
-msgid "left"
-msgstr ""
-
-#: guiqwt\styles.py:644
-msgid "right"
-msgstr ""
-
-#: guiqwt\styles.py:665
-msgid "Lower x-axis limit"
-msgstr ""
-
-#: guiqwt\styles.py:666
-msgid "Upper x-axis limit"
-msgstr ""
-
-#: guiqwt\styles.py:669
-msgid "Lower y-axis limit"
-msgstr ""
-
-#: guiqwt\styles.py:670
-msgid "Upper y-axis limit"
-msgstr ""
-
-#: guiqwt\styles.py:672
-msgid "Z Axis"
-msgstr ""
-
-#: guiqwt\styles.py:673
-msgid "Lower z-axis limit"
-msgstr ""
-
-#: guiqwt\styles.py:674
-msgid "Upper z-axis limit"
-msgstr ""
-
-#: guiqwt\styles.py:706 guiqwt\styles.py:710
-msgid "Contents"
-msgstr ""
-
-#: guiqwt\styles.py:713 guiqwt\styles.py:873 guiqwt\styles.py:1379
-#: guiqwt\styles.py:1382 guiqwt\styles.py:1439 guiqwt\styles.py:1442
-#: guiqwt\styles.py:1572 guiqwt\styles.py:1575 guiqwt\tests\styles.py:28
-#: guiqwt\tests\styles.py:34 guiqwt\tests\styles.py:42
-#: guiqwt\tests\styles.py:44 guiqwt\tests\styles.py:50
-#: guiqwt\tests\styles.py:53
-msgid "Symbol"
-msgstr ""
-
-#: guiqwt\styles.py:717
-msgid "set width to 0 to disable"
-msgstr ""
-
-#: guiqwt\styles.py:720 guiqwt\styles.py:726 guiqwt\styles.py:1384
-#: guiqwt\styles.py:1387
-msgid "Text"
-msgstr ""
-
-#: guiqwt\styles.py:721
-msgid "Text font"
-msgstr ""
-
-#: guiqwt\styles.py:724
-msgid "Background transparency"
-msgstr ""
-
-#: guiqwt\styles.py:728 guiqwt\styles.py:776 guiqwt\styles.py:792
-msgid "Position"
-msgstr ""
-
-#: guiqwt\styles.py:729
-msgid "Position relative to anchor"
-msgstr ""
-
-#: guiqwt\styles.py:731
-msgid "Corner"
-msgstr ""
-
-#: guiqwt\styles.py:732 guiqwt\styles.py:777
-msgid "Top left"
-msgstr ""
-
-#: guiqwt\styles.py:733 guiqwt\styles.py:778
-msgid "Top right"
-msgstr ""
-
-#: guiqwt\styles.py:734 guiqwt\styles.py:779
-msgid "Bottom left"
-msgstr ""
-
-#: guiqwt\styles.py:735 guiqwt\styles.py:780
-msgid "Bottom right"
-msgstr ""
-
-#: guiqwt\styles.py:740 guiqwt\styles.py:785
-msgid "Center"
-msgstr ""
-
-#: guiqwt\styles.py:741
-msgid "Label position relative to anchor point"
-msgstr ""
-
-#: guiqwt\styles.py:744
-msgid "ΔX"
-msgstr ""
-
-#: guiqwt\styles.py:745
-msgid "Horizontal offset (pixels) relative to anchor point"
-msgstr ""
-
-#: guiqwt\styles.py:747
-msgid "ΔY"
-msgstr ""
-
-#: guiqwt\styles.py:748
-msgid "Vertical offset (pixels) relative to anchor point"
-msgstr ""
-
-#: guiqwt\styles.py:751 guiqwt\styles.py:756
-msgid "Anchor"
-msgstr ""
-
-#: guiqwt\styles.py:753 guiqwt\styles.py:790
-msgid "Anchor position"
-msgstr ""
-
-#: guiqwt\styles.py:756
-msgid "Attach to canvas"
-msgstr ""
-
-#: guiqwt\styles.py:760
-msgid "X"
-msgstr ""
-
-#: guiqwt\styles.py:761
-msgid "X-axis position in canvas coordinates"
-msgstr ""
-
-#: guiqwt\styles.py:764
-msgid "Y"
-msgstr ""
-
-#: guiqwt\styles.py:765
-msgid "Y-axis position in canvas coordinates"
-msgstr ""
-
-#: guiqwt\styles.py:769
-msgid "Interact"
-msgstr ""
-
-#: guiqwt\styles.py:770
-msgid "moving object changes anchor position"
-msgstr ""
-
-#: guiqwt\styles.py:771
-msgid "moving object changes label position"
-msgstr ""
-
-#: guiqwt\styles.py:786
-msgid "Absolute position on canvas"
-msgstr ""
-
-#: guiqwt\styles.py:874
-msgid "Shadow"
-msgstr ""
-
-#: guiqwt\styles.py:875
-msgid "Curve style"
-msgstr ""
-
-#: guiqwt\styles.py:877
-msgid "Baseline"
-msgstr ""
-
-#: guiqwt\styles.py:920
-msgid "Display"
-msgstr ""
-
-#: guiqwt\styles.py:921
-msgid "error bars with caps (x, y)"
-msgstr ""
-
-#: guiqwt\styles.py:922
-msgid "error area (y)"
-msgstr ""
-
-#: guiqwt\styles.py:923
-msgid ""
-"Note: only y-axis error bars are shown in error area mode\n"
-"(width and cap parameters will also be ignored)"
-msgstr ""
-
-#: guiqwt\styles.py:928
-msgid "Error bar transparency"
-msgstr ""
-
-#: guiqwt\styles.py:930
-msgid "Cap"
-msgstr ""
-
-#: guiqwt\styles.py:931
-msgid "Visibility"
-msgstr ""
-
-#: guiqwt\styles.py:931
-msgid "set to foreground"
-msgstr ""
-
-#: guiqwt\styles.py:961 guiqwt\styles.py:1021 guiqwt\tests\simple_dialog.py:70
-msgid "Image title"
-msgstr ""
-
-#: guiqwt\styles.py:963 guiqwt\styles.py:1023
-msgid "Alpha channel"
-msgstr ""
-
-#: guiqwt\styles.py:963 guiqwt\styles.py:1023
-msgid "Use image level as alpha"
-msgstr ""
-
-#: guiqwt\styles.py:965 guiqwt\styles.py:1025
-msgid "Global alpha"
-msgstr ""
-
-#: guiqwt\styles.py:966 guiqwt\styles.py:1026
-msgid "Global alpha value"
-msgstr ""
-
-#: guiqwt\styles.py:968 guiqwt\styles.py:1028 guiqwt\tools.py:2032
-msgid "Colormap"
-msgstr ""
-
-#: guiqwt\styles.py:972 guiqwt\styles.py:1032
-msgid "Interpolation"
-msgstr ""
-
-#: guiqwt\styles.py:973
-msgid "None (nearest pixel)"
-msgstr ""
-
-#: guiqwt\styles.py:974
-msgid "Linear interpolation"
-msgstr ""
-
-#: guiqwt\styles.py:975
-msgid "2x2 antialiasing filter"
-msgstr ""
-
-#: guiqwt\styles.py:976
-msgid "3x3 antialiasing filter"
-msgstr ""
-
-#: guiqwt\styles.py:977
-msgid "5x5 antialiasing filter"
-msgstr ""
-
-#: guiqwt\styles.py:978
-msgid "Image interpolation type"
-msgstr ""
-
-#: guiqwt\styles.py:980 guiqwt\styles.py:984
-msgid "Statistics string formatting"
-msgstr ""
-
-#: guiqwt\styles.py:981
-msgid "X-Axis"
-msgstr ""
-
-#: guiqwt\styles.py:982
-msgid "Y-Axis"
-msgstr ""
-
-#: guiqwt\styles.py:983
-msgid "Z-Axis"
-msgstr ""
-
-#: guiqwt\styles.py:1033
-msgid "Quadrangle interpolation"
-msgstr ""
-
-#: guiqwt\styles.py:1034
-msgid "Flat"
-msgstr ""
-
-#: guiqwt\styles.py:1037
-msgid "Image interpolation type, Flat mode use fixed u,v interpolation parameters"
-msgstr ""
-
-#: guiqwt\styles.py:1040
-msgid "Fixed U interpolation parameter"
-msgstr ""
-
-#: guiqwt\styles.py:1041 guiqwt\styles.py:1043
-msgid "For flat mode only"
-msgstr ""
-
-#: guiqwt\styles.py:1042
-msgid "Fixed V interpolation parameter"
-msgstr ""
-
-#: guiqwt\styles.py:1044
-msgid "Show grid"
-msgstr ""
-
-#: guiqwt\styles.py:1045
-msgid "Grid lines color"
-msgstr ""
-
-#: guiqwt\styles.py:1105 guiqwt\styles.py:1108
-msgid "Image placement along X-axis"
-msgstr ""
-
-#: guiqwt\styles.py:1106 guiqwt\styles.py:1203
-msgid "x|min"
-msgstr ""
-
-#: guiqwt\styles.py:1107 guiqwt\styles.py:1204
-msgid "x|max"
-msgstr ""
-
-#: guiqwt\styles.py:1109 guiqwt\styles.py:1112
-msgid "Image placement along Y-axis"
-msgstr ""
-
-#: guiqwt\styles.py:1110 guiqwt\styles.py:1205
-msgid "y|min"
-msgstr ""
-
-#: guiqwt\styles.py:1111 guiqwt\styles.py:1206
-msgid "y|max"
-msgstr ""
-
-#: guiqwt\styles.py:1175 guiqwt\styles.py:1182 guiqwt\tools.py:2100
-msgid "Mask"
-msgstr ""
-
-#: guiqwt\styles.py:1176
-msgid "Filling value"
-msgstr ""
-
-#: guiqwt\styles.py:1177 guiqwt\tools.py:2130
-msgid "Show image mask"
-msgstr ""
-
-#: guiqwt\styles.py:1178
-msgid "Masked area alpha"
-msgstr ""
-
-#: guiqwt\styles.py:1180
-msgid "Unmasked area alpha"
-msgstr ""
-
-#: guiqwt\styles.py:1202 guiqwt\widgets\fit.py:364
-msgid "Bounds"
-msgstr ""
-
-#: guiqwt\styles.py:1208
-msgid "Use image colormap and level"
-msgstr ""
-
-#: guiqwt\styles.py:1209
-msgid "Color map"
-msgstr ""
-
-#: guiqwt\styles.py:1230
-msgid "Crop"
-msgstr ""
-
-#: guiqwt\styles.py:1236
-msgid "Cropping"
-msgstr ""
-
-#: guiqwt\styles.py:1238 guiqwt\styles.py:1242
-msgid "Pixel size"
-msgstr ""
-
-#: guiqwt\styles.py:1240
-msgid "Width (dx)"
-msgstr ""
-
-#: guiqwt\styles.py:1241
-msgid "Height (dy)"
-msgstr ""
-
-#: guiqwt\styles.py:1244 guiqwt\styles.py:1254
-msgid "Translate, rotate and flip"
-msgstr ""
-
-#: guiqwt\styles.py:1245
-msgid "x<sub>CENTER</sub>"
-msgstr ""
-
-#: guiqwt\styles.py:1247 guiqwt\tests\sift.py:794
-msgid "Flip horizontally"
-msgstr ""
-
-#: guiqwt\styles.py:1249
-msgid "y<sub>CENTER</sub>"
-msgstr ""
-
-#: guiqwt\styles.py:1251 guiqwt\tests\sift.py:796
-msgid "Flip vertically"
-msgstr ""
-
-#: guiqwt\styles.py:1253
-msgid "θ (°)"
-msgstr ""
-
-#: guiqwt\styles.py:1307
-msgid "Bins"
-msgstr ""
-
-#: guiqwt\styles.py:1307
-msgid "Number of bins"
-msgstr ""
-
-#: guiqwt\styles.py:1308
-msgid "Y-axis scale"
-msgstr ""
-
-#: guiqwt\styles.py:1327
-msgid "X-axis bins"
-msgstr ""
-
-#: guiqwt\styles.py:1328
-msgid "Number of bins along x-axis"
-msgstr ""
-
-#: guiqwt\styles.py:1329
-msgid "Y-axis bins"
-msgstr ""
-
-#: guiqwt\styles.py:1330
-msgid "Number of bins along y-axis"
-msgstr ""
-
-#: guiqwt\styles.py:1331
-msgid "Z-axis scale"
-msgstr ""
-
-#: guiqwt\styles.py:1334
-msgid "Bin count"
-msgstr ""
-
-#: guiqwt\styles.py:1335
-msgid "Maximum value"
-msgstr ""
-
-#: guiqwt\styles.py:1336
-msgid "Mininum value"
-msgstr ""
-
-#: guiqwt\styles.py:1337 guiqwt\tests\sift.py:252
-msgid "Sum"
-msgstr ""
-
-#: guiqwt\styles.py:1338 guiqwt\tests\sift.py:257
-msgid "Product"
-msgstr ""
-
-#: guiqwt\styles.py:1339 guiqwt\tests\sift.py:253 guiqwt\tests\sift.py:389
-msgid "Average"
-msgstr ""
-
-#: guiqwt\styles.py:1342
-msgid ""
-"Bin count : counts the number of points per bin,\n"
-"For max, min, sum, product, average, compute the function of a third parameter (one by default)"
-msgstr ""
-
-#: guiqwt\styles.py:1345
-msgid "Automatic LUT range"
-msgstr ""
-
-#: guiqwt\styles.py:1346
-msgid "Automatically adapt color scale when panning, zooming"
-msgstr ""
-
-#: guiqwt\styles.py:1349
-msgid "Background color when no data is present"
-msgstr ""
-
-#: guiqwt\styles.py:1375 guiqwt\styles.py:1435 guiqwt\styles.py:1568
-msgid "Line (not selected)"
-msgstr ""
-
-#: guiqwt\styles.py:1376 guiqwt\styles.py:1436 guiqwt\styles.py:1569
-msgid "Line (selected)"
-msgstr ""
-
-#: guiqwt\styles.py:1380 guiqwt\styles.py:1440 guiqwt\styles.py:1573
-msgid "Symbol (not selected)"
-msgstr ""
-
-#: guiqwt\styles.py:1381 guiqwt\styles.py:1441 guiqwt\styles.py:1574
-msgid "Symbol (selected)"
-msgstr ""
-
-#: guiqwt\styles.py:1385
-msgid "Text (not selected)"
-msgstr ""
-
-#: guiqwt\styles.py:1386
-msgid "Text (selected)"
-msgstr ""
-
-#: guiqwt\styles.py:1390 guiqwt\tests\styles.py:63 guiqwt\tests\styles.py:68
-#: guiqwt\tests\styles.py:75 guiqwt\tests\styles.py:77
-#: guiqwt\tests\styles.py:82 guiqwt\tests\styles.py:85
-msgid "Line style"
-msgstr ""
-
-#: guiqwt\styles.py:1392
-msgid "Spacing"
-msgstr ""
-
-#: guiqwt\styles.py:1444 guiqwt\styles.py:1448 guiqwt\styles.py:1496
-#: guiqwt\styles.py:1500
-msgid "Fill pattern"
-msgstr ""
-
-#: guiqwt\styles.py:1446
-msgid "Fill pattern (not selected)"
-msgstr ""
-
-#: guiqwt\styles.py:1447
-msgid "Fill pattern (selected)"
-msgstr ""
-
-#: guiqwt\styles.py:1451 guiqwt\styles.py:1532
-msgid "Read-only shape"
-msgstr ""
-
-#: guiqwt\styles.py:1452 guiqwt\styles.py:1533
-msgid "Read-only shapes can't be removed from the item list panel"
-msgstr ""
-
-#: guiqwt\styles.py:1454 guiqwt\styles.py:1535
-msgid "Private shape"
-msgstr ""
-
-#: guiqwt\styles.py:1455 guiqwt\styles.py:1536
-msgid "Private shapes are not shown in the item list panel"
-msgstr ""
-
-#: guiqwt\styles.py:1487
-msgid "Arrow angle (°)"
-msgstr ""
-
-#: guiqwt\styles.py:1488
-msgid "Arrow size (%)"
-msgstr ""
-
-#: guiqwt\styles.py:1492
-msgid "Line (X-Axis)"
-msgstr ""
-
-#: guiqwt\styles.py:1493
-msgid "Line (Y-Axis)"
-msgstr ""
-
-#: guiqwt\styles.py:1498
-msgid "Fill pattern (X-Axis)"
-msgstr ""
-
-#: guiqwt\styles.py:1499
-msgid "Fill pattern (Y-Axis)"
-msgstr ""
-
-#: guiqwt\styles.py:1521
-msgid "Show annotation"
-msgstr ""
-
-#: guiqwt\styles.py:1522
-msgid "Show informations on area covered by this shape"
-msgstr ""
-
-#: guiqwt\styles.py:1525
-msgid "Subtitle"
-msgstr ""
-
-#: guiqwt\styles.py:1526
-msgid "String formatting"
-msgstr ""
-
-#: guiqwt\styles.py:1527
-msgid "Uncertainty"
-msgstr ""
-
-#: guiqwt\styles.py:1528
-msgid "Measurement relative uncertainty"
-msgstr ""
-
-#: guiqwt\styles.py:1530
-msgid "Transform matrix"
-msgstr ""
-
-#: guiqwt\styles.py:1577 guiqwt\styles.py:1581
-msgid "Fill"
-msgstr ""
-
-#: guiqwt\styles.py:1579
-msgid "Fill color"
-msgstr ""
-
-#: guiqwt\styles.py:1580
-msgid "Shade"
-msgstr ""
-
-#: guiqwt\tests\get_point.py:31
-msgid "Select one point then press OK to accept"
-msgstr ""
-
-#: guiqwt\tests\get_segment.py:29
-msgid "Select a segment then press OK to accept"
-msgstr ""
-
-#: guiqwt\tests\hist2d.py:23 guiqwt\tests\hist2d_func.py:24
-#: guiqwt\tools.py:1337
-msgid "Markers"
-msgstr ""
-
-#: guiqwt\tests\mandelbrot.py:25
-msgid "MAX resolution"
-msgstr ""
-
-#: guiqwt\tests\sift.py:45
-msgid "Sift"
-msgstr ""
-
-#: guiqwt\tests\sift.py:46
-msgid ""
-"Signal and Image Filtering Tool<br>\n"
-"Simple signal and image processing application based on guiqwt and guidata"
-msgstr ""
-
-#: guiqwt\tests\sift.py:100 guiqwt\tests\sift.py:114 guiqwt\tests\sift.py:163
-#: guiqwt\tests\sift.py:173 guiqwt\tests\simple_window.py:39
-msgid "Untitled"
-msgstr ""
-
-#: guiqwt\tests\sift.py:101 guiqwt\tests\sift.py:164
-#: guiqwt\tests\simple_window.py:40 guiqwt\widgets\fit.py:416
-msgid "Data"
-msgstr ""
-
-#: guiqwt\tests\sift.py:117
-msgid "Signal size (total number of points)"
-msgstr ""
-
-#: guiqwt\tests\sift.py:119 guiqwt\tests\sift.py:182
-#: guiqwt\tests\simple_window.py:52
-msgid "Type"
-msgstr ""
-
-#: guiqwt\tests\sift.py:120 guiqwt\tests\sift.py:183
-#: guiqwt\tests\simple_window.py:53
-msgid "zeros"
-msgstr ""
-
-#: guiqwt\tests\sift.py:120 guiqwt\tests\sift.py:184
-#: guiqwt\tests\simple_window.py:53
-msgid "random"
-msgstr ""
-
-#: guiqwt\tests\sift.py:121
-msgid "gaussian"
-msgstr ""
-
-#: guiqwt\tests\sift.py:165
-msgid "Metadata"
-msgstr ""
-
-#: guiqwt\tests\sift.py:174
-msgid "Image height (total number of rows)"
-msgstr ""
-
-#: guiqwt\tests\sift.py:174 guiqwt\tests\simple_dialog.py:29
-#: guiqwt\tests\simple_window.py:45
-msgid "Height"
-msgstr ""
-
-#: guiqwt\tests\sift.py:176
-msgid "Image width (total number of columns)"
-msgstr ""
-
-#: guiqwt\tests\sift.py:178
-msgid "Data type"
-msgstr ""
-
-#: guiqwt\tests\sift.py:183
-msgid "empty"
-msgstr ""
-
-#: guiqwt\tests\sift.py:221 guiqwt\tests\simple_window.py:60
-msgid "Properties"
-msgstr ""
-
-#: guiqwt\tests\sift.py:241
-msgid "Duplicate"
-msgstr ""
-
-#: guiqwt\tests\sift.py:255
-msgid "Difference"
-msgstr ""
-
-#: guiqwt\tests\sift.py:259
-msgid "Division"
-msgstr ""
-
-#: guiqwt\tests\sift.py:381 guiqwt\tests\sift.py:402 guiqwt\tests\sift.py:423
-#: guiqwt\tests\sift.py:440 guiqwt\tests\sift.py:457 guiqwt\tests\sift.py:495
-#: guiqwt\tests\sift.py:978
-msgid "Error:"
-msgstr ""
-
-#: guiqwt\tests\sift.py:484
-msgid "Computing:"
-msgstr ""
-
-#: guiqwt\tests\sift.py:510
-msgid "New signal..."
-msgstr ""
-
-#: guiqwt\tests\sift.py:512 guiqwt\tests\sift.py:670
-msgid "Create a new signal"
-msgstr ""
-
-#: guiqwt\tests\sift.py:514
-msgid "Open signal..."
-msgstr ""
-
-#: guiqwt\tests\sift.py:516
-msgid "Open a signal"
-msgstr ""
-
-#: guiqwt\tests\sift.py:518
-msgid "Save signal..."
-msgstr ""
-
-#: guiqwt\tests\sift.py:520
-msgid "Save selected signal"
-msgstr ""
-
-#: guiqwt\tests\sift.py:526 guiqwt\tests\sift.py:588 guiqwt\tests\sift.py:806
-#: guiqwt\tests\sift.py:957
-msgid "ROI extraction"
-msgstr ""
-
-#: guiqwt\tests\sift.py:528 guiqwt\tests\sift.py:808
-msgid "Swap X/Y axes"
-msgstr ""
-
-#: guiqwt\tests\sift.py:534 guiqwt\tests\sift.py:623
-msgid "Normalize"
-msgstr ""
-
-#: guiqwt\tests\sift.py:536 guiqwt\tests\sift.py:635 guiqwt\tests\sift.py:823
-#: guiqwt\tests\sift.py:987
-msgid "Linear calibration"
-msgstr ""
-
-#: guiqwt\tests\sift.py:538 guiqwt\tests\sift.py:654 guiqwt\tests\sift.py:829
-#: guiqwt\tests\sift.py:1012
-msgid "Gaussian filter"
-msgstr ""
-
-#: guiqwt\tests\sift.py:540 guiqwt\tests\sift.py:831
-msgid "Wiener filter"
-msgstr ""
-
-#: guiqwt\tests\sift.py:542 guiqwt\tests\sift.py:833
-msgid "FFT"
-msgstr ""
-
-#: guiqwt\tests\sift.py:543 guiqwt\tests\sift.py:546 guiqwt\tests\sift.py:834
-#: guiqwt\tests\sift.py:837
-msgid "Warning: only real part is plotted"
-msgstr ""
-
-#: guiqwt\tests\sift.py:545 guiqwt\tests\sift.py:836
-msgid "Inverse FFT"
-msgstr ""
-
-#: guiqwt\tests\sift.py:586 guiqwt\tests\sift.py:953
-msgid "First row index"
-msgstr ""
-
-#: guiqwt\tests\sift.py:587 guiqwt\tests\sift.py:954
-msgid "Last row index"
-msgstr ""
-
-#: guiqwt\tests\sift.py:617
-msgid "maximum"
-msgstr ""
-
-#: guiqwt\tests\sift.py:618
-msgid "amplitude"
-msgstr ""
-
-#: guiqwt\tests\sift.py:619
-msgid "sum"
-msgstr ""
-
-#: guiqwt\tests\sift.py:620
-msgid "energy"
-msgstr ""
-
-#: guiqwt\tests\sift.py:622
-msgid "Normalize with respect to"
-msgstr ""
-
-#: guiqwt\tests\sift.py:630
-msgid "X-axis"
-msgstr ""
-
-#: guiqwt\tests\sift.py:630
-msgid "Y-axis"
-msgstr ""
-
-#: guiqwt\tests\sift.py:632
-msgid "Calibrate"
-msgstr ""
-
-#: guiqwt\tests\sift.py:690
-msgid "New gaussian function"
-msgstr ""
-
-#: guiqwt\tests\sift.py:753
-msgid "CSV files"
-msgstr ""
-
-#: guiqwt\tests\sift.py:777
-msgid "New image..."
-msgstr ""
-
-#: guiqwt\tests\sift.py:779 guiqwt\tests\sift.py:1027
-#: guiqwt\tests\simple_window.py:171 guiqwt\tests\simple_window.py:212
-msgid "Create a new image"
-msgstr ""
-
-#: guiqwt\tests\sift.py:781
-msgid "Open image..."
-msgstr ""
-
-#: guiqwt\tests\sift.py:783 guiqwt\tests\simple_window.py:176
-msgid "Open an image"
-msgstr ""
-
-#: guiqwt\tests\sift.py:785
-msgid "Save image..."
-msgstr ""
-
-#: guiqwt\tests\sift.py:787
-msgid "Save selected image"
-msgstr ""
-
-#: guiqwt\tests\sift.py:793 guiqwt\tests\sift.py:885
-msgid "Rotation"
-msgstr ""
-
-#: guiqwt\tests\sift.py:798
-msgid "Rotate 90° right"
-msgstr ""
-
-#: guiqwt\tests\sift.py:800
-msgid "Rotate 90° left"
-msgstr ""
-
-#: guiqwt\tests\sift.py:802
-msgid "Rotate arbitrarily..."
-msgstr ""
-
-#: guiqwt\tests\sift.py:804 guiqwt\tests\sift.py:937
-#: guiqwt\widgets\resizedialog.py:98
-msgid "Resize"
-msgstr ""
-
-#: guiqwt\tests\sift.py:810
-msgid "Flat-field correction"
-msgstr ""
-
-#: guiqwt\tests\sift.py:825 guiqwt\tests\sift.py:995
-msgid "Thresholding"
-msgstr ""
-
-#: guiqwt\tests\sift.py:827 guiqwt\tests\sift.py:1002
-msgid "Clipping"
-msgstr ""
-
-#: guiqwt\tests\sift.py:870 guiqwt\tests\sift.py:926
-msgid "Mode"
-msgstr ""
-
-#: guiqwt\tests\sift.py:872 guiqwt\tests\sift.py:928
-msgid "cval"
-msgstr ""
-
-#: guiqwt\tests\sift.py:873 guiqwt\tests\sift.py:929
-msgid "Value used for points outside the boundaries of the input if mode is 'constant'"
-msgstr ""
-
-#: guiqwt\tests\sift.py:876
-msgid "Reshape the output array"
-msgstr ""
-
-#: guiqwt\tests\sift.py:877
-msgid "Reshape the output array so that the input array is contained completely in the output"
-msgstr ""
-
-#: guiqwt\tests\sift.py:880 guiqwt\tests\sift.py:932
-msgid "Prefilter the input image"
-msgstr ""
-
-#: guiqwt\tests\sift.py:882 guiqwt\tests\sift.py:934
-msgid "Order"
-msgstr ""
-
-#: guiqwt\tests\sift.py:883 guiqwt\tests\sift.py:935
-msgid "Spline interpolation order"
-msgstr ""
-
-#: guiqwt\tests\sift.py:913
-msgid "Warning:"
-msgstr ""
-
-#: guiqwt\tests\sift.py:919 guiqwt\tools.py:1556
-msgid "Destination size:"
-msgstr ""
-
-#: guiqwt\tests\sift.py:925
-msgid "Zoom"
-msgstr ""
-
-#: guiqwt\tests\sift.py:955
-msgid "First column index"
-msgstr ""
-
-#: guiqwt\tests\sift.py:956
-msgid "Last column index"
-msgstr ""
-
-#: guiqwt\tests\sift.py:993
-msgid "Threshold"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1000
-msgid "Clipping value"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1162
-msgid "Welcome to %s!"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1164
-msgid "Signal Processing Toolbar"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1165
-msgid "Image Processing Toolbar"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1168
-msgid "Curve Plotting Toolbar"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1177
-msgid "Image Visualization Toolbar"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1190
-msgid "Signals"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1192
-msgid "Images"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1193
-msgid "Main panel"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1196
-msgid "Curve plotting panel"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1198
-msgid "Image visualization panel"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1207 guiqwt\tests\simple_window.py:178
-msgid "Quit"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1209 guiqwt\tests\simple_window.py:181
-msgid "Quit application"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1211 guiqwt\tests\simple_window.py:167
-msgid "File"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1215
-msgid "&Edit"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1219
-msgid "Operations"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1223
-msgid "Processing"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1240
-msgid "Console"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1249
-msgid "&View"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1254 guiqwt\tests\simple_window.py:187
-msgid "About..."
-msgstr ""
-
-#: guiqwt\tests\sift.py:1313 guiqwt\tests\simple_window.py:202
-msgid "About "
-msgstr ""
-
-#: guiqwt\tests\sift.py:1317 guiqwt\tests\simple_window.py:206
-msgid "Developped by"
-msgstr ""
-
-#: guiqwt\tests\sift.py:1319 guiqwt\tests\simple_window.py:207
-msgid "on"
-msgstr ""
-
-#: guiqwt\tests\simple_dialog.py:28 guiqwt\tests\simple_window.py:42
-msgid "Image width (pixels)"
-msgstr ""
-
-#: guiqwt\tests\simple_dialog.py:29 guiqwt\tests\simple_window.py:45
-msgid "Image height (pixels)"
-msgstr ""
-
-#: guiqwt\tests\simple_dialog.py:33
-msgid "Filter algorithm"
-msgstr ""
-
-#: guiqwt\tests\simple_dialog.py:35
-msgid "gaussian filter"
-msgstr ""
-
-#: guiqwt\tests\simple_dialog.py:36
-msgid "uniform filter"
-msgstr ""
-
-#: guiqwt\tests\simple_dialog.py:37
-msgid "minimum filter"
-msgstr ""
-
-#: guiqwt\tests\simple_dialog.py:38
-msgid "median filter"
-msgstr ""
-
-#: guiqwt\tests\simple_dialog.py:39
-msgid "maximum filter"
-msgstr ""
-
-#: guiqwt\tests\simple_dialog.py:41
-msgid "Size or sigma"
-msgstr ""
-
-#: guiqwt\tests\simple_dialog.py:44
-msgid "Example dialog box"
-msgstr ""
-
-#: guiqwt\tests\simple_dialog.py:62
-msgid "Filter parameters"
-msgstr ""
-
-#: guiqwt\tests\simple_dialog.py:67
-msgid "Image parameters"
-msgstr ""
-
-#: guiqwt\tests\simple_dialog.py:70
-msgid "z-axis scale label"
-msgstr ""
-
-#: guiqwt\tests\simple_window.py:33
-msgid "Application example"
-msgstr ""
-
-#: guiqwt\tests\simple_window.py:164
-msgid "Welcome to guiqwt application example!"
-msgstr ""
-
-#: guiqwt\tests\simple_window.py:168
-msgid "New..."
-msgstr ""
-
-#: guiqwt\tests\simple_window.py:173 guiqwt\tools.py:1707
-msgid "Open..."
-msgstr ""
-
-#: guiqwt\tools.py:450
-msgid "Selection"
-msgstr ""
-
-#: guiqwt\tools.py:476
-msgid "Point selection"
-msgstr ""
-
-#: guiqwt\tools.py:559
-msgid "Polyline"
-msgstr ""
-
-#: guiqwt\tools.py:669
-msgid "Free form"
-msgstr ""
-
-#: guiqwt\tools.py:718
-msgid "Label text"
-msgstr ""
-
-#: guiqwt\tools.py:847
-msgid "Rectangle"
-msgstr ""
-
-#: guiqwt\tools.py:851
-msgid "Oblique rectangle"
-msgstr ""
-
-#: guiqwt\tools.py:860
-msgid "Point"
-msgstr ""
-
-#: guiqwt\tools.py:869
-msgid "Segment"
-msgstr ""
-
-#: guiqwt\tools.py:878
-msgid "Circle"
-msgstr ""
-
-#: guiqwt\tools.py:972
-msgid "Image statistics"
-msgstr ""
-
-#: guiqwt\tools.py:1067
-msgid "Average cross section"
-msgstr ""
-
-#: guiqwt\tools.py:1088
-msgid "Rectangle zoom"
-msgstr ""
-
-#: guiqwt\tools.py:1151
-msgid "Horizontal selection"
-msgstr ""
-
-#: guiqwt\tools.py:1158
-msgid "Vertical cursor"
-msgstr ""
-
-#: guiqwt\tools.py:1167
-msgid "Horizontal cursor"
-msgstr ""
-
-#: guiqwt\tools.py:1176
-msgid "Cross cursor"
-msgstr ""
-
-#: guiqwt\tools.py:1186
-msgid "Signal statistics"
-msgstr ""
-
-#: guiqwt\tools.py:1324
-msgid "Antialiasing (curves)"
-msgstr ""
-
-#: guiqwt\tools.py:1345
-msgid "Free"
-msgstr ""
-
-#: guiqwt\tools.py:1347
-msgid "Bound to active item"
-msgstr ""
-
-#: guiqwt\tools.py:1369
-msgid "Reverse Y axis"
-msgstr ""
-
-#: guiqwt\tools.py:1382
-msgid "Lock aspect ratio"
-msgstr ""
-
-#: guiqwt\tools.py:1383
-msgid "Current value"
-msgstr ""
-
-#: guiqwt\tools.py:1384
-msgid "Lock value"
-msgstr ""
-
-#: guiqwt\tools.py:1388 guiqwt\tools.py:1394
-msgid "Aspect ratio"
-msgstr ""
-
-#: guiqwt\tools.py:1396
-msgid "Lock"
-msgstr ""
-
-#: guiqwt\tools.py:1398
-msgid "1:1"
-msgstr ""
-
-#: guiqwt\tools.py:1400
-msgid "Edit..."
-msgstr ""
-
-#: guiqwt\tools.py:1472
-msgid "Contrast adjustment"
-msgstr ""
-
-#: guiqwt\tools.py:1485
-msgid "X-axis cross section"
-msgstr ""
-
-#: guiqwt\tools.py:1489
-msgid "Y-axis cross section"
-msgstr ""
-
-#: guiqwt\tools.py:1503
-msgid "Save as..."
-msgstr ""
-
-#: guiqwt\tools.py:1511
-msgid "PNG image"
-msgstr ""
-
-#: guiqwt\tools.py:1517
-msgid "PDF document"
-msgstr ""
-
-#: guiqwt\tools.py:1518 guiqwt\tools.py:1615 guiqwt\tools.py:1739
-msgid "untitled"
-msgstr ""
-
-#: guiqwt\tools.py:1525
-msgid "Copy to clipboard"
-msgstr ""
-
-#: guiqwt\tools.py:1545 guiqwt\tools.py:1578 guiqwt\tools.py:1645
-msgid "Rectangle snapshot"
-msgstr ""
-
-#: guiqwt\tools.py:1546
-msgid "There is no supported image item in current selection."
-msgstr ""
-
-#: guiqwt\tools.py:1563 guiqwt\tools.py:1570
-msgid "Image levels adjustments"
-msgstr ""
-
-#: guiqwt\tools.py:1564
-msgid "Apply contrast settings"
-msgstr ""
-
-#: guiqwt\tools.py:1566
-msgid "Apply interpolation algorithm"
-msgstr ""
-
-#: guiqwt\tools.py:1568
-msgid "Scale levels to maximum range"
-msgstr ""
-
-#: guiqwt\tools.py:1571 guiqwt\tools.py:1576
-msgid "Superimposed images"
-msgstr ""
-
-#: guiqwt\tools.py:1572
-msgid "If image B is behind image A, replace intersection by"
-msgstr ""
-
-#: guiqwt\tools.py:1604
-msgid "Memory error"
-msgstr ""
-
-#: guiqwt\tools.py:1605
-msgid "There is not enough memory left to process this %d x %d image (%d MB would be required)."
-msgstr ""
-
-#: guiqwt\tools.py:1659
-msgid "Rotate and crop"
-msgstr ""
-
-#: guiqwt\tools.py:1687
-msgid "Print..."
-msgstr ""
-
-#: guiqwt\tools.py:1734
-msgid "Save items"
-msgstr ""
-
-#: guiqwt\tools.py:1739
-msgid "Save items as"
-msgstr ""
-
-#: guiqwt\tools.py:1740
-msgid "guiqwt items"
-msgstr ""
-
-#: guiqwt\tools.py:1748
-msgid "Load items"
-msgstr ""
-
-#: guiqwt\tools.py:1764
-msgid "Open image"
-msgstr ""
-
-#: guiqwt\tools.py:1826 guiqwt\tools.py:1832
-msgid "Help"
-msgstr ""
-
-#: guiqwt\tools.py:1833
-msgid ""
-"Keyboard/mouse shortcuts:\n"
-"  - single left-click: item (curve, image, ...) selection\n"
-"  - single right-click: context-menu relative to selected item\n"
-"  - shift: on-active-curve (or image) cursor\n"
-"  - alt: free cursor\n"
-"  - left-click + mouse move: move item (when available)\n"
-"  - middle-click + mouse move: pan\n"
-"  - right-click + mouse move: zoom"
-msgstr ""
-
-#: guiqwt\tools.py:1892 guiqwt\tools.py:1900
-msgid "Export"
-msgstr ""
-
-#: guiqwt\tools.py:1895
-msgid "Text file"
-msgstr ""
-
-#: guiqwt\tools.py:1901
-msgid "Unable to export item data."
-msgstr ""
-
-#: guiqwt\tools.py:1902
-msgid "Error message:"
-msgstr ""
-
-#: guiqwt\tools.py:1911
-msgid "Export data..."
-msgstr ""
-
-#: guiqwt\tools.py:1954
-msgid "Edit data..."
-msgstr ""
-
-#: guiqwt\tools.py:1963
-msgid "Center items"
-msgstr ""
-
-#: guiqwt\tools.py:2033
-msgid "Select colormap for active image"
-msgstr ""
-
-#: guiqwt\tools.py:2102
-msgid "Manage image masking areas"
-msgstr ""
-
-#: guiqwt\tools.py:2111
-msgid "Mask rectangular area (inside)"
-msgstr ""
-
-#: guiqwt\tools.py:2116
-msgid "Mask rectangular area (outside)"
-msgstr ""
-
-#: guiqwt\tools.py:2121
-msgid "Mask circular area (inside)"
-msgstr ""
-
-#: guiqwt\tools.py:2126
-msgid "Mask circular area (outside)"
-msgstr ""
-
-#: guiqwt\tools.py:2132
-msgid "Show masking shapes"
-msgstr ""
-
-#: guiqwt\tools.py:2135
-msgid "Apply mask"
-msgstr ""
-
-#: guiqwt\tools.py:2138 guiqwt\tools.py:2262
-msgid "Clear mask"
-msgstr ""
-
-#: guiqwt\tools.py:2141 guiqwt\tools.py:2186
-msgid "Remove all masking shapes"
-msgstr ""
-
-#: guiqwt\tools.py:2184
-msgid "Do you really want to remove all masking shapes?"
-msgstr ""
-
-#: guiqwt\tools.py:2260
-msgid "Do you really want to clear the mask?"
-msgstr ""
-
-#: guiqwt\widgets\base.py:44
-msgid "Reset"
-msgstr ""
-
-#: guiqwt\widgets\base.py:53
-msgid "Apply"
-msgstr ""
-
-#: guiqwt\widgets\base.py:149
-msgid "Rotate & Crop"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:71
-msgid "Method"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:74
-msgid "Conjugate Gradient"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:75
-msgid "Least squares"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:78
-msgid "for simplex, powel, cg and bfgs norm used by the error function"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:81 guiqwt\widgets\fit.py:83
-msgid "for simplex, powel, least squares"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:84
-msgid "for cg, bfgs"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:86
-msgid "for cg, bfgs. inf is max, -inf is min"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:90
-msgid "Name"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:91
-msgid "Value"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:92
-msgid "Min"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:93
-msgid "Max"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:95
-msgid "Format"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:96
-msgid "Logarithmic"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:118
-msgid "Curve fitting parameter"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:135
-msgid "Edit '%s' fit parameter properties"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:257
-msgid "Curve fitting"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:296
-msgid "Fit parameters"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:329
-msgid "Automatic fitting options"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:359
-msgid "Run"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:361
-msgid "Settings"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:372
-msgid "Automatic fit"
-msgstr ""
-
-#: guiqwt\widgets\fit.py:422
-msgid "Fit"
-msgstr ""
-
-#: guiqwt\widgets\fliprotate.py:50
-msgid "Angle (°):"
-msgstr ""
-
-#: guiqwt\widgets\fliprotate.py:61
-msgid "Flip:"
-msgstr ""
-
-#: guiqwt\widgets\resizedialog.py:77
-msgid "Original size"
-msgstr ""
-
-#: guiqwt\widgets\resizedialog.py:79
-msgid "Width (pixels)"
-msgstr ""
-
-#: guiqwt\widgets\resizedialog.py:80
-msgid "Height (pixels)"
-msgstr ""
-
-#: guiqwt\widgets\resizedialog.py:83
-msgid "Original size:"
-msgstr ""
-
-#: guiqwt\widgets\resizedialog.py:85
-msgid "Zoom factor:"
-msgstr ""
-
-#: guiqwt\widgets\rotatecrop.py:49
-msgid "Show cropping rectangle"
-msgstr ""
-
-#: guiqwt\widgets\rotatecrop.py:59
-msgid "Cropping rectangle"
-msgstr ""
-
diff --git a/guiqwt/tests/contrast.png b/guiqwt/tests/contrast.png
deleted file mode 100644
index c60f1a9..0000000
Binary files a/guiqwt/tests/contrast.png and /dev/null differ
diff --git a/guiqwt/tests/dicom_image.py b/guiqwt/tests/dicom_image.py
index 6c41ae2..ac90436 100644
--- a/guiqwt/tests/dicom_image.py
+++ b/guiqwt/tests/dicom_image.py
@@ -1,41 +1,41 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2015 CEA
-# Pierre Raybaut
-# Licensed under the terms of the CECILL License
-# (see guiqwt/__init__.py for details)
-
-"""DICOM image test
-
-Requires pydicom (>=0.9.3)"""
-
-SHOW = True  # Show test in GUI-based test launcher
-
-import os.path as osp
-import guidata
-from guiqwt.plot import ImageDialog
-from guiqwt.builder import make
-
-
-def test():
-    filename = osp.join(osp.dirname(__file__), "mr-brain.dcm")
-    image = make.image(filename=filename, title="DICOM img", colormap="gray")
-    win = ImageDialog(
-        edit=False,
-        toolbar=True,
-        wintitle="DICOM I/O test",
-        options=dict(show_contrast=True),
-    )
-    plot = win.get_plot()
-    plot.add_item(image)
-    plot.select_item(image)
-    contrast = win.get_contrast_panel()
-    contrast.histogram.eliminate_outliers(54.0)
-    win.resize(600, 700)
-    return win
-
-
-if __name__ == "__main__":
-    _app = guidata.qapplication()
-    win = test()
-    win.exec_()
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2015 CEA
+# Pierre Raybaut
+# Licensed under the terms of the CECILL License
+# (see guiqwt/__init__.py for details)
+
+"""DICOM image test
+
+Requires pydicom (>=0.9.3)"""
+
+SHOW = True  # Show test in GUI-based test launcher
+
+import os.path as osp
+import guidata
+from guiqwt.plot import ImageDialog
+from guiqwt.builder import make
+
+
+def test():
+    filename = osp.join(osp.dirname(__file__), "mr-brain.dcm")
+    image = make.image(filename=filename, title="DICOM img", colormap="gray")
+    win = ImageDialog(
+        edit=False,
+        toolbar=True,
+        wintitle="DICOM I/O test",
+        options=dict(show_contrast=True),
+    )
+    plot = win.get_plot()
+    plot.add_item(image)
+    plot.select_item(image)
+    contrast = win.get_contrast_panel()
+    contrast.histogram.eliminate_outliers(54.0)
+    win.resize(600, 700)
+    return win
+
+
+if __name__ == "__main__":
+    _app = guidata.qapplication()
+    win = test()
+    win.exec_()
diff --git a/guiqwt/tests/dotarraydemo.py b/guiqwt/tests/dotarraydemo.py
index 1136175..4a4fb0c 100644
--- a/guiqwt/tests/dotarraydemo.py
+++ b/guiqwt/tests/dotarraydemo.py
@@ -1,181 +1,181 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2016 CEA
-# Pierre Raybaut
-# Licensed under the terms of the CECILL License
-# (see guiqwt/__init__.py for details)
-
-"""
-Dot array example
-=================
-
-Example showing how to create a custom item (drawing dots of variable size) 
-and integrate the associated `guidata` dataset (GUI-based form) to edit its 
-parameters (directly into the same window as the plot itself, *and* within 
-the custom item parameters: right-click on the selectable item to open the 
-associated dialog box).
-"""
-
-SHOW = True  # Show test in GUI-based test launcher
-
-import numpy as np
-
-import qtpy.QtCore as QC
-import qtpy.QtWidgets as QW
-import qtpy.QtGui as QG
-
-import guidata.dataset.datatypes as gdt
-import guidata.dataset.dataitems as gdi
-import guidata.dataset.qtwidgets as gdq
-import guidata.configtools as configtools
-
-import guiqwt.plot as gqp
-import guiqwt.curve as gqc
-import guiqwt.image as gqi
-import guiqwt.tools as gqt
-
-
-class DotArrayParam(gdt.DataSet):
-    """Dot array"""
-
-    g1 = gdt.BeginGroup("Size of the area")
-    dim_h = gdi.FloatItem("Width", default=20, min=0, unit="mm")
-    dim_v = gdi.FloatItem("Height", default=20, min=0, unit="mm")
-    _g1 = gdt.EndGroup("Size of the area")
-
-    g2 = gdt.BeginGroup("Grid pattern properties")
-    step_x = gdi.FloatItem("Step in X-axis", default=1, min=1, unit="mm")
-    step_y = gdi.FloatItem("Step in Y-axis", default=1, min=1, unit="mm")
-    size = gdi.FloatItem("Dot size", default=0.2, min=0, max=2, slider=True, unit="mm")
-    color = gdi.ColorItem("Dot color", default="red")
-    _g2 = gdt.EndGroup("Grid pattern properties")
-
-    def update_image(self, obj):
-        self._update_cb()
-
-    def update_param(self, obj):
-        pass
-
-
-class DotArrayItem(gqi.RawImageItem):
-    def __init__(self, imageparam=None):
-        super(DotArrayItem, self).__init__(np.zeros((1, 1)), imageparam)
-        self.update_border()
-
-    def boundingRect(self):
-        param = self.imageparam
-        if param is not None:
-            return QC.QRectF(
-                QC.QPointF(-0.5 * param.size, -0.5 * param.size),
-                QC.QPointF(
-                    param.dim_h + 0.5 * param.size, param.dim_v + 0.5 * param.size
-                ),
-            )
-
-    def types(self):
-        return (gqi.IImageItemType,)
-
-    def draw_image(self, painter, canvasRect, srcRect, dstRect, xMap, yMap):
-        painter.setRenderHint(QG.QPainter.Antialiasing, True)
-        param = self.imageparam
-        xcoords = gqc.vmap(xMap, np.arange(0, param.dim_h + 1, param.step_x))
-        ycoords = gqc.vmap(yMap, np.arange(0, param.dim_v + 1, param.step_y))
-        rx = 0.5 * param.size * xMap.pDist() / xMap.sDist()
-        ry = 0.5 * param.size * yMap.pDist() / yMap.sDist()
-        color = QG.QColor(param.color)
-        painter.setPen(QG.QPen(color))
-        painter.setBrush(QG.QBrush(color))
-        for xc in xcoords:
-            for yc in ycoords:
-                painter.drawEllipse(QC.QPointF(xc, yc), rx, ry)
-
-
-class CustomHelpTool(gqt.HelpTool):
-    def activate_command(self, plot, checked):
-        QtGui.QMessageBox.information(
-            plot,
-            "Help",
-            """**to be customized**
-Keyboard/mouse shortcuts:
-  - single left-click: item (curve, image, ...) selection
-  - single right-click: context-menu relative to selected item
-  - shift: on-active-curve (or image) cursor
-  - alt: free cursor
-  - left-click + mouse move: move item (when available)
-  - middle-click + mouse move: pan
-  - right-click + mouse move: zoom""",
-        )
-
-
-class DotArrayDialog(gqp.ImageDialog):
-    def __init__(self):
-        self.item = None
-        self.stamp_gbox = None
-        super(DotArrayDialog, self).__init__(
-            wintitle="Dot array example",
-            #            icon="path/to/your_icon.png",
-            toolbar=True,
-            edit=True,
-        )
-        self.resize(900, 600)
-
-    def register_tools(self):
-        self.register_standard_tools()
-        self.add_separator_tool()
-        self.add_tool(gqt.SaveAsTool)
-        self.add_tool(gqt.CopyToClipboardTool)
-        self.add_tool(gqt.PrintTool)
-        self.add_tool(CustomHelpTool)
-        self.activate_default_tool()
-        plot = self.get_plot()
-        plot.enableAxis(plot.yRight, False)
-        plot.set_aspect_ratio(lock=True)
-
-    def create_plot(self, options):
-        logo_path = configtools.get_image_file_path("guiqwt.svg")
-        logo = QW.QLabel()
-        logo.setPixmap(QG.QPixmap(logo_path))
-        logo.setAlignment(QC.Qt.AlignCenter)
-        self.plot_layout.addWidget(logo, 1, 1)
-        logo_txt = QW.QLabel("Powered by <b>guiqwt</b>")
-        logo_txt.setAlignment(QC.Qt.AlignHCenter | QC.Qt.AlignTop)
-        self.plot_layout.addWidget(logo_txt, 2, 1)
-        self.stamp_gbox = gdq.DataSetEditGroupBox("Dots", DotArrayParam)
-        try:
-            # guiqwt v3:
-            self.stamp_gbox.SIG_APPLY_BUTTON_CLICKED.connect(self.apply_params)
-        except AttributeError:
-            # guiqwt v2:
-            from qtpy.QtCore import SIGNAL
-
-            self.connect(
-                self.stamp_gbox, SIGNAL("apply_button_clicked()"), self.apply_params
-            )
-        self.plot_layout.addWidget(self.stamp_gbox, 0, 1)
-        options = dict(title="Main plot")
-        gqp.ImageDialog.create_plot(self, options, 0, 0, 3, 1)
-
-    def show_data(self, param):
-        plot = self.get_plot()
-        if self.item is None:
-            param._update_cb = lambda: self.stamp_gbox.get()
-            self.item = DotArrayItem(param)
-            plot.add_item(self.item)
-        else:
-            self.item.update_border()
-        plot.do_autoscale()
-
-    def apply_params(self):
-        param = self.stamp_gbox.dataset
-        self.show_data(param)
-
-
-if __name__ == "__main__":
-    # -- Create QApplication
-    import guidata
-
-    _app = guidata.qapplication()
-
-    dlg = DotArrayDialog()
-    dlg.apply_params()
-    dlg.exec_()
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2016 CEA
+# Pierre Raybaut
+# Licensed under the terms of the CECILL License
+# (see guiqwt/__init__.py for details)
+
+"""
+Dot array example
+=================
+
+Example showing how to create a custom item (drawing dots of variable size) 
+and integrate the associated `guidata` dataset (GUI-based form) to edit its 
+parameters (directly into the same window as the plot itself, *and* within 
+the custom item parameters: right-click on the selectable item to open the 
+associated dialog box).
+"""
+
+SHOW = True  # Show test in GUI-based test launcher
+
+import numpy as np
+
+import qtpy.QtCore as QC
+import qtpy.QtWidgets as QW
+import qtpy.QtGui as QG
+
+import guidata.dataset.datatypes as gdt
+import guidata.dataset.dataitems as gdi
+import guidata.dataset.qtwidgets as gdq
+import guidata.configtools as configtools
+
+import guiqwt.plot as gqp
+import guiqwt.curve as gqc
+import guiqwt.image as gqi
+import guiqwt.tools as gqt
+
+
+class DotArrayParam(gdt.DataSet):
+    """Dot array"""
+
+    g1 = gdt.BeginGroup("Size of the area")
+    dim_h = gdi.FloatItem("Width", default=20, min=0, unit="mm")
+    dim_v = gdi.FloatItem("Height", default=20, min=0, unit="mm")
+    _g1 = gdt.EndGroup("Size of the area")
+
+    g2 = gdt.BeginGroup("Grid pattern properties")
+    step_x = gdi.FloatItem("Step in X-axis", default=1, min=1, unit="mm")
+    step_y = gdi.FloatItem("Step in Y-axis", default=1, min=1, unit="mm")
+    size = gdi.FloatItem("Dot size", default=0.2, min=0, max=2, slider=True, unit="mm")
+    color = gdi.ColorItem("Dot color", default="red")
+    _g2 = gdt.EndGroup("Grid pattern properties")
+
+    def update_image(self, obj):
+        self._update_cb()
+
+    def update_param(self, obj):
+        pass
+
+
+class DotArrayItem(gqi.RawImageItem):
+    def __init__(self, imageparam=None):
+        super(DotArrayItem, self).__init__(np.zeros((1, 1)), imageparam)
+        self.update_border()
+
+    def boundingRect(self):
+        param = self.imageparam
+        if param is not None:
+            return QC.QRectF(
+                QC.QPointF(-0.5 * param.size, -0.5 * param.size),
+                QC.QPointF(
+                    param.dim_h + 0.5 * param.size, param.dim_v + 0.5 * param.size
+                ),
+            )
+
+    def types(self):
+        return (gqi.IImageItemType,)
+
+    def draw_image(self, painter, canvasRect, srcRect, dstRect, xMap, yMap):
+        painter.setRenderHint(QG.QPainter.Antialiasing, True)
+        param = self.imageparam
+        xcoords = gqc.vmap(xMap, np.arange(0, param.dim_h + 1, param.step_x))
+        ycoords = gqc.vmap(yMap, np.arange(0, param.dim_v + 1, param.step_y))
+        rx = 0.5 * param.size * xMap.pDist() / xMap.sDist()
+        ry = 0.5 * param.size * yMap.pDist() / yMap.sDist()
+        color = QG.QColor(param.color)
+        painter.setPen(QG.QPen(color))
+        painter.setBrush(QG.QBrush(color))
+        for xc in xcoords:
+            for yc in ycoords:
+                painter.drawEllipse(QC.QPointF(xc, yc), rx, ry)
+
+
+class CustomHelpTool(gqt.HelpTool):
+    def activate_command(self, plot, checked):
+        QtGui.QMessageBox.information(
+            plot,
+            "Help",
+            """**to be customized**
+Keyboard/mouse shortcuts:
+  - single left-click: item (curve, image, ...) selection
+  - single right-click: context-menu relative to selected item
+  - shift: on-active-curve (or image) cursor
+  - alt: free cursor
+  - left-click + mouse move: move item (when available)
+  - middle-click + mouse move: pan
+  - right-click + mouse move: zoom""",
+        )
+
+
+class DotArrayDialog(gqp.ImageDialog):
+    def __init__(self):
+        self.item = None
+        self.stamp_gbox = None
+        super(DotArrayDialog, self).__init__(
+            wintitle="Dot array example",
+            #            icon="path/to/your_icon.png",
+            toolbar=True,
+            edit=True,
+        )
+        self.resize(900, 600)
+
+    def register_tools(self):
+        self.register_standard_tools()
+        self.add_separator_tool()
+        self.add_tool(gqt.SaveAsTool)
+        self.add_tool(gqt.CopyToClipboardTool)
+        self.add_tool(gqt.PrintTool)
+        self.add_tool(CustomHelpTool)
+        self.activate_default_tool()
+        plot = self.get_plot()
+        plot.enableAxis(plot.yRight, False)
+        plot.set_aspect_ratio(lock=True)
+
+    def create_plot(self, options):
+        logo_path = configtools.get_image_file_path("guiqwt.svg")
+        logo = QW.QLabel()
+        logo.setPixmap(QG.QPixmap(logo_path))
+        logo.setAlignment(QC.Qt.AlignCenter)
+        self.plot_layout.addWidget(logo, 1, 1)
+        logo_txt = QW.QLabel("Powered by <b>guiqwt</b>")
+        logo_txt.setAlignment(QC.Qt.AlignHCenter | QC.Qt.AlignTop)
+        self.plot_layout.addWidget(logo_txt, 2, 1)
+        self.stamp_gbox = gdq.DataSetEditGroupBox("Dots", DotArrayParam)
+        try:
+            # guiqwt v3:
+            self.stamp_gbox.SIG_APPLY_BUTTON_CLICKED.connect(self.apply_params)
+        except AttributeError:
+            # guiqwt v2:
+            from qtpy.QtCore import SIGNAL
+
+            self.connect(
+                self.stamp_gbox, SIGNAL("apply_button_clicked()"), self.apply_params
+            )
+        self.plot_layout.addWidget(self.stamp_gbox, 0, 1)
+        options = dict(title="Main plot")
+        gqp.ImageDialog.create_plot(self, options, 0, 0, 3, 1)
+
+    def show_data(self, param):
+        plot = self.get_plot()
+        if self.item is None:
+            param._update_cb = lambda: self.stamp_gbox.get()
+            self.item = DotArrayItem(param)
+            plot.add_item(self.item)
+        else:
+            self.item.update_border()
+        plot.do_autoscale()
+
+    def apply_params(self):
+        param = self.stamp_gbox.dataset
+        self.show_data(param)
+
+
+if __name__ == "__main__":
+    # -- Create QApplication
+    import guidata
+
+    _app = guidata.qapplication()
+
+    dlg = DotArrayDialog()
+    dlg.apply_params()
+    dlg.exec_()
diff --git a/guiqwt/tests/loadtest.py b/guiqwt/tests/loadtest.py
index 46d04b2..6037516 100644
--- a/guiqwt/tests/loadtest.py
+++ b/guiqwt/tests/loadtest.py
@@ -1,85 +1,85 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2009-2021 CEA
-# Pierre Raybaut
-# Licensed under the terms of the CECILL License
-# (see guiqwt/__init__.py for details)
-
-"""Load test: instantiating a large number of image widgets"""
-
-SHOW = True  # Show test in GUI-based test launcher
-
-# import cProfile
-# from pstats import Stats
-from qtpy.QtWidgets import QApplication, QMainWindow, QWidget, QTabWidget, QGridLayout
-import numpy as np
-
-from guidata.qthelpers import win32_fix_title_bar_background
-from guiqwt.plot import ImageWidget
-from guiqwt.builder import make
-
-
-class PlotTab(QWidget):
-    def __init__(self):
-        super().__init__()
-        layout = QGridLayout()
-        self.setLayout(layout)
-
-    def add_plot(self, iplt, irow, icol):
-        widget = ImageWidget(self, "Plot #%d" % (iplt + 1))
-        widget.setMinimumSize(200, 150)
-        xdata = np.linspace(-10, 10)
-        ydata = np.sin(xdata + np.random.randint(0, 100) * 0.01 * np.pi)
-        curve_item = make.curve(xdata, ydata, color="b")
-        widget.plot.add_item(curve_item)
-        self.layout().addWidget(widget, irow, icol, 1, 1)
-
-
-class LoadTest(QMainWindow):
-    def __init__(self, nplots=150, ncols=6, nrows=5):
-        super().__init__()
-        win32_fix_title_bar_background(self)
-        self.tabw = QTabWidget()
-        self.setCentralWidget(self.tabw)
-        irow, icol, itab = 0, 0, 0
-        add_tab_at_next_step = True
-        for iplt in range(nplots):
-            if add_tab_at_next_step:
-                plottab = self.add_tab(itab)
-                add_tab_at_next_step = False
-            plottab.add_plot(iplt, irow, icol)
-            icol += 1
-            if icol == ncols:
-                icol = 0
-                irow += 1
-                if irow == nrows:
-                    irow = 0
-                    itab += 1
-                    add_tab_at_next_step = True
-                    self.refresh()
-
-    def add_tab(self, itab):
-        plottab = PlotTab()
-        self.tabw.addTab(plottab, "Tab #%d" % (itab + 1))
-        return plottab
-
-    def refresh(self):
-        """Force window to show up and refresh (for test purpose only)"""
-        self.show()
-        QApplication.processEvents()
-
-
-if __name__ == "__main__":
-    app = QApplication([])
-    # import time
-    # t0 = time.time()
-    # with cProfile.Profile() as pr:
-    win = LoadTest(nplots=60, ncols=6, nrows=5)
-    app.exec_()
-    # print((time.time() - t0))
-    # with open('profiling_stats.txt', 'w') as stream:
-    #     stats = Stats(pr, stream=stream)
-    #     stats.strip_dirs()
-    #     stats.sort_stats('cumulative')
-    #     stats.dump_stats('.prof_stats')
-    #     stats.print_stats()
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2009-2021 CEA
+# Pierre Raybaut
+# Licensed under the terms of the CECILL License
+# (see guiqwt/__init__.py for details)
+
+"""Load test: instantiating a large number of image widgets"""
+
+SHOW = True  # Show test in GUI-based test launcher
+
+# import cProfile
+# from pstats import Stats
+from qtpy.QtWidgets import QApplication, QMainWindow, QWidget, QTabWidget, QGridLayout
+import numpy as np
+
+from guidata.qthelpers import win32_fix_title_bar_background
+from guiqwt.plot import ImageWidget
+from guiqwt.builder import make
+
+
+class PlotTab(QWidget):
+    def __init__(self):
+        super().__init__()
+        layout = QGridLayout()
+        self.setLayout(layout)
+
+    def add_plot(self, iplt, irow, icol):
+        widget = ImageWidget(self, "Plot #%d" % (iplt + 1))
+        widget.setMinimumSize(200, 150)
+        xdata = np.linspace(-10, 10)
+        ydata = np.sin(xdata + np.random.randint(0, 100) * 0.01 * np.pi)
+        curve_item = make.curve(xdata, ydata, color="b")
+        widget.plot.add_item(curve_item)
+        self.layout().addWidget(widget, irow, icol, 1, 1)
+
+
+class LoadTest(QMainWindow):
+    def __init__(self, nplots=150, ncols=6, nrows=5):
+        super().__init__()
+        win32_fix_title_bar_background(self)
+        self.tabw = QTabWidget()
+        self.setCentralWidget(self.tabw)
+        irow, icol, itab = 0, 0, 0
+        add_tab_at_next_step = True
+        for iplt in range(nplots):
+            if add_tab_at_next_step:
+                plottab = self.add_tab(itab)
+                add_tab_at_next_step = False
+            plottab.add_plot(iplt, irow, icol)
+            icol += 1
+            if icol == ncols:
+                icol = 0
+                irow += 1
+                if irow == nrows:
+                    irow = 0
+                    itab += 1
+                    add_tab_at_next_step = True
+                    self.refresh()
+
+    def add_tab(self, itab):
+        plottab = PlotTab()
+        self.tabw.addTab(plottab, "Tab #%d" % (itab + 1))
+        return plottab
+
+    def refresh(self):
+        """Force window to show up and refresh (for test purpose only)"""
+        self.show()
+        QApplication.processEvents()
+
+
+if __name__ == "__main__":
+    app = QApplication([])
+    # import time
+    # t0 = time.time()
+    # with cProfile.Profile() as pr:
+    win = LoadTest(nplots=60, ncols=6, nrows=5)
+    app.exec_()
+    # print((time.time() - t0))
+    # with open('profiling_stats.txt', 'w') as stream:
+    #     stats = Stats(pr, stream=stream)
+    #     stats.strip_dirs()
+    #     stats.sort_stats('cumulative')
+    #     stats.dump_stats('.prof_stats')
+    #     stats.print_stats()
diff --git a/guiqwt/tests/png_test.py b/guiqwt/tests/png_test.py
index ebc1f4a..b240583 100644
--- a/guiqwt/tests/png_test.py
+++ b/guiqwt/tests/png_test.py
@@ -1,25 +1,25 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2020 Pierre Raybaut
-
-"""PNG icons test (finding unsupported ICC profile Qt warnings)"""
-
-SHOW = False  # Do not show test in GUI-based test launcher
-
-import sys
-import os
-import os.path as osp
-import guiqwt.config  # Loading guiqwt icon paths
-from guidata.configtools import get_icon, IMG_PATH
-from guidata import qapplication
-
-app = qapplication()
-
-# get_icon("expander_down.png")
-# get_icon("trash.png")
-
-for path in IMG_PATH:
-    for name in os.listdir(path):
-        full_path = osp.abspath(osp.join(path, name))
-        # print(full_path, file=sys.stderr)
-        get_icon(name)
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2020 Pierre Raybaut
+
+"""PNG icons test (finding unsupported ICC profile Qt warnings)"""
+
+SHOW = False  # Do not show test in GUI-based test launcher
+
+import sys
+import os
+import os.path as osp
+import guiqwt.config  # Loading guiqwt icon paths
+from guidata.configtools import get_icon, IMG_PATH
+from guidata import qapplication
+
+app = qapplication()
+
+# get_icon("expander_down.png")
+# get_icon("trash.png")
+
+for path in IMG_PATH:
+    for name in os.listdir(path):
+        full_path = osp.abspath(osp.join(path, name))
+        # print(full_path, file=sys.stderr)
+        get_icon(name)
diff --git a/guiqwt/tests/qtdesigner.ui b/guiqwt/tests/qtdesigner.ui
index 85a620f..f2560fb 100644
--- a/guiqwt/tests/qtdesigner.ui
+++ b/guiqwt/tests/qtdesigner.ui
@@ -1,42 +1,42 @@
-<ui version="4.0" >
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog" >
-  <property name="geometry" >
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>500</width>
-    <height>800</height>
-   </rect>
-  </property>
-  <property name="windowTitle" >
-   <string>Dialog</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout" >
-   <item>
-    <widget class="ImageWidget" name="imagewidget" >
-     <property name="orientation" >
-      <enum>Qt::Vertical</enum>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="CurveWidget" name="curvewidget" />
-   </item>
-  </layout>
- </widget>
- <customwidgets>
-  <customwidget>
-   <class>ImageWidget</class>
-   <extends>CurveWidget</extends>
-   <header>guiqwt.plot</header>
-  </customwidget>
-  <customwidget>
-   <class>CurveWidget</class>
-   <extends>QwtPlot</extends>
-   <header>guiqwt.plot</header>
-  </customwidget>
- </customwidgets>
- <resources/>
- <connections/>
-</ui>
+<ui version="4.0" >
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+  <property name="geometry" >
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>500</width>
+    <height>800</height>
+   </rect>
+  </property>
+  <property name="windowTitle" >
+   <string>Dialog</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout" >
+   <item>
+    <widget class="ImageWidget" name="imagewidget" >
+     <property name="orientation" >
+      <enum>Qt::Vertical</enum>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="CurveWidget" name="curvewidget" />
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>ImageWidget</class>
+   <extends>CurveWidget</extends>
+   <header>guiqwt.plot</header>
+  </customwidget>
+  <customwidget>
+   <class>CurveWidget</class>
+   <extends>QwtPlot</extends>
+   <header>guiqwt.plot</header>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/guiqwt/tests/sift.py b/guiqwt/tests/sift.py
index a47a18f..7bc3b00 100644
--- a/guiqwt/tests/sift.py
+++ b/guiqwt/tests/sift.py
@@ -167,7 +167,10 @@ class ImageParam(DataSet):
         self.metadata = {}
         for attr_str in dir(value):
             if attr_str != "GroupLength":
-                self.metadata[attr_str] = getattr(value, attr_str)
+                try:
+                    self.metadata[attr_str] = getattr(value, attr_str)
+                except AttributeError:
+                    pass
 
     @property
     def template(self):
@@ -1332,13 +1335,11 @@ class ImageFT(ObjectFT):
             image.title = filename
             image.data = data
             if osp.splitext(filename)[1].lower() == ".dcm":
-                try:
-                    # pydicom 1.0
-                    from pydicom import dicomio
-                except ImportError:
-                    # pydicom 0.9
-                    import dicom as dicomio
-                image.template = dicomio.read_file(filename, stop_before_pixels=True)
+                from pydicom import dicomio
+
+                image.template = dicomio.read_file(
+                    filename, stop_before_pixels=True, force=True
+                )
             self.add_object(image)
 
     def save_image(self):
diff --git a/guiqwt/tests/test.png b/guiqwt/tests/test.png
deleted file mode 100644
index 157e0df..0000000
Binary files a/guiqwt/tests/test.png and /dev/null differ
diff --git a/guiqwt/tests/test1.u8.png b/guiqwt/tests/test1.u8.png
deleted file mode 100644
index 39d3ac8..0000000
Binary files a/guiqwt/tests/test1.u8.png and /dev/null differ
diff --git a/guiqwt/tests/test2.u8.png b/guiqwt/tests/test2.u8.png
deleted file mode 100644
index 8768bf0..0000000
Binary files a/guiqwt/tests/test2.u8.png and /dev/null differ
diff --git a/guiqwt/tools.py b/guiqwt/tools.py
index 7ec9791..0de0285 100644
--- a/guiqwt/tools.py
+++ b/guiqwt/tools.py
@@ -1858,7 +1858,7 @@ def save_snapshot(plot, p0, p1, new_size=None):
         else:
             data = np.array(data, dtype=dtype)
     except MemoryError:
-        mbytes = int(destw * desth * 32.0 / (8 * 1024 ** 2))
+        mbytes = int(destw * desth * 32.0 / (8 * 1024**2))
         QMessageBox.critical(
             plot,
             _("Memory error"),
@@ -1888,12 +1888,8 @@ def save_snapshot(plot, p0, p1, new_size=None):
     elif ext.lower() == ".png":
         options.update(dict(dtype=np.uint8, max_range=True))
     elif ext.lower() == ".dcm":
-        try:
-            # pydicom 1.0
-            from pydicom import dicomio
-        except ImportError:
-            # pydicom 0.9
-            import dicom as dicomio
+        from pydicom import dicomio
+
         model_dcm = dicomio.read_file(model_fname)
         try:
             ps_attr = "ImagerPixelSpacing"
diff --git a/img_src/guiqwt.pdn b/img_src/guiqwt.pdn
deleted file mode 100644
index 57cb2f1..0000000
Binary files a/img_src/guiqwt.pdn and /dev/null differ
diff --git a/img_src/panorama.pdn b/img_src/panorama.pdn
deleted file mode 100644
index 9061c21..0000000
Binary files a/img_src/panorama.pdn and /dev/null differ
diff --git a/img_src/panorama2.pdn b/img_src/panorama2.pdn
deleted file mode 100644
index a0bdf63..0000000
Binary files a/img_src/panorama2.pdn and /dev/null differ
diff --git a/private.hgtags b/private.hgtags
deleted file mode 100644
index 0a80ab5..0000000
--- a/private.hgtags
+++ /dev/null
@@ -1,80 +0,0 @@
-Contents of private guiqwt repository .hgtags:
-
-9f046fb36ce09b826d95cdbd9359feaa37abba36 v1.0.0
-9f046fb36ce09b826d95cdbd9359feaa37abba36 v1.0.0
-8284d9b732787e6fe4006f6bb47655c4d46686ed v1.0.0
-8284d9b732787e6fe4006f6bb47655c4d46686ed v1.0.0
-1c633d705e8dd2ff28061f375c5ea01ce7017af3 v1.0.0
-bf23a1b5dc51a63eb7a0abab3fb7afc7f62b593e v2.0.0
-4f8c047b475d5f8f650ca5a60ae063deed0dee7e v2.0.1
-4f8c047b475d5f8f650ca5a60ae063deed0dee7e v2.0.1
-a4da37fb8e71b6d3b55bb5f3c348199d7ae623fe v2.0.1
-a4da37fb8e71b6d3b55bb5f3c348199d7ae623fe v2.0.1
-3d9d194c7c2589d36249c3a710f90217854e282b v2.0.1
-85d408f0bcb3b2c2a1ea7e6e92c3e4db4948cba4 v2.0.2
-f311540026325c9a1409b694fcbf3fb8bd4437dd v2.0.3
-f311540026325c9a1409b694fcbf3fb8bd4437dd v2.0.3
-f311540026325c9a1409b694fcbf3fb8bd4437dd v2.0.3
-82a36e5a60bb89d9e7867d400236e621ad69c25c v2.0.4
-82a36e5a60bb89d9e7867d400236e621ad69c25c v2.0.4
-b98c4891e6749602d77cc85e26d861edf7febc86 v2.0.4
-5916c736337752e1748ccd58a18b302e86e682b4 v2.0.5
-1c89bc835e0ae6d8de4e37f45c0a1b0bf902289b v2.0.6
-1c89bc835e0ae6d8de4e37f45c0a1b0bf902289b v2.0.6
-f2d59c59f6e28d5640c504ae59968f142d097d5a v2.0.6
-96350969cec72042b5ad3ee0ae8f168ed752cd95 v2.0.7
-96350969cec72042b5ad3ee0ae8f168ed752cd95 v2.0.7
-148616d8e4599a68849adcc944ef362d4476601d v2.0.7
-e777d30f648fc8aa4258b8077e1c8d08677bab9b v2.0.7.1
-31847b4646eac80a3286b52b4fbdb7efe9ed42ab v2.0.7.2
-dd3856c826af96d5830e7882f1b7f680b528c52d v2.0.7.3
-dd3856c826af96d5830e7882f1b7f680b528c52d v2.0.7.3
-caf31bd674d17c82a64d281e706606548a769fb0 v2.0.7.3
-2ac4a41ea4c72bcf38357eec9ab1405026586ded v2.0.8
-2ac4a41ea4c72bcf38357eec9ab1405026586ded v2.0.8
-9a207587e595f5bdc880f8e892952e156b058ef6 v2.0.8
-9a207587e595f5bdc880f8e892952e156b058ef6 v2.0.8
-1642cbf11ba42e5a1b319631b46b410cfdd5505a v2.0.8
-a03f5a26083dc1f0b53864bf5598584afbd72218 v2.1.0
-a03f5a26083dc1f0b53864bf5598584afbd72218 v2.1.0
-873fedfe1bd3e4f820c696b8e81ceab23fc2ca3e v2.1.0
-873fedfe1bd3e4f820c696b8e81ceab23fc2ca3e v2.1.0
-6f562c75f6fa2f5dbeb2c3f4fa1f2b4ddff7a7a2 v2.1.0
-6f562c75f6fa2f5dbeb2c3f4fa1f2b4ddff7a7a2 v2.1.0
-c01dc5d50bebc80e750033af53bad22e9bb0ee4e v2.1.0
-c01dc5d50bebc80e750033af53bad22e9bb0ee4e v2.1.0
-caaaea5c5dd5189193d124a6835b7c35e0cab386 v2.1.0
-caaaea5c5dd5189193d124a6835b7c35e0cab386 v2.1.0
-3dd8f6d8efcd780a74653257564bfe8517833484 v2.1.0
-9de0c103090ad01818d1669b3cb0e2d221090a0e v2.0.8.1
-935aa91ddc402f5a9868ed25e9cefa0b5f86b66b v2.1.1
-935aa91ddc402f5a9868ed25e9cefa0b5f86b66b v2.1.1
-6c9bd8b256048dc51fc670dbda7f2a2268dae3ed v2.1.1
-6c9bd8b256048dc51fc670dbda7f2a2268dae3ed v2.1.1
-9c18fd7509a552ed98c99591ec5025259e2b9fd0 v2.1.1
-9c18fd7509a552ed98c99591ec5025259e2b9fd0 v2.1.1
-f20ec470f761d8619872a6ad747710966c7fb50e v2.1.1
-77f9dd996dffb373400fca378d6a2db379fba1d8 v2.1.2
-1844ab1567b941fe0ebc9b1dea821e475506c5e5 v2.1.3
-1844ab1567b941fe0ebc9b1dea821e475506c5e5 v2.1.3
-f9f86d64a78961cb61bcb798adfde7e76494b2a4 v2.1.3
-f9f86d64a78961cb61bcb798adfde7e76494b2a4 v2.1.3
-34f6becb7920cb3bc5e611ebf0c0cc301c4dab9d v2.1.3
-4c0ed5541330911fa81853179902cd21e0be1be7 v2.1.4beta1
-4c0ed5541330911fa81853179902cd21e0be1be7 v2.1.4beta1
-b591964356a5911d31649a52c07f3e6c094c8414 v2.1.4beta1
-1585488b1c4e9dbdbe53cd12f4546b05a70ae068 v2.1.4beta2
-6ca0b9cc431b38a78985e6cdf401deddee03cc0b v2.1.4
-6ca0b9cc431b38a78985e6cdf401deddee03cc0b v2.1.4
-1161fe476de4af9fb66d6b1c08c5ece99dcff497 v2.1.4
-1161fe476de4af9fb66d6b1c08c5ece99dcff497 v2.1.4
-51e9aea7b6f1f77e08a769b7ba9733d79050bab6 v2.1.4
-7ba70ad8a4f139ee1a3a1398d34e082e5ebfb4f7 v2.1.5
-7ba70ad8a4f139ee1a3a1398d34e082e5ebfb4f7 v2.1.5
-d3d3cbd59be9021f763a4c37d2f75dea439d3cac v2.1.5
-0d3cc6b4cd344ef1febb09b4b1fc6a06eda71467 v2.1.6
-338bad30019a555a610b0f064d964411bf986933 v2.1.7
-338bad30019a555a610b0f064d964411bf986933 v2.1.7
-7a52fb67b80d2df656d5271b146f841b091373a0 v2.1.7
-7a52fb67b80d2df656d5271b146f841b091373a0 v2.1.7
-eb66f11085b7372f7dfab5a722661f00e3946a2e v2.1.7
diff --git a/qtdesigner/imageplotplugin.py b/qtdesigner/imageplotplugin.py
index c076500..c045f8b 100644
--- a/qtdesigner/imageplotplugin.py
+++ b/qtdesigner/imageplotplugin.py
@@ -1,17 +1,17 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2009-2010 CEA
-# Pierre Raybaut
-# Licensed under the terms of the CECILL License
-# (see guiqwt/__init__.py for details)
-
-"""
-imageplotplugin
-===============
-
-A guiqwt image widget plugin for Qt Designer
-"""
-
-from guiqwt.qtdesigner import create_qtdesigner_plugin
-Plugin = create_qtdesigner_plugin("guiqwt", "guiqwt.plot", "ImageWidget",
-                                  icon="image.png")
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2009-2010 CEA
+# Pierre Raybaut
+# Licensed under the terms of the CECILL License
+# (see guiqwt/__init__.py for details)
+
+"""
+imageplotplugin
+===============
+
+A guiqwt image widget plugin for Qt Designer
+"""
+
+from guiqwt.qtdesigner import create_qtdesigner_plugin
+Plugin = create_qtdesigner_plugin("guiqwt", "guiqwt.plot", "ImageWidget",
+                                  icon="image.png")
diff --git a/qtdesigner/plotplugin.py b/qtdesigner/plotplugin.py
index 57bd1e8..8c4ee05 100644
--- a/qtdesigner/plotplugin.py
+++ b/qtdesigner/plotplugin.py
@@ -1,17 +1,17 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2009-2010 CEA
-# Pierre Raybaut
-# Licensed under the terms of the CECILL License
-# (see guiqwt/__init__.py for details)
-
-"""
-plotplugin
-==========
-
-A guiqwt plot widget plugin for Qt Designer
-"""
-
-from guiqwt.qtdesigner import create_qtdesigner_plugin
-Plugin = create_qtdesigner_plugin("guiqwt", "guiqwt.plot", "CurveWidget",
-                                  icon="curve.png")
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2009-2010 CEA
+# Pierre Raybaut
+# Licensed under the terms of the CECILL License
+# (see guiqwt/__init__.py for details)
+
+"""
+plotplugin
+==========
+
+A guiqwt plot widget plugin for Qt Designer
+"""
+
+from guiqwt.qtdesigner import create_qtdesigner_plugin
+Plugin = create_qtdesigner_plugin("guiqwt", "guiqwt.plot", "CurveWidget",
+                                  icon="curve.png")
diff --git a/run_test_launcher.bat b/run_test_launcher.bat
deleted file mode 100755
index 6e3a030..0000000
--- a/run_test_launcher.bat
+++ /dev/null
@@ -1,14 +0,0 @@
-REM This code was copied from PythonQwt project (license: MIT, copyright Pierre Raybaut)
-@echo off
-setlocal
-set PYTHONPATH=%cd%\..\PythonQwt;%cd%\..\guidata;%cd%
-if defined WINPYDIRBASE (
-    call %WINPYDIRBASE%\scripts\env.bat
-    @echo ==============================================================================
-    @echo:
-    @echo Using WinPython from %WINPYDIRBASE%
-    @echo:
-    @echo ==============================================================================
-    @echo:
-    )
-python -m guiqwt.tests.__init__
\ No newline at end of file
diff --git a/setup.cfg b/setup.cfg
index 4927abe..8bfd5a1 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,4 +1,4 @@
-[egg_info]
-tag_build = 
-tag_date = 0
-
+[egg_info]
+tag_build = 
+tag_date = 0
+
diff --git a/sift/sift.pyw b/sift/sift.pyw
index 7712a1f..38ab0a7 100644
--- a/sift/sift.pyw
+++ b/sift/sift.pyw
@@ -1,3 +1,3 @@
-#!/usr/bin/env python
-from guiqwt.tests import sift
+#!/usr/bin/env python
+from guiqwt.tests import sift
 sift.run()
\ No newline at end of file
diff --git a/src/histogram2d.c b/src/histogram2d.c
index aa55893..0ad0846 100644
--- a/src/histogram2d.c
+++ b/src/histogram2d.c
@@ -1,14 +1,16 @@
-/* Generated by Cython 0.29.21 */
+/* Generated by Cython 0.29.28 */
 
+#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_21"
-#define CYTHON_HEX_VERSION 0x001D15F0
+#define CYTHON_ABI "0_29_28"
+#define CYTHON_HEX_VERSION 0x001D1CF0
 #define CYTHON_FUTURE_DIVISION 0
 #include <stddef.h>
 #ifndef offsetof
@@ -155,7 +157,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 +172,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 < 0x030B00A1)
   #endif
   #ifndef CYTHON_PEP489_MULTI_PHASE_INIT
     #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000)
@@ -185,7 +190,10 @@
   #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
 #endif
@@ -193,7 +201,9 @@
 #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
@@ -310,9 +320,68 @@
   #define __Pyx_DefaultClassType PyClass_Type
 #else
   #define __Pyx_BUILTIN_MODULE_NAME "builtins"
-#if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2
-  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
-          PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
+  #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)
@@ -426,8 +495,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)
@@ -436,7 +509,11 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
   #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
@@ -542,10 +619,10 @@ 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) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func))
@@ -608,6 +685,9 @@ static CYTHON_INLINE float __PYX_NAN() {
 #include <string.h>
 #include <stdio.h>
 #include "numpy/arrayobject.h"
+#include "numpy/ndarrayobject.h"
+#include "numpy/ndarraytypes.h"
+#include "numpy/arrayscalars.h"
 #include "numpy/ufuncobject.h"
 
     /* NumPy API declarations from "numpy/__init__.pxd" */
@@ -709,6 +789,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
@@ -843,7 +924,7 @@ static const char *__pyx_filename;
 
 
 static const char *__pyx_f[] = {
-  "src\\histogram2d.pyx",
+  "src/histogram2d.pyx",
   "__init__.pxd",
   "type.pxd",
 };
@@ -884,7 +965,7 @@ typedef struct {
 } __Pyx_BufFmt_Context;
 
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":697
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":690
  * # in Cython to enable them only on the right systems.
  * 
  * ctypedef npy_int8       int8_t             # <<<<<<<<<<<<<<
@@ -893,7 +974,7 @@ typedef struct {
  */
 typedef npy_int8 __pyx_t_5numpy_int8_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":698
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":691
  * 
  * ctypedef npy_int8       int8_t
  * ctypedef npy_int16      int16_t             # <<<<<<<<<<<<<<
@@ -902,7 +983,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t;
  */
 typedef npy_int16 __pyx_t_5numpy_int16_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":699
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":692
  * ctypedef npy_int8       int8_t
  * ctypedef npy_int16      int16_t
  * ctypedef npy_int32      int32_t             # <<<<<<<<<<<<<<
@@ -911,7 +992,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t;
  */
 typedef npy_int32 __pyx_t_5numpy_int32_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":700
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":693
  * ctypedef npy_int16      int16_t
  * ctypedef npy_int32      int32_t
  * ctypedef npy_int64      int64_t             # <<<<<<<<<<<<<<
@@ -920,7 +1001,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t;
  */
 typedef npy_int64 __pyx_t_5numpy_int64_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":704
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":697
  * #ctypedef npy_int128     int128_t
  * 
  * ctypedef npy_uint8      uint8_t             # <<<<<<<<<<<<<<
@@ -929,7 +1010,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t;
  */
 typedef npy_uint8 __pyx_t_5numpy_uint8_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":705
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":698
  * 
  * ctypedef npy_uint8      uint8_t
  * ctypedef npy_uint16     uint16_t             # <<<<<<<<<<<<<<
@@ -938,7 +1019,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t;
  */
 typedef npy_uint16 __pyx_t_5numpy_uint16_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":706
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":699
  * ctypedef npy_uint8      uint8_t
  * ctypedef npy_uint16     uint16_t
  * ctypedef npy_uint32     uint32_t             # <<<<<<<<<<<<<<
@@ -947,7 +1028,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t;
  */
 typedef npy_uint32 __pyx_t_5numpy_uint32_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":707
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":700
  * ctypedef npy_uint16     uint16_t
  * ctypedef npy_uint32     uint32_t
  * ctypedef npy_uint64     uint64_t             # <<<<<<<<<<<<<<
@@ -956,7 +1037,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t;
  */
 typedef npy_uint64 __pyx_t_5numpy_uint64_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":711
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":704
  * #ctypedef npy_uint128    uint128_t
  * 
  * ctypedef npy_float32    float32_t             # <<<<<<<<<<<<<<
@@ -965,7 +1046,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t;
  */
 typedef npy_float32 __pyx_t_5numpy_float32_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":712
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":705
  * 
  * ctypedef npy_float32    float32_t
  * ctypedef npy_float64    float64_t             # <<<<<<<<<<<<<<
@@ -974,7 +1055,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t;
  */
 typedef npy_float64 __pyx_t_5numpy_float64_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":721
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":714
  * # The int types are mapped a bit surprising --
  * # numpy.int corresponds to 'l' and numpy.long to 'q'
  * ctypedef npy_long       int_t             # <<<<<<<<<<<<<<
@@ -983,7 +1064,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t;
  */
 typedef npy_long __pyx_t_5numpy_int_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":722
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":715
  * # numpy.int corresponds to 'l' and numpy.long to 'q'
  * ctypedef npy_long       int_t
  * ctypedef npy_longlong   long_t             # <<<<<<<<<<<<<<
@@ -992,7 +1073,7 @@ typedef npy_long __pyx_t_5numpy_int_t;
  */
 typedef npy_longlong __pyx_t_5numpy_long_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":723
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":716
  * ctypedef npy_long       int_t
  * ctypedef npy_longlong   long_t
  * ctypedef npy_longlong   longlong_t             # <<<<<<<<<<<<<<
@@ -1001,7 +1082,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t;
  */
 typedef npy_longlong __pyx_t_5numpy_longlong_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":725
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":718
  * ctypedef npy_longlong   longlong_t
  * 
  * ctypedef npy_ulong      uint_t             # <<<<<<<<<<<<<<
@@ -1010,7 +1091,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t;
  */
 typedef npy_ulong __pyx_t_5numpy_uint_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":726
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":719
  * 
  * ctypedef npy_ulong      uint_t
  * ctypedef npy_ulonglong  ulong_t             # <<<<<<<<<<<<<<
@@ -1019,7 +1100,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t;
  */
 typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":727
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":720
  * ctypedef npy_ulong      uint_t
  * ctypedef npy_ulonglong  ulong_t
  * ctypedef npy_ulonglong  ulonglong_t             # <<<<<<<<<<<<<<
@@ -1028,7 +1109,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
  */
 typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":729
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":722
  * ctypedef npy_ulonglong  ulonglong_t
  * 
  * ctypedef npy_intp       intp_t             # <<<<<<<<<<<<<<
@@ -1037,7 +1118,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;
  */
 typedef npy_intp __pyx_t_5numpy_intp_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":730
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":723
  * 
  * ctypedef npy_intp       intp_t
  * ctypedef npy_uintp      uintp_t             # <<<<<<<<<<<<<<
@@ -1046,7 +1127,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t;
  */
 typedef npy_uintp __pyx_t_5numpy_uintp_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":732
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":725
  * ctypedef npy_uintp      uintp_t
  * 
  * ctypedef npy_double     float_t             # <<<<<<<<<<<<<<
@@ -1055,7 +1136,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t;
  */
 typedef npy_double __pyx_t_5numpy_float_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":733
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":726
  * 
  * ctypedef npy_double     float_t
  * ctypedef npy_double     double_t             # <<<<<<<<<<<<<<
@@ -1064,7 +1145,7 @@ typedef npy_double __pyx_t_5numpy_float_t;
  */
 typedef npy_double __pyx_t_5numpy_double_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":734
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":727
  * ctypedef npy_double     float_t
  * ctypedef npy_double     double_t
  * ctypedef npy_longdouble longdouble_t             # <<<<<<<<<<<<<<
@@ -1099,7 +1180,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do
 
 /*--- Type declarations ---*/
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":736
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":729
  * ctypedef npy_longdouble longdouble_t
  * 
  * ctypedef npy_cfloat      cfloat_t             # <<<<<<<<<<<<<<
@@ -1108,7 +1189,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do
  */
 typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":737
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":730
  * 
  * ctypedef npy_cfloat      cfloat_t
  * ctypedef npy_cdouble     cdouble_t             # <<<<<<<<<<<<<<
@@ -1117,7 +1198,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
  */
 typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":738
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":731
  * ctypedef npy_cfloat      cfloat_t
  * ctypedef npy_cdouble     cdouble_t
  * ctypedef npy_clongdouble clongdouble_t             # <<<<<<<<<<<<<<
@@ -1126,7 +1207,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
  */
 typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":740
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":733
  * ctypedef npy_clongdouble clongdouble_t
  * 
  * ctypedef npy_cdouble     complex_t             # <<<<<<<<<<<<<<
@@ -1286,77 +1367,6 @@ static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject
 #define __Pyx_ErrFetch(type, value, tb)  PyErr_Fetch(type, value, tb)
 #endif
 
-/* DictGetItem.proto */
-#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY
-static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key);
-#define __Pyx_PyObject_Dict_GetItem(obj, name)\
-    (likely(PyDict_CheckExact(obj)) ?\
-     __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name))
-#else
-#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key)
-#define __Pyx_PyObject_Dict_GetItem(obj, name)  PyObject_GetItem(obj, name)
-#endif
-
-/* RaiseTooManyValuesToUnpack.proto */
-static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
-
-/* RaiseNeedMoreValuesToUnpack.proto */
-static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
-
-/* RaiseNoneIterError.proto */
-static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);
-
-/* ExtTypeTest.proto */
-static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type);
-
-/* PyObjectCall.proto */
-#if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw);
-#else
-#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw)
-#endif
-
-/* RaiseException.proto */
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause);
-
-/* PyCFunctionFastCall.proto */
-#if CYTHON_FAST_PYCCALL
-static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs);
-#else
-#define __Pyx_PyCFunction_FastCall(func, args, nargs)  (assert(0), NULL)
-#endif
-
-/* PyFunctionFastCall.proto */
-#if CYTHON_FAST_PYCALL
-#define __Pyx_PyFunction_FastCall(func, args, nargs)\
-    __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL)
-#if 1 || PY_VERSION_HEX < 0x030600B1
-static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs);
-#else
-#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs)
-#endif
-#define __Pyx_BUILD_ASSERT_EXPR(cond)\
-    (sizeof(char [1 - 2*!(cond)]) - 1)
-#ifndef Py_MEMBER_SIZE
-#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member)
-#endif
-  static size_t __pyx_pyframe_localsplus_offset = 0;
-  #include "frameobject.h"
-  #define __Pxy_PyFrame_Initialize_Offsets()\
-    ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\
-     (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus)))
-  #define __Pyx_PyFrame_GetLocalsplus(frame)\
-    (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset))
-#endif
-
-/* PyObjectCallMethO.proto */
-#if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg);
-#endif
-
-/* PyObjectCallOneArg.proto */
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg);
-
 /* GetTopmostException.proto */
 #if CYTHON_USE_EXC_INFO_STACK
 static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate);
@@ -1389,6 +1399,16 @@ static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject
 static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb);
 #endif
 
+/* PyObjectCall.proto */
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw);
+#else
+#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw)
+#endif
+
+/* RaiseException.proto */
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause);
+
 /* TypeImport.proto */
 #ifndef __PYX_HAVE_RT_ImportType_proto
 #define __PYX_HAVE_RT_ImportType_proto
@@ -1475,8 +1495,10 @@ typedef struct {
 #endif
 
 
-/* CIntToPy.proto */
-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value);
+/* GCCDiagnostics.proto */
+#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
+#define __Pyx_HAS_GCC_DIAGNOSTIC
+#endif
 
 /* RealImag.proto */
 #if CYTHON_CCOMPLEX
@@ -1576,15 +1598,12 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value)
     #endif
 #endif
 
-/* CIntToPy.proto */
-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value);
-
-/* CIntToPy.proto */
-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value);
-
 /* CIntFromPy.proto */
 static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *);
 
+/* CIntToPy.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value);
+
 /* CIntFromPy.proto */
 static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *);
 
@@ -1642,8 +1661,17 @@ static PyTypeObject *__pyx_ptype_5numpy_dtype = 0;
 static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0;
 static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0;
 static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0;
+static PyTypeObject *__pyx_ptype_5numpy_generic = 0;
+static PyTypeObject *__pyx_ptype_5numpy_number = 0;
+static PyTypeObject *__pyx_ptype_5numpy_integer = 0;
+static PyTypeObject *__pyx_ptype_5numpy_signedinteger = 0;
+static PyTypeObject *__pyx_ptype_5numpy_unsignedinteger = 0;
+static PyTypeObject *__pyx_ptype_5numpy_inexact = 0;
+static PyTypeObject *__pyx_ptype_5numpy_floating = 0;
+static PyTypeObject *__pyx_ptype_5numpy_complexfloating = 0;
+static PyTypeObject *__pyx_ptype_5numpy_flexible = 0;
+static PyTypeObject *__pyx_ptype_5numpy_character = 0;
 static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0;
-static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/
 
 /* Module declarations from 'libc.math' */
 
@@ -1657,8 +1685,6 @@ int __pyx_module_is_main_histogram2d = 0;
 
 /* Implementation of 'histogram2d' */
 static PyObject *__pyx_builtin_range;
-static PyObject *__pyx_builtin_RuntimeError;
-static PyObject *__pyx_builtin_ValueError;
 static PyObject *__pyx_builtin_ImportError;
 static const char __pyx_k_X[] = "X";
 static const char __pyx_k_Y[] = "Y";
@@ -1686,27 +1712,16 @@ static const char __pyx_k_test[] = "__test__";
 static const char __pyx_k_range[] = "range";
 static const char __pyx_k_data_tmp[] = "data_tmp";
 static const char __pyx_k_logscale[] = "logscale";
-static const char __pyx_k_ValueError[] = "ValueError";
 static const char __pyx_k_ImportError[] = "ImportError";
 static const char __pyx_k_computation[] = "computation";
 static const char __pyx_k_histogram2d[] = "histogram2d";
-static const char __pyx_k_RuntimeError[] = "RuntimeError";
 static const char __pyx_k_histogram2d_func[] = "histogram2d_func";
 static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback";
-static const char __pyx_k_src_histogram2d_pyx[] = "src\\histogram2d.pyx";
+static const char __pyx_k_src_histogram2d_pyx[] = "src/histogram2d.pyx";
 static const char __pyx_k_2D_Histogram_algorithm[] = "2D-Histogram algorithm";
 static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import";
-static const char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)";
-static const char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd";
-static const char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported";
 static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import";
-static const char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short.";
-static PyObject *__pyx_kp_u_Format_string_allocated_too_shor;
-static PyObject *__pyx_kp_u_Format_string_allocated_too_shor_2;
 static PyObject *__pyx_n_s_ImportError;
-static PyObject *__pyx_kp_u_Non_native_byte_order_not_suppor;
-static PyObject *__pyx_n_s_RuntimeError;
-static PyObject *__pyx_n_s_ValueError;
 static PyObject *__pyx_n_s_X;
 static PyObject *__pyx_n_s_Y;
 static PyObject *__pyx_n_s_Z;
@@ -1739,19 +1754,15 @@ static PyObject *__pyx_n_s_range;
 static PyObject *__pyx_kp_s_src_histogram2d_pyx;
 static PyObject *__pyx_n_s_test;
 static PyObject *__pyx_n_s_u;
-static PyObject *__pyx_kp_u_unknown_dtype_code_in_numpy_pxd;
 static PyObject *__pyx_n_s_v;
 static PyObject *__pyx_pf_11histogram2d_histogram2d(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_Y, double __pyx_v_i0, double __pyx_v_i1, double __pyx_v_j0, double __pyx_v_j1, PyArrayObject *__pyx_v_data, PyObject *__pyx_v_logscale); /* proto */
 static PyObject *__pyx_pf_11histogram2d_2histogram2d_func(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_Y, PyArrayObject *__pyx_v_Z, double __pyx_v_i0, double __pyx_v_i1, double __pyx_v_j0, double __pyx_v_j1, PyArrayObject *__pyx_v_data_tmp, PyArrayObject *__pyx_v_data, int __pyx_v_computation); /* proto */
 static PyObject *__pyx_tuple_;
 static PyObject *__pyx_tuple__2;
 static PyObject *__pyx_tuple__3;
-static PyObject *__pyx_tuple__4;
 static PyObject *__pyx_tuple__5;
-static PyObject *__pyx_tuple__6;
-static PyObject *__pyx_tuple__8;
-static PyObject *__pyx_codeobj__7;
-static PyObject *__pyx_codeobj__9;
+static PyObject *__pyx_codeobj__4;
+static PyObject *__pyx_codeobj__6;
 /* Late includes */
 
 /* "histogram2d.pyx":14
@@ -3058,7 +3069,7 @@ static PyObject *__pyx_pf_11histogram2d_2histogram2d_func(CYTHON_UNUSED PyObject
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":742
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":735
  * ctypedef npy_cdouble     complex_t
  * 
  * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
@@ -3075,7 +3086,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":743
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":736
  * 
  * cdef inline object PyArray_MultiIterNew1(a):
  *     return PyArray_MultiIterNew(1, <void*>a)             # <<<<<<<<<<<<<<
@@ -3083,13 +3094,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
  * cdef inline object PyArray_MultiIterNew2(a, b):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 743, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 736, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":742
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":735
  * ctypedef npy_cdouble     complex_t
  * 
  * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
@@ -3108,7 +3119,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":745
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":738
  *     return PyArray_MultiIterNew(1, <void*>a)
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
@@ -3125,7 +3136,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":746
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":739
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):
  *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)             # <<<<<<<<<<<<<<
@@ -3133,13 +3144,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
  * cdef inline object PyArray_MultiIterNew3(a, b, c):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 746, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 739, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":745
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":738
  *     return PyArray_MultiIterNew(1, <void*>a)
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
@@ -3158,7 +3169,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":748
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":741
  *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
@@ -3175,7 +3186,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":749
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":742
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):
  *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)             # <<<<<<<<<<<<<<
@@ -3183,13 +3194,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 749, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 742, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":748
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":741
  *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
@@ -3208,7 +3219,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":751
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":744
  *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
@@ -3225,7 +3236,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":752
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":745
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
  *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)             # <<<<<<<<<<<<<<
@@ -3233,13 +3244,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 752, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 745, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":751
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":744
  *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
@@ -3258,7 +3269,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":754
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":747
  *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
@@ -3275,7 +3286,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":755
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":748
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
  *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)             # <<<<<<<<<<<<<<
@@ -3283,13 +3294,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 755, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 748, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":754
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":747
  *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
@@ -3308,7 +3319,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":757
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":750
  *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):             # <<<<<<<<<<<<<<
@@ -3322,7 +3333,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":758
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":751
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  *     if PyDataType_HASSUBARRAY(d):             # <<<<<<<<<<<<<<
@@ -3332,7 +3343,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
   __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0);
   if (__pyx_t_1) {
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":759
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":752
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  *     if PyDataType_HASSUBARRAY(d):
  *         return <tuple>d.subarray.shape             # <<<<<<<<<<<<<<
@@ -3344,7 +3355,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
     __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape);
     goto __pyx_L0;
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":758
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":751
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  *     if PyDataType_HASSUBARRAY(d):             # <<<<<<<<<<<<<<
@@ -3353,12 +3364,12 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
  */
   }
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":761
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":754
  *         return <tuple>d.subarray.shape
  *     else:
  *         return ()             # <<<<<<<<<<<<<<
  * 
- * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:
+ * 
  */
   /*else*/ {
     __Pyx_XDECREF(__pyx_r);
@@ -3367,7 +3378,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
     goto __pyx_L0;
   }
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":757
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":750
  *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):             # <<<<<<<<<<<<<<
@@ -3382,756 +3393,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":763
- *         return ()
- * 
- * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<
- *     # Recursive utility function used in __getbuffer__ to get format
- *     # string. The new location in the format string is returned.
- */
-
-static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) {
-  PyArray_Descr *__pyx_v_child = 0;
-  int __pyx_v_endian_detector;
-  int __pyx_v_little_endian;
-  PyObject *__pyx_v_fields = 0;
-  PyObject *__pyx_v_childname = NULL;
-  PyObject *__pyx_v_new_offset = NULL;
-  PyObject *__pyx_v_t = NULL;
-  char *__pyx_r;
-  __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  Py_ssize_t __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  long __pyx_t_8;
-  char *__pyx_t_9;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("_util_dtypestring", 0);
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":768
- * 
- *     cdef dtype child
- *     cdef int endian_detector = 1             # <<<<<<<<<<<<<<
- *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)
- *     cdef tuple fields
- */
-  __pyx_v_endian_detector = 1;
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":769
- *     cdef dtype child
- *     cdef int endian_detector = 1
- *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
- *     cdef tuple fields
- * 
- */
-  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":772
- *     cdef tuple fields
- * 
- *     for childname in descr.names:             # <<<<<<<<<<<<<<
- *         fields = descr.fields[childname]
- *         child, new_offset = fields
- */
-  if (unlikely(__pyx_v_descr->names == Py_None)) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
-    __PYX_ERR(1, 772, __pyx_L1_error)
-  }
-  __pyx_t_1 = __pyx_v_descr->names; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
-  for (;;) {
-    if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-    #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
-    __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(1, 772, __pyx_L1_error)
-    #else
-    __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 772, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_3);
-    #endif
-    __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3);
-    __pyx_t_3 = 0;
-
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":773
- * 
- *     for childname in descr.names:
- *         fields = descr.fields[childname]             # <<<<<<<<<<<<<<
- *         child, new_offset = fields
- * 
- */
-    if (unlikely(__pyx_v_descr->fields == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
-      __PYX_ERR(1, 773, __pyx_L1_error)
-    }
-    __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 773, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_3);
-    if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_3)->tp_name), 0))) __PYX_ERR(1, 773, __pyx_L1_error)
-    __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3));
-    __pyx_t_3 = 0;
-
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":774
- *     for childname in descr.names:
- *         fields = descr.fields[childname]
- *         child, new_offset = fields             # <<<<<<<<<<<<<<
- * 
- *         if (end - f) - <int>(new_offset - offset[0]) < 15:
- */
-    if (likely(__pyx_v_fields != Py_None)) {
-      PyObject* sequence = __pyx_v_fields;
-      Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
-      if (unlikely(size != 2)) {
-        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-        __PYX_ERR(1, 774, __pyx_L1_error)
-      }
-      #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
-      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
-      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); 
-      __Pyx_INCREF(__pyx_t_3);
-      __Pyx_INCREF(__pyx_t_4);
-      #else
-      __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 774, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 774, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      #endif
-    } else {
-      __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 774, __pyx_L1_error)
-    }
-    if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) __PYX_ERR(1, 774, __pyx_L1_error)
-    __Pyx_XDECREF_SET(__pyx_v_child, ((PyArray_Descr *)__pyx_t_3));
-    __pyx_t_3 = 0;
-    __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4);
-    __pyx_t_4 = 0;
-
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":776
- *         child, new_offset = fields
- * 
- *         if (end - f) - <int>(new_offset - offset[0]) < 15:             # <<<<<<<<<<<<<<
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
- * 
- */
-    __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 776, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 776, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 776, __pyx_L1_error)
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0);
-    if (unlikely(__pyx_t_6)) {
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":777
- * 
- *         if (end - f) - <int>(new_offset - offset[0]) < 15:
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")             # <<<<<<<<<<<<<<
- * 
- *         if ((child.byteorder == c'>' and little_endian) or
- */
-      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 777, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __PYX_ERR(1, 777, __pyx_L1_error)
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":776
- *         child, new_offset = fields
- * 
- *         if (end - f) - <int>(new_offset - offset[0]) < 15:             # <<<<<<<<<<<<<<
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
- * 
- */
-    }
-
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":779
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
- * 
- *         if ((child.byteorder == c'>' and little_endian) or             # <<<<<<<<<<<<<<
- *             (child.byteorder == c'<' and not little_endian)):
- *             raise ValueError(u"Non-native byte order not supported")
- */
-    __pyx_t_7 = ((__pyx_v_child->byteorder == '>') != 0);
-    if (!__pyx_t_7) {
-      goto __pyx_L8_next_or;
-    } else {
-    }
-    __pyx_t_7 = (__pyx_v_little_endian != 0);
-    if (!__pyx_t_7) {
-    } else {
-      __pyx_t_6 = __pyx_t_7;
-      goto __pyx_L7_bool_binop_done;
-    }
-    __pyx_L8_next_or:;
-
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":780
- * 
- *         if ((child.byteorder == c'>' and little_endian) or
- *             (child.byteorder == c'<' and not little_endian)):             # <<<<<<<<<<<<<<
- *             raise ValueError(u"Non-native byte order not supported")
- *             # One could encode it in the format string and have Cython
- */
-    __pyx_t_7 = ((__pyx_v_child->byteorder == '<') != 0);
-    if (__pyx_t_7) {
-    } else {
-      __pyx_t_6 = __pyx_t_7;
-      goto __pyx_L7_bool_binop_done;
-    }
-    __pyx_t_7 = ((!(__pyx_v_little_endian != 0)) != 0);
-    __pyx_t_6 = __pyx_t_7;
-    __pyx_L7_bool_binop_done:;
-
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":779
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
- * 
- *         if ((child.byteorder == c'>' and little_endian) or             # <<<<<<<<<<<<<<
- *             (child.byteorder == c'<' and not little_endian)):
- *             raise ValueError(u"Non-native byte order not supported")
- */
-    if (unlikely(__pyx_t_6)) {
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":781
- *         if ((child.byteorder == c'>' and little_endian) or
- *             (child.byteorder == c'<' and not little_endian)):
- *             raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
- *             # One could encode it in the format string and have Cython
- *             # complain instead, BUT: < and > in format strings also imply
- */
-      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 781, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __PYX_ERR(1, 781, __pyx_L1_error)
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":779
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
- * 
- *         if ((child.byteorder == c'>' and little_endian) or             # <<<<<<<<<<<<<<
- *             (child.byteorder == c'<' and not little_endian)):
- *             raise ValueError(u"Non-native byte order not supported")
- */
-    }
-
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":791
- * 
- *         # Output padding bytes
- *         while offset[0] < new_offset:             # <<<<<<<<<<<<<<
- *             f[0] = 120 # "x"; pad byte
- *             f += 1
- */
-    while (1) {
-      __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 791, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 791, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 791, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (!__pyx_t_6) break;
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":792
- *         # Output padding bytes
- *         while offset[0] < new_offset:
- *             f[0] = 120 # "x"; pad byte             # <<<<<<<<<<<<<<
- *             f += 1
- *             offset[0] += 1
- */
-      (__pyx_v_f[0]) = 0x78;
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":793
- *         while offset[0] < new_offset:
- *             f[0] = 120 # "x"; pad byte
- *             f += 1             # <<<<<<<<<<<<<<
- *             offset[0] += 1
- * 
- */
-      __pyx_v_f = (__pyx_v_f + 1);
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":794
- *             f[0] = 120 # "x"; pad byte
- *             f += 1
- *             offset[0] += 1             # <<<<<<<<<<<<<<
- * 
- *         offset[0] += child.itemsize
- */
-      __pyx_t_8 = 0;
-      (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1);
-    }
-
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":796
- *             offset[0] += 1
- * 
- *         offset[0] += child.itemsize             # <<<<<<<<<<<<<<
- * 
- *         if not PyDataType_HASFIELDS(child):
- */
-    __pyx_t_8 = 0;
-    (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize);
-
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":798
- *         offset[0] += child.itemsize
- * 
- *         if not PyDataType_HASFIELDS(child):             # <<<<<<<<<<<<<<
- *             t = child.type_num
- *             if end - f < 5:
- */
-    __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0);
-    if (__pyx_t_6) {
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":799
- * 
- *         if not PyDataType_HASFIELDS(child):
- *             t = child.type_num             # <<<<<<<<<<<<<<
- *             if end - f < 5:
- *                 raise RuntimeError(u"Format string allocated too short.")
- */
-      __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 799, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4);
-      __pyx_t_4 = 0;
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":800
- *         if not PyDataType_HASFIELDS(child):
- *             t = child.type_num
- *             if end - f < 5:             # <<<<<<<<<<<<<<
- *                 raise RuntimeError(u"Format string allocated too short.")
- * 
- */
-      __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0);
-      if (unlikely(__pyx_t_6)) {
-
-        /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":801
- *             t = child.type_num
- *             if end - f < 5:
- *                 raise RuntimeError(u"Format string allocated too short.")             # <<<<<<<<<<<<<<
- * 
- *             # Until ticket #99 is fixed, use integers to avoid warnings
- */
-        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 801, __pyx_L1_error)
-        __Pyx_GOTREF(__pyx_t_4);
-        __Pyx_Raise(__pyx_t_4, 0, 0, 0);
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        __PYX_ERR(1, 801, __pyx_L1_error)
-
-        /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":800
- *         if not PyDataType_HASFIELDS(child):
- *             t = child.type_num
- *             if end - f < 5:             # <<<<<<<<<<<<<<
- *                 raise RuntimeError(u"Format string allocated too short.")
- * 
- */
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":804
- * 
- *             # Until ticket #99 is fixed, use integers to avoid warnings
- *             if   t == NPY_BYTE:        f[0] =  98 #"b"             # <<<<<<<<<<<<<<
- *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"
- */
-      __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_BYTE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 804, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 804, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 804, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 98;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":805
- *             # Until ticket #99 is fixed, use integers to avoid warnings
- *             if   t == NPY_BYTE:        f[0] =  98 #"b"
- *             elif t == NPY_UBYTE:       f[0] =  66 #"B"             # <<<<<<<<<<<<<<
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"
- */
-      __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UBYTE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 805, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 805, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 805, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 66;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":806
- *             if   t == NPY_BYTE:        f[0] =  98 #"b"
- *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"             # <<<<<<<<<<<<<<
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"
- *             elif t == NPY_INT:         f[0] = 105 #"i"
- */
-      __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_SHORT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 806, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 806, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 806, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 0x68;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":807
- *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"             # <<<<<<<<<<<<<<
- *             elif t == NPY_INT:         f[0] = 105 #"i"
- *             elif t == NPY_UINT:        f[0] =  73 #"I"
- */
-      __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_USHORT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 807, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 807, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 807, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 72;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":808
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"
- *             elif t == NPY_INT:         f[0] = 105 #"i"             # <<<<<<<<<<<<<<
- *             elif t == NPY_UINT:        f[0] =  73 #"I"
- *             elif t == NPY_LONG:        f[0] = 108 #"l"
- */
-      __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_INT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 808, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 808, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 808, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 0x69;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":809
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"
- *             elif t == NPY_INT:         f[0] = 105 #"i"
- *             elif t == NPY_UINT:        f[0] =  73 #"I"             # <<<<<<<<<<<<<<
- *             elif t == NPY_LONG:        f[0] = 108 #"l"
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"
- */
-      __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UINT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 809, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 809, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 809, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 73;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":810
- *             elif t == NPY_INT:         f[0] = 105 #"i"
- *             elif t == NPY_UINT:        f[0] =  73 #"I"
- *             elif t == NPY_LONG:        f[0] = 108 #"l"             # <<<<<<<<<<<<<<
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
- */
-      __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 810, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 810, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 810, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 0x6C;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":811
- *             elif t == NPY_UINT:        f[0] =  73 #"I"
- *             elif t == NPY_LONG:        f[0] = 108 #"l"
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"             # <<<<<<<<<<<<<<
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
- */
-      __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 811, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 811, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 811, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 76;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":812
- *             elif t == NPY_LONG:        f[0] = 108 #"l"
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"             # <<<<<<<<<<<<<<
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
- */
-      __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGLONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 812, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 812, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 812, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 0x71;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":813
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"             # <<<<<<<<<<<<<<
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
- */
-      __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 813, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 813, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 813, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 81;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":814
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"             # <<<<<<<<<<<<<<
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
- */
-      __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_FLOAT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 814, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 814, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 814, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 0x66;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":815
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"             # <<<<<<<<<<<<<<
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
- */
-      __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 815, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 815, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 815, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 0x64;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":816
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"             # <<<<<<<<<<<<<<
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
- */
-      __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 816, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 816, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 816, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 0x67;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":817
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf             # <<<<<<<<<<<<<<
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
- *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
- */
-      __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 817, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 817, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 817, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 90;
-        (__pyx_v_f[1]) = 0x66;
-        __pyx_v_f = (__pyx_v_f + 1);
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":818
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd             # <<<<<<<<<<<<<<
- *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
- *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
- */
-      __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 818, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 818, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 818, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 90;
-        (__pyx_v_f[1]) = 0x64;
-        __pyx_v_f = (__pyx_v_f + 1);
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":819
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
- *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg             # <<<<<<<<<<<<<<
- *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
- *             else:
- */
-      __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 819, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 819, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 819, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 90;
-        (__pyx_v_f[1]) = 0x67;
-        __pyx_v_f = (__pyx_v_f + 1);
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":820
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
- *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
- *             elif t == NPY_OBJECT:      f[0] = 79 #"O"             # <<<<<<<<<<<<<<
- *             else:
- *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
- */
-      __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_OBJECT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 820, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 820, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 820, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (likely(__pyx_t_6)) {
-        (__pyx_v_f[0]) = 79;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":822
- *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
- *             else:
- *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
- *             f += 1
- *         else:
- */
-      /*else*/ {
-        __pyx_t_3 = __Pyx_PyUnicode_FormatSafe(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 822, __pyx_L1_error)
-        __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 822, __pyx_L1_error)
-        __Pyx_GOTREF(__pyx_t_4);
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __Pyx_Raise(__pyx_t_4, 0, 0, 0);
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        __PYX_ERR(1, 822, __pyx_L1_error)
-      }
-      __pyx_L15:;
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":823
- *             else:
- *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
- *             f += 1             # <<<<<<<<<<<<<<
- *         else:
- *             # Cython ignores struct boundary information ("T{...}"),
- */
-      __pyx_v_f = (__pyx_v_f + 1);
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":798
- *         offset[0] += child.itemsize
- * 
- *         if not PyDataType_HASFIELDS(child):             # <<<<<<<<<<<<<<
- *             t = child.type_num
- *             if end - f < 5:
- */
-      goto __pyx_L13;
-    }
-
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":827
- *             # Cython ignores struct boundary information ("T{...}"),
- *             # so don't output it
- *             f = _util_dtypestring(child, f, end, offset)             # <<<<<<<<<<<<<<
- *     return f
- * 
- */
-    /*else*/ {
-      __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == ((char *)NULL))) __PYX_ERR(1, 827, __pyx_L1_error)
-      __pyx_v_f = __pyx_t_9;
-    }
-    __pyx_L13:;
-
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":772
- *     cdef tuple fields
- * 
- *     for childname in descr.names:             # <<<<<<<<<<<<<<
- *         fields = descr.fields[childname]
- *         child, new_offset = fields
- */
-  }
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":828
- *             # so don't output it
- *             f = _util_dtypestring(child, f, end, offset)
- *     return f             # <<<<<<<<<<<<<<
- * 
- * 
- */
-  __pyx_r = __pyx_v_f;
-  goto __pyx_L0;
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":763
- *         return ()
- * 
- * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<
- *     # Recursive utility function used in __getbuffer__ to get format
- *     # string. The new location in the format string is returned.
- */
-
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_AddTraceback("numpy._util_dtypestring", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XDECREF((PyObject *)__pyx_v_child);
-  __Pyx_XDECREF(__pyx_v_fields);
-  __Pyx_XDECREF(__pyx_v_childname);
-  __Pyx_XDECREF(__pyx_v_new_offset);
-  __Pyx_XDECREF(__pyx_v_t);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":943
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":929
  *     int _import_umath() except -1
  * 
  * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
@@ -4143,7 +3405,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("set_array_base", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":944
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":930
  * 
  * cdef inline void set_array_base(ndarray arr, object base):
  *     Py_INCREF(base) # important to do this before stealing the reference below!             # <<<<<<<<<<<<<<
@@ -4152,7 +3414,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
  */
   Py_INCREF(__pyx_v_base);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":945
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":931
  * cdef inline void set_array_base(ndarray arr, object base):
  *     Py_INCREF(base) # important to do this before stealing the reference below!
  *     PyArray_SetBaseObject(arr, base)             # <<<<<<<<<<<<<<
@@ -4161,7 +3423,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
  */
   (void)(PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base));
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":943
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":929
  *     int _import_umath() except -1
  * 
  * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
@@ -4173,7 +3435,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
   __Pyx_RefNannyFinishContext();
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":947
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":933
  *     PyArray_SetBaseObject(arr, base)
  * 
  * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
@@ -4188,7 +3450,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("get_array_base", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":948
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":934
  * 
  * cdef inline object get_array_base(ndarray arr):
  *     base = PyArray_BASE(arr)             # <<<<<<<<<<<<<<
@@ -4197,7 +3459,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
  */
   __pyx_v_base = PyArray_BASE(__pyx_v_arr);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":949
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":935
  * cdef inline object get_array_base(ndarray arr):
  *     base = PyArray_BASE(arr)
  *     if base is NULL:             # <<<<<<<<<<<<<<
@@ -4207,7 +3469,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   __pyx_t_1 = ((__pyx_v_base == NULL) != 0);
   if (__pyx_t_1) {
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":950
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":936
  *     base = PyArray_BASE(arr)
  *     if base is NULL:
  *         return None             # <<<<<<<<<<<<<<
@@ -4218,7 +3480,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":949
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":935
  * cdef inline object get_array_base(ndarray arr):
  *     base = PyArray_BASE(arr)
  *     if base is NULL:             # <<<<<<<<<<<<<<
@@ -4227,7 +3489,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
  */
   }
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":951
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":937
  *     if base is NULL:
  *         return None
  *     return <object>base             # <<<<<<<<<<<<<<
@@ -4239,7 +3501,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   __pyx_r = ((PyObject *)__pyx_v_base);
   goto __pyx_L0;
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":947
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":933
  *     PyArray_SetBaseObject(arr, base)
  * 
  * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
@@ -4254,7 +3516,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":955
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":941
  * # Versions of the import_* functions which are more suitable for
  * # Cython code.
  * cdef inline int import_array() except -1:             # <<<<<<<<<<<<<<
@@ -4278,7 +3540,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("import_array", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":956
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":942
  * # Cython code.
  * cdef inline int import_array() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4294,16 +3556,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":957
+      /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":943
  * cdef inline int import_array() except -1:
  *     try:
  *         __pyx_import_array()             # <<<<<<<<<<<<<<
  *     except Exception:
  *         raise ImportError("numpy.core.multiarray failed to import")
  */
-      __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 957, __pyx_L3_error)
+      __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 943, __pyx_L3_error)
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":956
+      /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":942
  * # Cython code.
  * cdef inline int import_array() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4317,7 +3579,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     goto __pyx_L8_try_end;
     __pyx_L3_error:;
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":958
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":944
  *     try:
  *         __pyx_import_array()
  *     except Exception:             # <<<<<<<<<<<<<<
@@ -4327,28 +3589,28 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
     if (__pyx_t_4) {
       __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 958, __pyx_L5_except_error)
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 944, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_GOTREF(__pyx_t_7);
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":959
+      /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":945
  *         __pyx_import_array()
  *     except Exception:
  *         raise ImportError("numpy.core.multiarray failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_umath() except -1:
  */
-      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 959, __pyx_L5_except_error)
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 945, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_Raise(__pyx_t_8, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __PYX_ERR(1, 959, __pyx_L5_except_error)
+      __PYX_ERR(1, 945, __pyx_L5_except_error)
     }
     goto __pyx_L5_except_error;
     __pyx_L5_except_error:;
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":956
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":942
  * # Cython code.
  * cdef inline int import_array() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4363,7 +3625,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     __pyx_L8_try_end:;
   }
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":955
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":941
  * # Versions of the import_* functions which are more suitable for
  * # Cython code.
  * cdef inline int import_array() except -1:             # <<<<<<<<<<<<<<
@@ -4386,7 +3648,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":961
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":947
  *         raise ImportError("numpy.core.multiarray failed to import")
  * 
  * cdef inline int import_umath() except -1:             # <<<<<<<<<<<<<<
@@ -4410,7 +3672,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("import_umath", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":962
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":948
  * 
  * cdef inline int import_umath() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4426,16 +3688,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":963
+      /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":949
  * cdef inline int import_umath() except -1:
  *     try:
  *         _import_umath()             # <<<<<<<<<<<<<<
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")
  */
-      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 963, __pyx_L3_error)
+      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 949, __pyx_L3_error)
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":962
+      /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":948
  * 
  * cdef inline int import_umath() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4449,7 +3711,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     goto __pyx_L8_try_end;
     __pyx_L3_error:;
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":964
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":950
  *     try:
  *         _import_umath()
  *     except Exception:             # <<<<<<<<<<<<<<
@@ -4459,28 +3721,28 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
     if (__pyx_t_4) {
       __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 964, __pyx_L5_except_error)
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 950, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_GOTREF(__pyx_t_7);
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":965
+      /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":951
  *         _import_umath()
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_ufunc() except -1:
  */
-      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 965, __pyx_L5_except_error)
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 951, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_Raise(__pyx_t_8, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __PYX_ERR(1, 965, __pyx_L5_except_error)
+      __PYX_ERR(1, 951, __pyx_L5_except_error)
     }
     goto __pyx_L5_except_error;
     __pyx_L5_except_error:;
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":962
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":948
  * 
  * cdef inline int import_umath() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4495,7 +3757,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     __pyx_L8_try_end:;
   }
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":961
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":947
  *         raise ImportError("numpy.core.multiarray failed to import")
  * 
  * cdef inline int import_umath() except -1:             # <<<<<<<<<<<<<<
@@ -4518,7 +3780,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":967
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":953
  *         raise ImportError("numpy.core.umath failed to import")
  * 
  * cdef inline int import_ufunc() except -1:             # <<<<<<<<<<<<<<
@@ -4542,7 +3804,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("import_ufunc", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":968
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":954
  * 
  * cdef inline int import_ufunc() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4558,16 +3820,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":969
+      /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":955
  * cdef inline int import_ufunc() except -1:
  *     try:
  *         _import_umath()             # <<<<<<<<<<<<<<
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")
  */
-      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 969, __pyx_L3_error)
+      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 955, __pyx_L3_error)
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":968
+      /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":954
  * 
  * cdef inline int import_ufunc() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4581,7 +3843,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     goto __pyx_L8_try_end;
     __pyx_L3_error:;
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":970
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":956
  *     try:
  *         _import_umath()
  *     except Exception:             # <<<<<<<<<<<<<<
@@ -4591,28 +3853,28 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
     if (__pyx_t_4) {
       __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 970, __pyx_L5_except_error)
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 956, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_GOTREF(__pyx_t_7);
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":971
+      /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":957
  *         _import_umath()
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef extern from *:
  */
-      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 971, __pyx_L5_except_error)
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 957, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_Raise(__pyx_t_8, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __PYX_ERR(1, 971, __pyx_L5_except_error)
+      __PYX_ERR(1, 957, __pyx_L5_except_error)
     }
     goto __pyx_L5_except_error;
     __pyx_L5_except_error:;
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":968
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":954
  * 
  * cdef inline int import_ufunc() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4627,7 +3889,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     __pyx_L8_try_end:;
   }
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":967
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":953
  *         raise ImportError("numpy.core.umath failed to import")
  * 
  * cdef inline int import_ufunc() except -1:             # <<<<<<<<<<<<<<
@@ -4650,20 +3912,194 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
   return __pyx_r;
 }
 
-static PyMethodDef __pyx_methods[] = {
-  {0, 0, 0, 0}
-};
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":967
+ * 
+ * 
+ * cdef inline bint is_timedelta64_object(object obj):             # <<<<<<<<<<<<<<
+ *     """
+ *     Cython equivalent of `isinstance(obj, np.timedelta64)`
+ */
 
-#if PY_MAJOR_VERSION >= 3
-#if CYTHON_PEP489_MULTI_PHASE_INIT
-static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/
-static int __pyx_pymod_exec_histogram2d(PyObject* module); /*proto*/
-static PyModuleDef_Slot __pyx_moduledef_slots[] = {
-  {Py_mod_create, (void*)__pyx_pymod_create},
-  {Py_mod_exec, (void*)__pyx_pymod_exec_histogram2d},
-  {0, NULL}
-};
-#endif
+static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_obj) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("is_timedelta64_object", 0);
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":979
+ *     bool
+ *     """
+ *     return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyTimedeltaArrType_Type));
+  goto __pyx_L0;
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":967
+ * 
+ * 
+ * cdef inline bint is_timedelta64_object(object obj):             # <<<<<<<<<<<<<<
+ *     """
+ *     Cython equivalent of `isinstance(obj, np.timedelta64)`
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":982
+ * 
+ * 
+ * cdef inline bint is_datetime64_object(object obj):             # <<<<<<<<<<<<<<
+ *     """
+ *     Cython equivalent of `isinstance(obj, np.datetime64)`
+ */
+
+static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_obj) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("is_datetime64_object", 0);
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":994
+ *     bool
+ *     """
+ *     return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyDatetimeArrType_Type));
+  goto __pyx_L0;
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":982
+ * 
+ * 
+ * cdef inline bint is_datetime64_object(object obj):             # <<<<<<<<<<<<<<
+ *     """
+ *     Cython equivalent of `isinstance(obj, np.datetime64)`
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":997
+ * 
+ * 
+ * cdef inline npy_datetime get_datetime64_value(object obj) nogil:             # <<<<<<<<<<<<<<
+ *     """
+ *     returns the int64 value underlying scalar numpy datetime64 object
+ */
+
+static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *__pyx_v_obj) {
+  npy_datetime __pyx_r;
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":1004
+ *     also needed.  That can be found using `get_datetime64_unit`.
+ *     """
+ *     return (<PyDatetimeScalarObject*>obj).obval             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = ((PyDatetimeScalarObject *)__pyx_v_obj)->obval;
+  goto __pyx_L0;
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":997
+ * 
+ * 
+ * cdef inline npy_datetime get_datetime64_value(object obj) nogil:             # <<<<<<<<<<<<<<
+ *     """
+ *     returns the int64 value underlying scalar numpy datetime64 object
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":1007
+ * 
+ * 
+ * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil:             # <<<<<<<<<<<<<<
+ *     """
+ *     returns the int64 value underlying scalar numpy timedelta64 object
+ */
+
+static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject *__pyx_v_obj) {
+  npy_timedelta __pyx_r;
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":1011
+ *     returns the int64 value underlying scalar numpy timedelta64 object
+ *     """
+ *     return (<PyTimedeltaScalarObject*>obj).obval             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = ((PyTimedeltaScalarObject *)__pyx_v_obj)->obval;
+  goto __pyx_L0;
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":1007
+ * 
+ * 
+ * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil:             # <<<<<<<<<<<<<<
+ *     """
+ *     returns the int64 value underlying scalar numpy timedelta64 object
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":1014
+ * 
+ * 
+ * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil:             # <<<<<<<<<<<<<<
+ *     """
+ *     returns the unit part of the dtype for a numpy datetime64 object.
+ */
+
+static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObject *__pyx_v_obj) {
+  NPY_DATETIMEUNIT __pyx_r;
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":1018
+ *     returns the unit part of the dtype for a numpy datetime64 object.
+ *     """
+ *     return <NPY_DATETIMEUNIT>(<PyDatetimeScalarObject*>obj).obmeta.base             # <<<<<<<<<<<<<<
+ */
+  __pyx_r = ((NPY_DATETIMEUNIT)((PyDatetimeScalarObject *)__pyx_v_obj)->obmeta.base);
+  goto __pyx_L0;
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":1014
+ * 
+ * 
+ * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil:             # <<<<<<<<<<<<<<
+ *     """
+ *     returns the unit part of the dtype for a numpy datetime64 object.
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+static PyMethodDef __pyx_methods[] = {
+  {0, 0, 0, 0}
+};
+
+#if PY_MAJOR_VERSION >= 3
+#if CYTHON_PEP489_MULTI_PHASE_INIT
+static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/
+static int __pyx_pymod_exec_histogram2d(PyObject* module); /*proto*/
+static PyModuleDef_Slot __pyx_moduledef_slots[] = {
+  {Py_mod_create, (void*)__pyx_pymod_create},
+  {Py_mod_exec, (void*)__pyx_pymod_exec_histogram2d},
+  {0, NULL}
+};
+#endif
 
 static struct PyModuleDef __pyx_moduledef = {
     PyModuleDef_HEAD_INIT,
@@ -4696,12 +4132,7 @@ static struct PyModuleDef __pyx_moduledef = {
 #endif
 
 static __Pyx_StringTabEntry __pyx_string_tab[] = {
-  {&__pyx_kp_u_Format_string_allocated_too_shor, __pyx_k_Format_string_allocated_too_shor, sizeof(__pyx_k_Format_string_allocated_too_shor), 0, 1, 0, 0},
-  {&__pyx_kp_u_Format_string_allocated_too_shor_2, __pyx_k_Format_string_allocated_too_shor_2, sizeof(__pyx_k_Format_string_allocated_too_shor_2), 0, 1, 0, 0},
   {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1},
-  {&__pyx_kp_u_Non_native_byte_order_not_suppor, __pyx_k_Non_native_byte_order_not_suppor, sizeof(__pyx_k_Non_native_byte_order_not_suppor), 0, 1, 0, 0},
-  {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1},
-  {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1},
   {&__pyx_n_s_X, __pyx_k_X, sizeof(__pyx_k_X), 0, 0, 1, 1},
   {&__pyx_n_s_Y, __pyx_k_Y, sizeof(__pyx_k_Y), 0, 0, 1, 1},
   {&__pyx_n_s_Z, __pyx_k_Z, sizeof(__pyx_k_Z), 0, 0, 1, 1},
@@ -4734,15 +4165,12 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_s_src_histogram2d_pyx, __pyx_k_src_histogram2d_pyx, sizeof(__pyx_k_src_histogram2d_pyx), 0, 0, 1, 0},
   {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1},
   {&__pyx_n_s_u, __pyx_k_u, sizeof(__pyx_k_u), 0, 0, 1, 1},
-  {&__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_k_unknown_dtype_code_in_numpy_pxd, sizeof(__pyx_k_unknown_dtype_code_in_numpy_pxd), 0, 1, 0, 0},
   {&__pyx_n_s_v, __pyx_k_v, sizeof(__pyx_k_v), 0, 0, 1, 1},
   {0, 0, 0, 0, 0, 0, 0}
 };
 static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) {
   __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 32, __pyx_L1_error)
-  __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(1, 777, __pyx_L1_error)
-  __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(1, 781, __pyx_L1_error)
-  __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 959, __pyx_L1_error)
+  __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 945, __pyx_L1_error)
   return 0;
   __pyx_L1_error:;
   return -1;
@@ -4752,60 +4180,27 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":777
- * 
- *         if (end - f) - <int>(new_offset - offset[0]) < 15:
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")             # <<<<<<<<<<<<<<
- * 
- *         if ((child.byteorder == c'>' and little_endian) or
- */
-  __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple_)) __PYX_ERR(1, 777, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_tuple_);
-  __Pyx_GIVEREF(__pyx_tuple_);
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":781
- *         if ((child.byteorder == c'>' and little_endian) or
- *             (child.byteorder == c'<' and not little_endian)):
- *             raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
- *             # One could encode it in the format string and have Cython
- *             # complain instead, BUT: < and > in format strings also imply
- */
-  __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 781, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_tuple__2);
-  __Pyx_GIVEREF(__pyx_tuple__2);
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":801
- *             t = child.type_num
- *             if end - f < 5:
- *                 raise RuntimeError(u"Format string allocated too short.")             # <<<<<<<<<<<<<<
- * 
- *             # Until ticket #99 is fixed, use integers to avoid warnings
- */
-  __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(1, 801, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_tuple__3);
-  __Pyx_GIVEREF(__pyx_tuple__3);
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":959
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":945
  *         __pyx_import_array()
  *     except Exception:
  *         raise ImportError("numpy.core.multiarray failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_umath() except -1:
  */
-  __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(1, 959, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_tuple__4);
-  __Pyx_GIVEREF(__pyx_tuple__4);
+  __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple_)) __PYX_ERR(1, 945, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple_);
+  __Pyx_GIVEREF(__pyx_tuple_);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":965
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":951
  *         _import_umath()
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_ufunc() except -1:
  */
-  __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(1, 965, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_tuple__5);
-  __Pyx_GIVEREF(__pyx_tuple__5);
+  __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 951, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__2);
+  __Pyx_GIVEREF(__pyx_tuple__2);
 
   /* "histogram2d.pyx":19
  * @cython.profile(False)
@@ -4814,10 +4209,10 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
  *                 double i0, double i1, double j0, double j1,
  *                 np.ndarray[double, ndim=2] data, logscale):
  */
-  __pyx_tuple__6 = PyTuple_Pack(18, __pyx_n_s_X, __pyx_n_s_Y, __pyx_n_s_i0, __pyx_n_s_i1, __pyx_n_s_j0, __pyx_n_s_j1, __pyx_n_s_data, __pyx_n_s_logscale, __pyx_n_s_cx, __pyx_n_s_cy, __pyx_n_s_nmax, __pyx_n_s_ix, __pyx_n_s_iy, __pyx_n_s_i, __pyx_n_s_n, __pyx_n_s_nx, __pyx_n_s_ny, __pyx_n_s_j); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 19, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_tuple__6);
-  __Pyx_GIVEREF(__pyx_tuple__6);
-  __pyx_codeobj__7 = (PyObject*)__Pyx_PyCode_New(8, 0, 18, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__6, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_histogram2d_pyx, __pyx_n_s_histogram2d, 19, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__7)) __PYX_ERR(0, 19, __pyx_L1_error)
+  __pyx_tuple__3 = PyTuple_Pack(18, __pyx_n_s_X, __pyx_n_s_Y, __pyx_n_s_i0, __pyx_n_s_i1, __pyx_n_s_j0, __pyx_n_s_j1, __pyx_n_s_data, __pyx_n_s_logscale, __pyx_n_s_cx, __pyx_n_s_cy, __pyx_n_s_nmax, __pyx_n_s_ix, __pyx_n_s_iy, __pyx_n_s_i, __pyx_n_s_n, __pyx_n_s_nx, __pyx_n_s_ny, __pyx_n_s_j); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 19, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__3);
+  __Pyx_GIVEREF(__pyx_tuple__3);
+  __pyx_codeobj__4 = (PyObject*)__Pyx_PyCode_New(8, 0, 18, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__3, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_histogram2d_pyx, __pyx_n_s_histogram2d, 19, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__4)) __PYX_ERR(0, 19, __pyx_L1_error)
 
   /* "histogram2d.pyx":53
  * @cython.profile(False)
@@ -4826,10 +4221,10 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
  *                      np.ndarray[double, ndim=1] Y,
  *                      np.ndarray[double, ndim=1] Z,
  */
-  __pyx_tuple__8 = PyTuple_Pack(21, __pyx_n_s_X, __pyx_n_s_Y, __pyx_n_s_Z, __pyx_n_s_i0, __pyx_n_s_i1, __pyx_n_s_j0, __pyx_n_s_j1, __pyx_n_s_data_tmp, __pyx_n_s_data, __pyx_n_s_computation, __pyx_n_s_cx, __pyx_n_s_cy, __pyx_n_s_nmax, __pyx_n_s_ix, __pyx_n_s_iy, __pyx_n_s_i, __pyx_n_s_u, __pyx_n_s_v, __pyx_n_s_n, __pyx_n_s_nx, __pyx_n_s_ny); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 53, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_tuple__8);
-  __Pyx_GIVEREF(__pyx_tuple__8);
-  __pyx_codeobj__9 = (PyObject*)__Pyx_PyCode_New(10, 0, 21, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__8, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_histogram2d_pyx, __pyx_n_s_histogram2d_func, 53, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__9)) __PYX_ERR(0, 53, __pyx_L1_error)
+  __pyx_tuple__5 = PyTuple_Pack(21, __pyx_n_s_X, __pyx_n_s_Y, __pyx_n_s_Z, __pyx_n_s_i0, __pyx_n_s_i1, __pyx_n_s_j0, __pyx_n_s_j1, __pyx_n_s_data_tmp, __pyx_n_s_data, __pyx_n_s_computation, __pyx_n_s_cx, __pyx_n_s_cy, __pyx_n_s_nmax, __pyx_n_s_ix, __pyx_n_s_iy, __pyx_n_s_i, __pyx_n_s_u, __pyx_n_s_v, __pyx_n_s_n, __pyx_n_s_nx, __pyx_n_s_ny); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 53, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__5);
+  __Pyx_GIVEREF(__pyx_tuple__5);
+  __pyx_codeobj__6 = (PyObject*)__Pyx_PyCode_New(10, 0, 21, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__5, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_histogram2d_pyx, __pyx_n_s_histogram2d_func, 53, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__6)) __PYX_ERR(0, 53, __pyx_L1_error)
   __Pyx_RefNannyFinishContext();
   return 0;
   __pyx_L1_error:;
@@ -4903,18 +4298,38 @@ static int __Pyx_modinit_type_import_code(void) {
   __Pyx_ImportType_CheckSize_Warn);
    if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 207, __pyx_L1_error)
+  __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 200, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_ptype_5numpy_dtype = __Pyx_ImportType(__pyx_t_1, "numpy", "dtype", sizeof(PyArray_Descr), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(1, 207, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(1, 200, __pyx_L1_error)
   __pyx_ptype_5numpy_flatiter = __Pyx_ImportType(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(1, 230, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(1, 223, __pyx_L1_error)
   __pyx_ptype_5numpy_broadcast = __Pyx_ImportType(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(1, 234, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(1, 227, __pyx_L1_error)
   __pyx_ptype_5numpy_ndarray = __Pyx_ImportType(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(1, 246, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(1, 239, __pyx_L1_error)
+  __pyx_ptype_5numpy_generic = __Pyx_ImportType(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_generic) __PYX_ERR(1, 771, __pyx_L1_error)
+  __pyx_ptype_5numpy_number = __Pyx_ImportType(__pyx_t_1, "numpy", "number", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_number) __PYX_ERR(1, 773, __pyx_L1_error)
+  __pyx_ptype_5numpy_integer = __Pyx_ImportType(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_integer) __PYX_ERR(1, 775, __pyx_L1_error)
+  __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(1, 777, __pyx_L1_error)
+  __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(1, 779, __pyx_L1_error)
+  __pyx_ptype_5numpy_inexact = __Pyx_ImportType(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(1, 781, __pyx_L1_error)
+  __pyx_ptype_5numpy_floating = __Pyx_ImportType(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_floating) __PYX_ERR(1, 783, __pyx_L1_error)
+  __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(1, 785, __pyx_L1_error)
+  __pyx_ptype_5numpy_flexible = __Pyx_ImportType(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(1, 787, __pyx_L1_error)
+  __pyx_ptype_5numpy_character = __Pyx_ImportType(__pyx_t_1, "numpy", "character", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_character) __PYX_ERR(1, 789, __pyx_L1_error)
   __pyx_ptype_5numpy_ufunc = __Pyx_ImportType(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(1, 839, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(1, 827, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_RefNannyFinishContext();
   return 0;
@@ -5085,11 +4500,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;
@@ -5176,12 +4589,12 @@ if (!__Pyx_RefNanny) {
   if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":967
- *         raise ImportError("numpy.core.umath failed to import")
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":1014
  * 
- * cdef inline int import_ufunc() except -1:             # <<<<<<<<<<<<<<
- *     try:
- *         _import_umath()
+ * 
+ * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil:             # <<<<<<<<<<<<<<
+ *     """
+ *     returns the unit part of the dtype for a numpy datetime64 object.
  */
 
   /*--- Wrapped vars code ---*/
@@ -6001,99 +5414,199 @@ static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject
 }
 #endif
 
-/* DictGetItem */
-  #if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY
-static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) {
-    PyObject *value;
-    value = PyDict_GetItemWithError(d, key);
-    if (unlikely(!value)) {
-        if (!PyErr_Occurred()) {
-            if (unlikely(PyTuple_Check(key))) {
-                PyObject* args = PyTuple_Pack(1, key);
-                if (likely(args)) {
-                    PyErr_SetObject(PyExc_KeyError, args);
-                    Py_DECREF(args);
-                }
-            } else {
-                PyErr_SetObject(PyExc_KeyError, key);
-            }
-        }
-        return NULL;
+/* GetTopmostException */
+  #if CYTHON_USE_EXC_INFO_STACK
+static _PyErr_StackItem *
+__Pyx_PyErr_GetTopmostException(PyThreadState *tstate)
+{
+    _PyErr_StackItem *exc_info = tstate->exc_info;
+    while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) &&
+           exc_info->previous_item != NULL)
+    {
+        exc_info = exc_info->previous_item;
     }
-    Py_INCREF(value);
-    return value;
+    return exc_info;
 }
 #endif
 
-/* RaiseTooManyValuesToUnpack */
-  static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {
-    PyErr_Format(PyExc_ValueError,
-                 "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected);
-}
-
-/* RaiseNeedMoreValuesToUnpack */
-  static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
-    PyErr_Format(PyExc_ValueError,
-                 "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack",
-                 index, (index == 1) ? "" : "s");
+/* SaveResetException */
+  #if CYTHON_FAST_THREAD_STATE
+static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
+    #if CYTHON_USE_EXC_INFO_STACK
+    _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate);
+    *type = exc_info->exc_type;
+    *value = exc_info->exc_value;
+    *tb = exc_info->exc_traceback;
+    #else
+    *type = tstate->exc_type;
+    *value = tstate->exc_value;
+    *tb = tstate->exc_traceback;
+    #endif
+    Py_XINCREF(*type);
+    Py_XINCREF(*value);
+    Py_XINCREF(*tb);
 }
-
-/* RaiseNoneIterError */
-  static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) {
+    PyObject *tmp_type, *tmp_value, *tmp_tb;
+    #if CYTHON_USE_EXC_INFO_STACK
+    _PyErr_StackItem *exc_info = tstate->exc_info;
+    tmp_type = exc_info->exc_type;
+    tmp_value = exc_info->exc_value;
+    tmp_tb = exc_info->exc_traceback;
+    exc_info->exc_type = type;
+    exc_info->exc_value = value;
+    exc_info->exc_traceback = tb;
+    #else
+    tmp_type = tstate->exc_type;
+    tmp_value = tstate->exc_value;
+    tmp_tb = tstate->exc_traceback;
+    tstate->exc_type = type;
+    tstate->exc_value = value;
+    tstate->exc_traceback = tb;
+    #endif
+    Py_XDECREF(tmp_type);
+    Py_XDECREF(tmp_value);
+    Py_XDECREF(tmp_tb);
 }
+#endif
 
-/* ExtTypeTest */
-  static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
-    if (unlikely(!type)) {
-        PyErr_SetString(PyExc_SystemError, "Missing type object");
-        return 0;
+/* PyErrExceptionMatches */
+  #if CYTHON_FAST_THREAD_STATE
+static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) {
+    Py_ssize_t i, n;
+    n = PyTuple_GET_SIZE(tuple);
+#if PY_MAJOR_VERSION >= 3
+    for (i=0; i<n; i++) {
+        if (exc_type == PyTuple_GET_ITEM(tuple, i)) return 1;
+    }
+#endif
+    for (i=0; i<n; i++) {
+        if (__Pyx_PyErr_GivenExceptionMatches(exc_type, PyTuple_GET_ITEM(tuple, i))) return 1;
     }
-    if (likely(__Pyx_TypeCheck(obj, type)))
-        return 1;
-    PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s",
-                 Py_TYPE(obj)->tp_name, type->tp_name);
     return 0;
 }
-
-/* PyObjectCall */
-  #if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) {
-    PyObject *result;
-    ternaryfunc call = func->ob_type->tp_call;
-    if (unlikely(!call))
-        return PyObject_Call(func, arg, kw);
-    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
-        return NULL;
-    result = (*call)(func, arg, kw);
-    Py_LeaveRecursiveCall();
-    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
-        PyErr_SetString(
-            PyExc_SystemError,
-            "NULL result without error in PyObject_Call");
-    }
-    return result;
+static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err) {
+    PyObject *exc_type = tstate->curexc_type;
+    if (exc_type == err) return 1;
+    if (unlikely(!exc_type)) return 0;
+    if (unlikely(PyTuple_Check(err)))
+        return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err);
+    return __Pyx_PyErr_GivenExceptionMatches(exc_type, err);
 }
 #endif
 
-/* RaiseException */
-  #if PY_MAJOR_VERSION < 3
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
-                        CYTHON_UNUSED PyObject *cause) {
-    __Pyx_PyThreadState_declare
-    Py_XINCREF(type);
-    if (!value || value == Py_None)
-        value = NULL;
-    else
-        Py_INCREF(value);
-    if (!tb || tb == Py_None)
-        tb = NULL;
-    else {
-        Py_INCREF(tb);
-        if (!PyTraceBack_Check(tb)) {
-            PyErr_SetString(PyExc_TypeError,
-                "raise: arg 3 must be a traceback or None");
-            goto raise_error;
+/* GetException */
+  #if CYTHON_FAST_THREAD_STATE
+static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb)
+#else
+static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
+#endif
+{
+    PyObject *local_type, *local_value, *local_tb;
+#if CYTHON_FAST_THREAD_STATE
+    PyObject *tmp_type, *tmp_value, *tmp_tb;
+    local_type = tstate->curexc_type;
+    local_value = tstate->curexc_value;
+    local_tb = tstate->curexc_traceback;
+    tstate->curexc_type = 0;
+    tstate->curexc_value = 0;
+    tstate->curexc_traceback = 0;
+#else
+    PyErr_Fetch(&local_type, &local_value, &local_tb);
+#endif
+    PyErr_NormalizeException(&local_type, &local_value, &local_tb);
+#if CYTHON_FAST_THREAD_STATE
+    if (unlikely(tstate->curexc_type))
+#else
+    if (unlikely(PyErr_Occurred()))
+#endif
+        goto bad;
+    #if PY_MAJOR_VERSION >= 3
+    if (local_tb) {
+        if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0))
+            goto bad;
+    }
+    #endif
+    Py_XINCREF(local_tb);
+    Py_XINCREF(local_type);
+    Py_XINCREF(local_value);
+    *type = local_type;
+    *value = local_value;
+    *tb = local_tb;
+#if CYTHON_FAST_THREAD_STATE
+    #if CYTHON_USE_EXC_INFO_STACK
+    {
+        _PyErr_StackItem *exc_info = tstate->exc_info;
+        tmp_type = exc_info->exc_type;
+        tmp_value = exc_info->exc_value;
+        tmp_tb = exc_info->exc_traceback;
+        exc_info->exc_type = local_type;
+        exc_info->exc_value = local_value;
+        exc_info->exc_traceback = local_tb;
+    }
+    #else
+    tmp_type = tstate->exc_type;
+    tmp_value = tstate->exc_value;
+    tmp_tb = tstate->exc_traceback;
+    tstate->exc_type = local_type;
+    tstate->exc_value = local_value;
+    tstate->exc_traceback = local_tb;
+    #endif
+    Py_XDECREF(tmp_type);
+    Py_XDECREF(tmp_value);
+    Py_XDECREF(tmp_tb);
+#else
+    PyErr_SetExcInfo(local_type, local_value, local_tb);
+#endif
+    return 0;
+bad:
+    *type = 0;
+    *value = 0;
+    *tb = 0;
+    Py_XDECREF(local_type);
+    Py_XDECREF(local_value);
+    Py_XDECREF(local_tb);
+    return -1;
+}
+
+/* PyObjectCall */
+  #if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) {
+    PyObject *result;
+    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")))
+        return NULL;
+    result = (*call)(func, arg, kw);
+    Py_LeaveRecursiveCall();
+    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
+        PyErr_SetString(
+            PyExc_SystemError,
+            "NULL result without error in PyObject_Call");
+    }
+    return result;
+}
+#endif
+
+/* RaiseException */
+  #if PY_MAJOR_VERSION < 3
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
+                        CYTHON_UNUSED PyObject *cause) {
+    __Pyx_PyThreadState_declare
+    Py_XINCREF(type);
+    if (!value || value == Py_None)
+        value = NULL;
+    else
+        Py_INCREF(value);
+    if (!tb || tb == Py_None)
+        tb = NULL;
+    else {
+        Py_INCREF(tb);
+        if (!PyTraceBack_Check(tb)) {
+            PyErr_SetString(PyExc_TypeError,
+                "raise: arg 3 must be a traceback or None");
+            goto raise_error;
         }
     }
     if (PyType_Check(type)) {
@@ -6143,454 +5656,97 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
     if (PyExceptionInstance_Check(type)) {
         if (value) {
             PyErr_SetString(PyExc_TypeError,
-                "instance exception may not have a separate value");
-            goto bad;
-        }
-        value = type;
-        type = (PyObject*) Py_TYPE(value);
-    } else if (PyExceptionClass_Check(type)) {
-        PyObject *instance_class = NULL;
-        if (value && PyExceptionInstance_Check(value)) {
-            instance_class = (PyObject*) Py_TYPE(value);
-            if (instance_class != type) {
-                int is_subclass = PyObject_IsSubclass(instance_class, type);
-                if (!is_subclass) {
-                    instance_class = NULL;
-                } else if (unlikely(is_subclass == -1)) {
-                    goto bad;
-                } else {
-                    type = instance_class;
-                }
-            }
-        }
-        if (!instance_class) {
-            PyObject *args;
-            if (!value)
-                args = PyTuple_New(0);
-            else if (PyTuple_Check(value)) {
-                Py_INCREF(value);
-                args = value;
-            } else
-                args = PyTuple_Pack(1, value);
-            if (!args)
-                goto bad;
-            owned_instance = PyObject_Call(type, args, NULL);
-            Py_DECREF(args);
-            if (!owned_instance)
-                goto bad;
-            value = owned_instance;
-            if (!PyExceptionInstance_Check(value)) {
-                PyErr_Format(PyExc_TypeError,
-                             "calling %R should have returned an instance of "
-                             "BaseException, not %R",
-                             type, Py_TYPE(value));
-                goto bad;
-            }
-        }
-    } else {
-        PyErr_SetString(PyExc_TypeError,
-            "raise: exception class must be a subclass of BaseException");
-        goto bad;
-    }
-    if (cause) {
-        PyObject *fixed_cause;
-        if (cause == Py_None) {
-            fixed_cause = NULL;
-        } else if (PyExceptionClass_Check(cause)) {
-            fixed_cause = PyObject_CallObject(cause, NULL);
-            if (fixed_cause == NULL)
-                goto bad;
-        } else if (PyExceptionInstance_Check(cause)) {
-            fixed_cause = cause;
-            Py_INCREF(fixed_cause);
-        } else {
-            PyErr_SetString(PyExc_TypeError,
-                            "exception causes must derive from "
-                            "BaseException");
-            goto bad;
-        }
-        PyException_SetCause(value, fixed_cause);
-    }
-    PyErr_SetObject(type, value);
-    if (tb) {
-#if CYTHON_COMPILING_IN_PYPY
-        PyObject *tmp_type, *tmp_value, *tmp_tb;
-        PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb);
-        Py_INCREF(tb);
-        PyErr_Restore(tmp_type, tmp_value, tb);
-        Py_XDECREF(tmp_tb);
-#else
-        PyThreadState *tstate = __Pyx_PyThreadState_Current;
-        PyObject* tmp_tb = tstate->curexc_traceback;
-        if (tb != tmp_tb) {
-            Py_INCREF(tb);
-            tstate->curexc_traceback = tb;
-            Py_XDECREF(tmp_tb);
-        }
-#endif
-    }
-bad:
-    Py_XDECREF(owned_instance);
-    return;
-}
-#endif
-
-/* PyCFunctionFastCall */
-  #if CYTHON_FAST_PYCCALL
-static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) {
-    PyCFunctionObject *func = (PyCFunctionObject*)func_obj;
-    PyCFunction meth = PyCFunction_GET_FUNCTION(func);
-    PyObject *self = PyCFunction_GET_SELF(func);
-    int flags = PyCFunction_GET_FLAGS(func);
-    assert(PyCFunction_Check(func));
-    assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS)));
-    assert(nargs >= 0);
-    assert(nargs == 0 || args != NULL);
-    /* _PyCFunction_FastCallDict() must not be called with an exception set,
-       because it may clear it (directly or indirectly) and so the
-       caller loses its exception */
-    assert(!PyErr_Occurred());
-    if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) {
-        return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL);
-    } else {
-        return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs);
-    }
-}
-#endif
-
-/* PyFunctionFastCall */
-  #if CYTHON_FAST_PYCALL
-static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na,
-                                               PyObject *globals) {
-    PyFrameObject *f;
-    PyThreadState *tstate = __Pyx_PyThreadState_Current;
-    PyObject **fastlocals;
-    Py_ssize_t i;
-    PyObject *result;
-    assert(globals != NULL);
-    /* XXX Perhaps we should create a specialized
-       PyFrame_New() that doesn't take locals, but does
-       take builtins without sanity checking them.
-       */
-    assert(tstate != NULL);
-    f = PyFrame_New(tstate, co, globals, NULL);
-    if (f == NULL) {
-        return NULL;
-    }
-    fastlocals = __Pyx_PyFrame_GetLocalsplus(f);
-    for (i = 0; i < na; i++) {
-        Py_INCREF(*args);
-        fastlocals[i] = *args++;
-    }
-    result = PyEval_EvalFrameEx(f,0);
-    ++tstate->recursion_depth;
-    Py_DECREF(f);
-    --tstate->recursion_depth;
-    return result;
-}
-#if 1 || PY_VERSION_HEX < 0x030600B1
-static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) {
-    PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
-    PyObject *globals = PyFunction_GET_GLOBALS(func);
-    PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
-    PyObject *closure;
-#if PY_MAJOR_VERSION >= 3
-    PyObject *kwdefs;
-#endif
-    PyObject *kwtuple, **k;
-    PyObject **d;
-    Py_ssize_t nd;
-    Py_ssize_t nk;
-    PyObject *result;
-    assert(kwargs == NULL || PyDict_Check(kwargs));
-    nk = kwargs ? PyDict_Size(kwargs) : 0;
-    if (Py_EnterRecursiveCall((char*)" while calling a Python object")) {
-        return NULL;
-    }
-    if (
-#if PY_MAJOR_VERSION >= 3
-            co->co_kwonlyargcount == 0 &&
-#endif
-            likely(kwargs == NULL || nk == 0) &&
-            co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
-        if (argdefs == NULL && co->co_argcount == nargs) {
-            result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals);
-            goto done;
-        }
-        else if (nargs == 0 && argdefs != NULL
-                 && co->co_argcount == Py_SIZE(argdefs)) {
-            /* function called with no arguments, but all parameters have
-               a default value: use default values as arguments .*/
-            args = &PyTuple_GET_ITEM(argdefs, 0);
-            result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals);
-            goto done;
-        }
-    }
-    if (kwargs != NULL) {
-        Py_ssize_t pos, i;
-        kwtuple = PyTuple_New(2 * nk);
-        if (kwtuple == NULL) {
-            result = NULL;
-            goto done;
-        }
-        k = &PyTuple_GET_ITEM(kwtuple, 0);
-        pos = i = 0;
-        while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) {
-            Py_INCREF(k[i]);
-            Py_INCREF(k[i+1]);
-            i += 2;
-        }
-        nk = i / 2;
-    }
-    else {
-        kwtuple = NULL;
-        k = NULL;
-    }
-    closure = PyFunction_GET_CLOSURE(func);
-#if PY_MAJOR_VERSION >= 3
-    kwdefs = PyFunction_GET_KW_DEFAULTS(func);
-#endif
-    if (argdefs != NULL) {
-        d = &PyTuple_GET_ITEM(argdefs, 0);
-        nd = Py_SIZE(argdefs);
-    }
-    else {
-        d = NULL;
-        nd = 0;
-    }
-#if PY_MAJOR_VERSION >= 3
-    result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL,
-                               args, (int)nargs,
-                               k, (int)nk,
-                               d, (int)nd, kwdefs, closure);
-#else
-    result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL,
-                               args, (int)nargs,
-                               k, (int)nk,
-                               d, (int)nd, closure);
-#endif
-    Py_XDECREF(kwtuple);
-done:
-    Py_LeaveRecursiveCall();
-    return result;
-}
-#endif
-#endif
-
-/* PyObjectCallMethO */
-  #if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) {
-    PyObject *self, *result;
-    PyCFunction cfunc;
-    cfunc = PyCFunction_GET_FUNCTION(func);
-    self = PyCFunction_GET_SELF(func);
-    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
-        return NULL;
-    result = cfunc(self, arg);
-    Py_LeaveRecursiveCall();
-    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
-        PyErr_SetString(
-            PyExc_SystemError,
-            "NULL result without error in PyObject_Call");
-    }
-    return result;
-}
-#endif
-
-/* PyObjectCallOneArg */
-  #if CYTHON_COMPILING_IN_CPYTHON
-static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) {
-    PyObject *result;
-    PyObject *args = PyTuple_New(1);
-    if (unlikely(!args)) return NULL;
-    Py_INCREF(arg);
-    PyTuple_SET_ITEM(args, 0, arg);
-    result = __Pyx_PyObject_Call(func, args, NULL);
-    Py_DECREF(args);
-    return result;
-}
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
-#if CYTHON_FAST_PYCALL
-    if (PyFunction_Check(func)) {
-        return __Pyx_PyFunction_FastCall(func, &arg, 1);
-    }
-#endif
-    if (likely(PyCFunction_Check(func))) {
-        if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) {
-            return __Pyx_PyObject_CallMethO(func, arg);
-#if CYTHON_FAST_PYCCALL
-        } else if (PyCFunction_GET_FLAGS(func) & METH_FASTCALL) {
-            return __Pyx_PyCFunction_FastCall(func, &arg, 1);
-#endif
-        }
-    }
-    return __Pyx__PyObject_CallOneArg(func, arg);
-}
-#else
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
-    PyObject *result;
-    PyObject *args = PyTuple_Pack(1, arg);
-    if (unlikely(!args)) return NULL;
-    result = __Pyx_PyObject_Call(func, args, NULL);
-    Py_DECREF(args);
-    return result;
-}
-#endif
-
-/* GetTopmostException */
-  #if CYTHON_USE_EXC_INFO_STACK
-static _PyErr_StackItem *
-__Pyx_PyErr_GetTopmostException(PyThreadState *tstate)
-{
-    _PyErr_StackItem *exc_info = tstate->exc_info;
-    while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) &&
-           exc_info->previous_item != NULL)
-    {
-        exc_info = exc_info->previous_item;
-    }
-    return exc_info;
-}
-#endif
-
-/* SaveResetException */
-  #if CYTHON_FAST_THREAD_STATE
-static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
-    #if CYTHON_USE_EXC_INFO_STACK
-    _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate);
-    *type = exc_info->exc_type;
-    *value = exc_info->exc_value;
-    *tb = exc_info->exc_traceback;
-    #else
-    *type = tstate->exc_type;
-    *value = tstate->exc_value;
-    *tb = tstate->exc_traceback;
-    #endif
-    Py_XINCREF(*type);
-    Py_XINCREF(*value);
-    Py_XINCREF(*tb);
-}
-static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) {
-    PyObject *tmp_type, *tmp_value, *tmp_tb;
-    #if CYTHON_USE_EXC_INFO_STACK
-    _PyErr_StackItem *exc_info = tstate->exc_info;
-    tmp_type = exc_info->exc_type;
-    tmp_value = exc_info->exc_value;
-    tmp_tb = exc_info->exc_traceback;
-    exc_info->exc_type = type;
-    exc_info->exc_value = value;
-    exc_info->exc_traceback = tb;
-    #else
-    tmp_type = tstate->exc_type;
-    tmp_value = tstate->exc_value;
-    tmp_tb = tstate->exc_traceback;
-    tstate->exc_type = type;
-    tstate->exc_value = value;
-    tstate->exc_traceback = tb;
-    #endif
-    Py_XDECREF(tmp_type);
-    Py_XDECREF(tmp_value);
-    Py_XDECREF(tmp_tb);
-}
-#endif
-
-/* PyErrExceptionMatches */
-  #if CYTHON_FAST_THREAD_STATE
-static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) {
-    Py_ssize_t i, n;
-    n = PyTuple_GET_SIZE(tuple);
-#if PY_MAJOR_VERSION >= 3
-    for (i=0; i<n; i++) {
-        if (exc_type == PyTuple_GET_ITEM(tuple, i)) return 1;
-    }
-#endif
-    for (i=0; i<n; i++) {
-        if (__Pyx_PyErr_GivenExceptionMatches(exc_type, PyTuple_GET_ITEM(tuple, i))) return 1;
-    }
-    return 0;
-}
-static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err) {
-    PyObject *exc_type = tstate->curexc_type;
-    if (exc_type == err) return 1;
-    if (unlikely(!exc_type)) return 0;
-    if (unlikely(PyTuple_Check(err)))
-        return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err);
-    return __Pyx_PyErr_GivenExceptionMatches(exc_type, err);
-}
-#endif
-
-/* GetException */
-  #if CYTHON_FAST_THREAD_STATE
-static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb)
-#else
-static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
-#endif
-{
-    PyObject *local_type, *local_value, *local_tb;
-#if CYTHON_FAST_THREAD_STATE
-    PyObject *tmp_type, *tmp_value, *tmp_tb;
-    local_type = tstate->curexc_type;
-    local_value = tstate->curexc_value;
-    local_tb = tstate->curexc_traceback;
-    tstate->curexc_type = 0;
-    tstate->curexc_value = 0;
-    tstate->curexc_traceback = 0;
-#else
-    PyErr_Fetch(&local_type, &local_value, &local_tb);
-#endif
-    PyErr_NormalizeException(&local_type, &local_value, &local_tb);
-#if CYTHON_FAST_THREAD_STATE
-    if (unlikely(tstate->curexc_type))
-#else
-    if (unlikely(PyErr_Occurred()))
-#endif
-        goto bad;
-    #if PY_MAJOR_VERSION >= 3
-    if (local_tb) {
-        if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0))
+                "instance exception may not have a separate value");
             goto bad;
+        }
+        value = type;
+        type = (PyObject*) Py_TYPE(value);
+    } else if (PyExceptionClass_Check(type)) {
+        PyObject *instance_class = NULL;
+        if (value && PyExceptionInstance_Check(value)) {
+            instance_class = (PyObject*) Py_TYPE(value);
+            if (instance_class != type) {
+                int is_subclass = PyObject_IsSubclass(instance_class, type);
+                if (!is_subclass) {
+                    instance_class = NULL;
+                } else if (unlikely(is_subclass == -1)) {
+                    goto bad;
+                } else {
+                    type = instance_class;
+                }
+            }
+        }
+        if (!instance_class) {
+            PyObject *args;
+            if (!value)
+                args = PyTuple_New(0);
+            else if (PyTuple_Check(value)) {
+                Py_INCREF(value);
+                args = value;
+            } else
+                args = PyTuple_Pack(1, value);
+            if (!args)
+                goto bad;
+            owned_instance = PyObject_Call(type, args, NULL);
+            Py_DECREF(args);
+            if (!owned_instance)
+                goto bad;
+            value = owned_instance;
+            if (!PyExceptionInstance_Check(value)) {
+                PyErr_Format(PyExc_TypeError,
+                             "calling %R should have returned an instance of "
+                             "BaseException, not %R",
+                             type, Py_TYPE(value));
+                goto bad;
+            }
+        }
+    } else {
+        PyErr_SetString(PyExc_TypeError,
+            "raise: exception class must be a subclass of BaseException");
+        goto bad;
     }
-    #endif
-    Py_XINCREF(local_tb);
-    Py_XINCREF(local_type);
-    Py_XINCREF(local_value);
-    *type = local_type;
-    *value = local_value;
-    *tb = local_tb;
-#if CYTHON_FAST_THREAD_STATE
-    #if CYTHON_USE_EXC_INFO_STACK
-    {
-        _PyErr_StackItem *exc_info = tstate->exc_info;
-        tmp_type = exc_info->exc_type;
-        tmp_value = exc_info->exc_value;
-        tmp_tb = exc_info->exc_traceback;
-        exc_info->exc_type = local_type;
-        exc_info->exc_value = local_value;
-        exc_info->exc_traceback = local_tb;
+    if (cause) {
+        PyObject *fixed_cause;
+        if (cause == Py_None) {
+            fixed_cause = NULL;
+        } else if (PyExceptionClass_Check(cause)) {
+            fixed_cause = PyObject_CallObject(cause, NULL);
+            if (fixed_cause == NULL)
+                goto bad;
+        } else if (PyExceptionInstance_Check(cause)) {
+            fixed_cause = cause;
+            Py_INCREF(fixed_cause);
+        } else {
+            PyErr_SetString(PyExc_TypeError,
+                            "exception causes must derive from "
+                            "BaseException");
+            goto bad;
+        }
+        PyException_SetCause(value, fixed_cause);
     }
-    #else
-    tmp_type = tstate->exc_type;
-    tmp_value = tstate->exc_value;
-    tmp_tb = tstate->exc_traceback;
-    tstate->exc_type = local_type;
-    tstate->exc_value = local_value;
-    tstate->exc_traceback = local_tb;
-    #endif
-    Py_XDECREF(tmp_type);
-    Py_XDECREF(tmp_value);
-    Py_XDECREF(tmp_tb);
+    PyErr_SetObject(type, value);
+    if (tb) {
+#if CYTHON_COMPILING_IN_PYPY
+        PyObject *tmp_type, *tmp_value, *tmp_tb;
+        PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb);
+        Py_INCREF(tb);
+        PyErr_Restore(tmp_type, tmp_value, tb);
+        Py_XDECREF(tmp_tb);
 #else
-    PyErr_SetExcInfo(local_type, local_value, local_tb);
+        PyThreadState *tstate = __Pyx_PyThreadState_Current;
+        PyObject* tmp_tb = tstate->curexc_traceback;
+        if (tb != tmp_tb) {
+            Py_INCREF(tb);
+            tstate->curexc_traceback = tb;
+            Py_XDECREF(tmp_tb);
+        }
 #endif
-    return 0;
+    }
 bad:
-    *type = 0;
-    *value = 0;
-    *tb = 0;
-    Py_XDECREF(local_type);
-    Py_XDECREF(local_value);
-    Py_XDECREF(local_tb);
-    return -1;
+    Py_XDECREF(owned_instance);
+    return;
 }
+#endif
 
 /* TypeImport */
   #ifndef __PYX_HAVE_RT_ImportType
@@ -6711,7 +5867,7 @@ static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int
     }
     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;
@@ -6808,30 +5964,31 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
 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,
@@ -6850,11 +6007,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,
@@ -6928,37 +6090,6 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) {
         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);
-    }
-}
-
 /* Declarations */
   #if CYTHON_CCOMPLEX
   #ifdef __cplusplus
@@ -7267,71 +6398,16 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) {
     #endif
 #endif
 
-/* 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_enum__NPY_TYPES(enum NPY_TYPES value) {
-    const enum NPY_TYPES neg_one = (enum NPY_TYPES) ((enum NPY_TYPES) 0 - (enum NPY_TYPES) 1), const_zero = (enum NPY_TYPES) 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (is_unsigned) {
-        if (sizeof(enum NPY_TYPES) < sizeof(long)) {
-            return PyInt_FromLong((long) value);
-        } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned long)) {
-            return PyLong_FromUnsignedLong((unsigned long) value);
-#ifdef HAVE_LONG_LONG
-        } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned PY_LONG_LONG)) {
-            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
-#endif
-        }
-    } else {
-        if (sizeof(enum NPY_TYPES) <= sizeof(long)) {
-            return PyInt_FromLong((long) value);
-#ifdef HAVE_LONG_LONG
-        } else if (sizeof(enum NPY_TYPES) <= 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(enum NPY_TYPES),
-                                     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))) {
@@ -7518,9 +6594,54 @@ raise_neg_overflow:
     return (int) -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);
+    }
+}
+
 /* 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))) {
@@ -7709,7 +6830,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)) {
@@ -7740,7 +6868,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))) {
@@ -8245,7 +7380,7 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
     const digit* digits = ((PyLongObject*)b)->ob_digit;
     const Py_ssize_t size = Py_SIZE(b);
     if (likely(__Pyx_sst_abs(size) <= 1)) {
-        ival = likely(size) ? (Py_ssize_t)(digits[0]) : 0;
+        ival = likely(size) ? digits[0] : 0;
         if (size == -1) ival = -ival;
         return ival;
     } else {
@@ -8291,6 +7426,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/src/mandelbrot.c b/src/mandelbrot.c
index 9927799..bb656cb 100644
--- a/src/mandelbrot.c
+++ b/src/mandelbrot.c
@@ -1,14 +1,16 @@
-/* Generated by Cython 0.29.21 */
+/* Generated by Cython 0.29.28 */
 
+#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_21"
-#define CYTHON_HEX_VERSION 0x001D15F0
+#define CYTHON_ABI "0_29_28"
+#define CYTHON_HEX_VERSION 0x001D1CF0
 #define CYTHON_FUTURE_DIVISION 0
 #include <stddef.h>
 #ifndef offsetof
@@ -155,7 +157,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 +172,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 < 0x030B00A1)
   #endif
   #ifndef CYTHON_PEP489_MULTI_PHASE_INIT
     #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000)
@@ -185,7 +190,10 @@
   #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
 #endif
@@ -193,7 +201,9 @@
 #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
@@ -310,9 +320,68 @@
   #define __Pyx_DefaultClassType PyClass_Type
 #else
   #define __Pyx_BUILTIN_MODULE_NAME "builtins"
-#if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2
-  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
-          PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
+  #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)
@@ -426,8 +495,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)
@@ -436,7 +509,11 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
   #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
@@ -542,10 +619,10 @@ 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) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func))
@@ -608,6 +685,9 @@ static CYTHON_INLINE float __PYX_NAN() {
 #include <string.h>
 #include <stdio.h>
 #include "numpy/arrayobject.h"
+#include "numpy/ndarrayobject.h"
+#include "numpy/ndarraytypes.h"
+#include "numpy/arrayscalars.h"
 #include "numpy/ufuncobject.h"
 
     /* NumPy API declarations from "numpy/__init__.pxd" */
@@ -708,6 +788,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
@@ -842,12 +923,12 @@ static const char *__pyx_filename;
 
 
 static const char *__pyx_f[] = {
-  "src\\mandelbrot.pyx",
+  "src/mandelbrot.pyx",
   "__init__.pxd",
   "type.pxd",
 };
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":697
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":690
  * # in Cython to enable them only on the right systems.
  * 
  * ctypedef npy_int8       int8_t             # <<<<<<<<<<<<<<
@@ -856,7 +937,7 @@ static const char *__pyx_f[] = {
  */
 typedef npy_int8 __pyx_t_5numpy_int8_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":698
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":691
  * 
  * ctypedef npy_int8       int8_t
  * ctypedef npy_int16      int16_t             # <<<<<<<<<<<<<<
@@ -865,7 +946,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t;
  */
 typedef npy_int16 __pyx_t_5numpy_int16_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":699
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":692
  * ctypedef npy_int8       int8_t
  * ctypedef npy_int16      int16_t
  * ctypedef npy_int32      int32_t             # <<<<<<<<<<<<<<
@@ -874,7 +955,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t;
  */
 typedef npy_int32 __pyx_t_5numpy_int32_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":700
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":693
  * ctypedef npy_int16      int16_t
  * ctypedef npy_int32      int32_t
  * ctypedef npy_int64      int64_t             # <<<<<<<<<<<<<<
@@ -883,7 +964,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t;
  */
 typedef npy_int64 __pyx_t_5numpy_int64_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":704
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":697
  * #ctypedef npy_int128     int128_t
  * 
  * ctypedef npy_uint8      uint8_t             # <<<<<<<<<<<<<<
@@ -892,7 +973,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t;
  */
 typedef npy_uint8 __pyx_t_5numpy_uint8_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":705
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":698
  * 
  * ctypedef npy_uint8      uint8_t
  * ctypedef npy_uint16     uint16_t             # <<<<<<<<<<<<<<
@@ -901,7 +982,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t;
  */
 typedef npy_uint16 __pyx_t_5numpy_uint16_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":706
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":699
  * ctypedef npy_uint8      uint8_t
  * ctypedef npy_uint16     uint16_t
  * ctypedef npy_uint32     uint32_t             # <<<<<<<<<<<<<<
@@ -910,7 +991,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t;
  */
 typedef npy_uint32 __pyx_t_5numpy_uint32_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":707
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":700
  * ctypedef npy_uint16     uint16_t
  * ctypedef npy_uint32     uint32_t
  * ctypedef npy_uint64     uint64_t             # <<<<<<<<<<<<<<
@@ -919,7 +1000,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t;
  */
 typedef npy_uint64 __pyx_t_5numpy_uint64_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":711
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":704
  * #ctypedef npy_uint128    uint128_t
  * 
  * ctypedef npy_float32    float32_t             # <<<<<<<<<<<<<<
@@ -928,7 +1009,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t;
  */
 typedef npy_float32 __pyx_t_5numpy_float32_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":712
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":705
  * 
  * ctypedef npy_float32    float32_t
  * ctypedef npy_float64    float64_t             # <<<<<<<<<<<<<<
@@ -937,7 +1018,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t;
  */
 typedef npy_float64 __pyx_t_5numpy_float64_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":721
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":714
  * # The int types are mapped a bit surprising --
  * # numpy.int corresponds to 'l' and numpy.long to 'q'
  * ctypedef npy_long       int_t             # <<<<<<<<<<<<<<
@@ -946,7 +1027,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t;
  */
 typedef npy_long __pyx_t_5numpy_int_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":722
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":715
  * # numpy.int corresponds to 'l' and numpy.long to 'q'
  * ctypedef npy_long       int_t
  * ctypedef npy_longlong   long_t             # <<<<<<<<<<<<<<
@@ -955,7 +1036,7 @@ typedef npy_long __pyx_t_5numpy_int_t;
  */
 typedef npy_longlong __pyx_t_5numpy_long_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":723
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":716
  * ctypedef npy_long       int_t
  * ctypedef npy_longlong   long_t
  * ctypedef npy_longlong   longlong_t             # <<<<<<<<<<<<<<
@@ -964,7 +1045,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t;
  */
 typedef npy_longlong __pyx_t_5numpy_longlong_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":725
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":718
  * ctypedef npy_longlong   longlong_t
  * 
  * ctypedef npy_ulong      uint_t             # <<<<<<<<<<<<<<
@@ -973,7 +1054,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t;
  */
 typedef npy_ulong __pyx_t_5numpy_uint_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":726
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":719
  * 
  * ctypedef npy_ulong      uint_t
  * ctypedef npy_ulonglong  ulong_t             # <<<<<<<<<<<<<<
@@ -982,7 +1063,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t;
  */
 typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":727
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":720
  * ctypedef npy_ulong      uint_t
  * ctypedef npy_ulonglong  ulong_t
  * ctypedef npy_ulonglong  ulonglong_t             # <<<<<<<<<<<<<<
@@ -991,7 +1072,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
  */
 typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":729
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":722
  * ctypedef npy_ulonglong  ulonglong_t
  * 
  * ctypedef npy_intp       intp_t             # <<<<<<<<<<<<<<
@@ -1000,7 +1081,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;
  */
 typedef npy_intp __pyx_t_5numpy_intp_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":730
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":723
  * 
  * ctypedef npy_intp       intp_t
  * ctypedef npy_uintp      uintp_t             # <<<<<<<<<<<<<<
@@ -1009,7 +1090,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t;
  */
 typedef npy_uintp __pyx_t_5numpy_uintp_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":732
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":725
  * ctypedef npy_uintp      uintp_t
  * 
  * ctypedef npy_double     float_t             # <<<<<<<<<<<<<<
@@ -1018,7 +1099,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t;
  */
 typedef npy_double __pyx_t_5numpy_float_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":733
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":726
  * 
  * ctypedef npy_double     float_t
  * ctypedef npy_double     double_t             # <<<<<<<<<<<<<<
@@ -1027,7 +1108,7 @@ typedef npy_double __pyx_t_5numpy_float_t;
  */
 typedef npy_double __pyx_t_5numpy_double_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":734
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":727
  * ctypedef npy_double     float_t
  * ctypedef npy_double     double_t
  * ctypedef npy_longdouble longdouble_t             # <<<<<<<<<<<<<<
@@ -1062,7 +1143,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do
 
 /*--- Type declarations ---*/
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":736
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":729
  * ctypedef npy_longdouble longdouble_t
  * 
  * ctypedef npy_cfloat      cfloat_t             # <<<<<<<<<<<<<<
@@ -1071,7 +1152,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do
  */
 typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":737
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":730
  * 
  * ctypedef npy_cfloat      cfloat_t
  * ctypedef npy_cdouble     cdouble_t             # <<<<<<<<<<<<<<
@@ -1080,7 +1161,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
  */
 typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":738
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":731
  * ctypedef npy_cfloat      cfloat_t
  * ctypedef npy_cdouble     cdouble_t
  * ctypedef npy_clongdouble clongdouble_t             # <<<<<<<<<<<<<<
@@ -1089,7 +1170,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
  */
 typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":740
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":733
  * ctypedef npy_clongdouble clongdouble_t
  * 
  * ctypedef npy_cdouble     complex_t             # <<<<<<<<<<<<<<
@@ -1206,34 +1287,9 @@ static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j);
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
                                                      int is_list, int wraparound, int boundscheck);
 
-/* DictGetItem.proto */
-#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY
-static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key);
-#define __Pyx_PyObject_Dict_GetItem(obj, name)\
-    (likely(PyDict_CheckExact(obj)) ?\
-     __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name))
-#else
-#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key)
-#define __Pyx_PyObject_Dict_GetItem(obj, name)  PyObject_GetItem(obj, name)
-#endif
-
-/* RaiseTooManyValuesToUnpack.proto */
-static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
-
-/* RaiseNeedMoreValuesToUnpack.proto */
-static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
-
-/* RaiseNoneIterError.proto */
-static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);
-
-/* ExtTypeTest.proto */
-static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type);
-
-/* PyObjectCall.proto */
-#if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw);
-#else
-#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw)
+/* GetTopmostException.proto */
+#if CYTHON_USE_EXC_INFO_STACK
+static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate);
 #endif
 
 /* PyThreadStateGet.proto */
@@ -1247,6 +1303,40 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg
 #define __Pyx_PyErr_Occurred()  PyErr_Occurred()
 #endif
 
+/* SaveResetException.proto */
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_ExceptionSave(type, value, tb)  __Pyx__ExceptionSave(__pyx_tstate, type, value, tb)
+static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
+#define __Pyx_ExceptionReset(type, value, tb)  __Pyx__ExceptionReset(__pyx_tstate, type, value, tb)
+static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb);
+#else
+#define __Pyx_ExceptionSave(type, value, tb)   PyErr_GetExcInfo(type, value, tb)
+#define __Pyx_ExceptionReset(type, value, tb)  PyErr_SetExcInfo(type, value, tb)
+#endif
+
+/* 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
+
+/* GetException.proto */
+#if CYTHON_FAST_THREAD_STATE
+#define __Pyx_GetException(type, value, tb)  __Pyx__GetException(__pyx_tstate, type, value, tb)
+static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
+#else
+static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb);
+#endif
+
+/* PyObjectCall.proto */
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw);
+#else
+#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw)
+#endif
+
 /* PyErrFetchRestore.proto */
 #if CYTHON_FAST_THREAD_STATE
 #define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL)
@@ -1275,76 +1365,6 @@ static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject
 /* RaiseException.proto */
 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause);
 
-/* PyCFunctionFastCall.proto */
-#if CYTHON_FAST_PYCCALL
-static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs);
-#else
-#define __Pyx_PyCFunction_FastCall(func, args, nargs)  (assert(0), NULL)
-#endif
-
-/* PyFunctionFastCall.proto */
-#if CYTHON_FAST_PYCALL
-#define __Pyx_PyFunction_FastCall(func, args, nargs)\
-    __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL)
-#if 1 || PY_VERSION_HEX < 0x030600B1
-static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs);
-#else
-#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs)
-#endif
-#define __Pyx_BUILD_ASSERT_EXPR(cond)\
-    (sizeof(char [1 - 2*!(cond)]) - 1)
-#ifndef Py_MEMBER_SIZE
-#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member)
-#endif
-  static size_t __pyx_pyframe_localsplus_offset = 0;
-  #include "frameobject.h"
-  #define __Pxy_PyFrame_Initialize_Offsets()\
-    ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\
-     (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus)))
-  #define __Pyx_PyFrame_GetLocalsplus(frame)\
-    (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset))
-#endif
-
-/* PyObjectCallMethO.proto */
-#if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg);
-#endif
-
-/* PyObjectCallOneArg.proto */
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg);
-
-/* GetTopmostException.proto */
-#if CYTHON_USE_EXC_INFO_STACK
-static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate);
-#endif
-
-/* SaveResetException.proto */
-#if CYTHON_FAST_THREAD_STATE
-#define __Pyx_ExceptionSave(type, value, tb)  __Pyx__ExceptionSave(__pyx_tstate, type, value, tb)
-static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
-#define __Pyx_ExceptionReset(type, value, tb)  __Pyx__ExceptionReset(__pyx_tstate, type, value, tb)
-static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb);
-#else
-#define __Pyx_ExceptionSave(type, value, tb)   PyErr_GetExcInfo(type, value, tb)
-#define __Pyx_ExceptionReset(type, value, tb)  PyErr_SetExcInfo(type, value, tb)
-#endif
-
-/* 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
-
-/* GetException.proto */
-#if CYTHON_FAST_THREAD_STATE
-#define __Pyx_GetException(type, value, tb)  __Pyx__GetException(__pyx_tstate, type, value, tb)
-static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
-#else
-static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb);
-#endif
-
 /* TypeImport.proto */
 #ifndef __PYX_HAVE_RT_ImportType_proto
 #define __PYX_HAVE_RT_ImportType_proto
@@ -1408,14 +1428,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_int(int value);
-
-/* CIntToPy.proto */
-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value);
-
-/* CIntToPy.proto */
-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value);
+/* GCCDiagnostics.proto */
+#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
+#define __Pyx_HAS_GCC_DIAGNOSTIC
+#endif
 
 /* RealImag.proto */
 #if CYTHON_CCOMPLEX
@@ -1515,15 +1531,21 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value)
     #endif
 #endif
 
-/* CIntToPy.proto */
-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value);
-
 /* CIntFromPy.proto */
 static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *);
 
+/* CIntToPy.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value);
+
 /* CIntFromPy.proto */
 static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *);
 
+/* CIntToPy.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value);
+
+/* CIntToPy.proto */
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value);
+
 /* CIntFromPy.proto */
 static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *);
 
@@ -1575,8 +1597,17 @@ static PyTypeObject *__pyx_ptype_5numpy_dtype = 0;
 static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0;
 static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0;
 static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0;
+static PyTypeObject *__pyx_ptype_5numpy_generic = 0;
+static PyTypeObject *__pyx_ptype_5numpy_number = 0;
+static PyTypeObject *__pyx_ptype_5numpy_integer = 0;
+static PyTypeObject *__pyx_ptype_5numpy_signedinteger = 0;
+static PyTypeObject *__pyx_ptype_5numpy_unsignedinteger = 0;
+static PyTypeObject *__pyx_ptype_5numpy_inexact = 0;
+static PyTypeObject *__pyx_ptype_5numpy_floating = 0;
+static PyTypeObject *__pyx_ptype_5numpy_complexfloating = 0;
+static PyTypeObject *__pyx_ptype_5numpy_flexible = 0;
+static PyTypeObject *__pyx_ptype_5numpy_character = 0;
 static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0;
-static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/
 
 /* Module declarations from 'mandelbrot' */
 static CYTHON_INLINE int __pyx_f_10mandelbrot_mandel(double, double, int); /*proto*/
@@ -1586,8 +1617,6 @@ int __pyx_module_is_main_mandelbrot = 0;
 
 /* Implementation of 'mandelbrot' */
 static PyObject *__pyx_builtin_range;
-static PyObject *__pyx_builtin_RuntimeError;
-static PyObject *__pyx_builtin_ValueError;
 static PyObject *__pyx_builtin_ImportError;
 static const char __pyx_k_dx[] = "dx";
 static const char __pyx_k_dy[] = "dy";
@@ -1608,25 +1637,14 @@ static const char __pyx_k_rows[] = "rows";
 static const char __pyx_k_test[] = "__test__";
 static const char __pyx_k_range[] = "range";
 static const char __pyx_k_shape[] = "shape";
-static const char __pyx_k_ValueError[] = "ValueError";
 static const char __pyx_k_mandelbrot[] = "mandelbrot";
 static const char __pyx_k_ImportError[] = "ImportError";
-static const char __pyx_k_RuntimeError[] = "RuntimeError";
 static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback";
-static const char __pyx_k_src_mandelbrot_pyx[] = "src\\mandelbrot.pyx";
+static const char __pyx_k_src_mandelbrot_pyx[] = "src/mandelbrot.pyx";
 static const char __pyx_k_Mandelbrot_algorithm[] = "Mandelbrot algorithm";
 static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import";
-static const char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)";
-static const char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd";
-static const char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported";
 static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import";
-static const char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short.";
-static PyObject *__pyx_kp_u_Format_string_allocated_too_shor;
-static PyObject *__pyx_kp_u_Format_string_allocated_too_shor_2;
 static PyObject *__pyx_n_s_ImportError;
-static PyObject *__pyx_kp_u_Non_native_byte_order_not_suppor;
-static PyObject *__pyx_n_s_RuntimeError;
-static PyObject *__pyx_n_s_ValueError;
 static PyObject *__pyx_n_s_cline_in_traceback;
 static PyObject *__pyx_n_s_col;
 static PyObject *__pyx_n_s_cols;
@@ -1647,7 +1665,6 @@ static PyObject *__pyx_n_s_rows;
 static PyObject *__pyx_n_s_shape;
 static PyObject *__pyx_kp_s_src_mandelbrot_pyx;
 static PyObject *__pyx_n_s_test;
-static PyObject *__pyx_kp_u_unknown_dtype_code_in_numpy_pxd;
 static PyObject *__pyx_n_s_x1;
 static PyObject *__pyx_n_s_x2;
 static PyObject *__pyx_n_s_y1;
@@ -1656,10 +1673,7 @@ static PyObject *__pyx_pf_10mandelbrot_mandelbrot(CYTHON_UNUSED PyObject *__pyx_
 static PyObject *__pyx_tuple_;
 static PyObject *__pyx_tuple__2;
 static PyObject *__pyx_tuple__3;
-static PyObject *__pyx_tuple__4;
-static PyObject *__pyx_tuple__5;
-static PyObject *__pyx_tuple__6;
-static PyObject *__pyx_codeobj__7;
+static PyObject *__pyx_codeobj__4;
 /* Late includes */
 
 /* "mandelbrot.pyx":14
@@ -2078,7 +2092,7 @@ static PyObject *__pyx_pf_10mandelbrot_mandelbrot(CYTHON_UNUSED PyObject *__pyx_
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":742
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":735
  * ctypedef npy_cdouble     complex_t
  * 
  * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
@@ -2095,7 +2109,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":743
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":736
  * 
  * cdef inline object PyArray_MultiIterNew1(a):
  *     return PyArray_MultiIterNew(1, <void*>a)             # <<<<<<<<<<<<<<
@@ -2103,13 +2117,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
  * cdef inline object PyArray_MultiIterNew2(a, b):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 743, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 736, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":742
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":735
  * ctypedef npy_cdouble     complex_t
  * 
  * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
@@ -2128,7 +2142,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":745
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":738
  *     return PyArray_MultiIterNew(1, <void*>a)
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
@@ -2145,7 +2159,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":746
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":739
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):
  *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)             # <<<<<<<<<<<<<<
@@ -2153,13 +2167,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
  * cdef inline object PyArray_MultiIterNew3(a, b, c):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 746, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 739, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":745
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":738
  *     return PyArray_MultiIterNew(1, <void*>a)
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
@@ -2178,7 +2192,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":748
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":741
  *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
@@ -2195,7 +2209,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":749
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":742
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):
  *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)             # <<<<<<<<<<<<<<
@@ -2203,13 +2217,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 749, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 742, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":748
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":741
  *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
@@ -2228,7 +2242,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":751
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":744
  *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
@@ -2245,7 +2259,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":752
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":745
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
  *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)             # <<<<<<<<<<<<<<
@@ -2253,13 +2267,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 752, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 745, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":751
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":744
  *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
@@ -2278,7 +2292,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":754
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":747
  *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
@@ -2295,7 +2309,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":755
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":748
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
  *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)             # <<<<<<<<<<<<<<
@@ -2303,13 +2317,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 755, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 748, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":754
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":747
  *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
@@ -2328,7 +2342,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":757
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":750
  *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):             # <<<<<<<<<<<<<<
@@ -2342,7 +2356,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":758
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":751
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  *     if PyDataType_HASSUBARRAY(d):             # <<<<<<<<<<<<<<
@@ -2352,7 +2366,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
   __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0);
   if (__pyx_t_1) {
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":759
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":752
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  *     if PyDataType_HASSUBARRAY(d):
  *         return <tuple>d.subarray.shape             # <<<<<<<<<<<<<<
@@ -2364,7 +2378,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
     __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape);
     goto __pyx_L0;
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":758
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":751
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  *     if PyDataType_HASSUBARRAY(d):             # <<<<<<<<<<<<<<
@@ -2373,12 +2387,12 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
  */
   }
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":761
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":754
  *         return <tuple>d.subarray.shape
  *     else:
  *         return ()             # <<<<<<<<<<<<<<
  * 
- * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:
+ * 
  */
   /*else*/ {
     __Pyx_XDECREF(__pyx_r);
@@ -2387,7 +2401,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
     goto __pyx_L0;
   }
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":757
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":750
  *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):             # <<<<<<<<<<<<<<
@@ -2402,884 +2416,135 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":763
- *         return ()
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":929
+ *     int _import_umath() except -1
  * 
- * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<
- *     # Recursive utility function used in __getbuffer__ to get format
- *     # string. The new location in the format string is returned.
+ * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
+ *     Py_INCREF(base) # important to do this before stealing the reference below!
+ *     PyArray_SetBaseObject(arr, base)
  */
 
-static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) {
-  PyArray_Descr *__pyx_v_child = 0;
-  int __pyx_v_endian_detector;
-  int __pyx_v_little_endian;
-  PyObject *__pyx_v_fields = 0;
-  PyObject *__pyx_v_childname = NULL;
-  PyObject *__pyx_v_new_offset = NULL;
-  PyObject *__pyx_v_t = NULL;
-  char *__pyx_r;
+static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) {
   __Pyx_RefNannyDeclarations
-  PyObject *__pyx_t_1 = NULL;
-  Py_ssize_t __pyx_t_2;
-  PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_t_5;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  long __pyx_t_8;
-  char *__pyx_t_9;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
-  __Pyx_RefNannySetupContext("_util_dtypestring", 0);
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":768
- * 
- *     cdef dtype child
- *     cdef int endian_detector = 1             # <<<<<<<<<<<<<<
- *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)
- *     cdef tuple fields
- */
-  __pyx_v_endian_detector = 1;
+  __Pyx_RefNannySetupContext("set_array_base", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":769
- *     cdef dtype child
- *     cdef int endian_detector = 1
- *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
- *     cdef tuple fields
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":930
  * 
- */
-  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":772
- *     cdef tuple fields
+ * cdef inline void set_array_base(ndarray arr, object base):
+ *     Py_INCREF(base) # important to do this before stealing the reference below!             # <<<<<<<<<<<<<<
+ *     PyArray_SetBaseObject(arr, base)
  * 
- *     for childname in descr.names:             # <<<<<<<<<<<<<<
- *         fields = descr.fields[childname]
- *         child, new_offset = fields
  */
-  if (unlikely(__pyx_v_descr->names == Py_None)) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
-    __PYX_ERR(1, 772, __pyx_L1_error)
-  }
-  __pyx_t_1 = __pyx_v_descr->names; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
-  for (;;) {
-    if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-    #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
-    __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(1, 772, __pyx_L1_error)
-    #else
-    __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 772, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_3);
-    #endif
-    __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3);
-    __pyx_t_3 = 0;
+  Py_INCREF(__pyx_v_base);
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":773
- * 
- *     for childname in descr.names:
- *         fields = descr.fields[childname]             # <<<<<<<<<<<<<<
- *         child, new_offset = fields
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":931
+ * cdef inline void set_array_base(ndarray arr, object base):
+ *     Py_INCREF(base) # important to do this before stealing the reference below!
+ *     PyArray_SetBaseObject(arr, base)             # <<<<<<<<<<<<<<
  * 
+ * cdef inline object get_array_base(ndarray arr):
  */
-    if (unlikely(__pyx_v_descr->fields == Py_None)) {
-      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
-      __PYX_ERR(1, 773, __pyx_L1_error)
-    }
-    __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 773, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_3);
-    if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_3)->tp_name), 0))) __PYX_ERR(1, 773, __pyx_L1_error)
-    __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3));
-    __pyx_t_3 = 0;
-
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":774
- *     for childname in descr.names:
- *         fields = descr.fields[childname]
- *         child, new_offset = fields             # <<<<<<<<<<<<<<
- * 
- *         if (end - f) - <int>(new_offset - offset[0]) < 15:
- */
-    if (likely(__pyx_v_fields != Py_None)) {
-      PyObject* sequence = __pyx_v_fields;
-      Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
-      if (unlikely(size != 2)) {
-        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
-        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-        __PYX_ERR(1, 774, __pyx_L1_error)
-      }
-      #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
-      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
-      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); 
-      __Pyx_INCREF(__pyx_t_3);
-      __Pyx_INCREF(__pyx_t_4);
-      #else
-      __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 774, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 774, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      #endif
-    } else {
-      __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 774, __pyx_L1_error)
-    }
-    if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) __PYX_ERR(1, 774, __pyx_L1_error)
-    __Pyx_XDECREF_SET(__pyx_v_child, ((PyArray_Descr *)__pyx_t_3));
-    __pyx_t_3 = 0;
-    __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4);
-    __pyx_t_4 = 0;
+  (void)(PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base));
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":776
- *         child, new_offset = fields
- * 
- *         if (end - f) - <int>(new_offset - offset[0]) < 15:             # <<<<<<<<<<<<<<
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":929
+ *     int _import_umath() except -1
  * 
+ * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
+ *     Py_INCREF(base) # important to do this before stealing the reference below!
+ *     PyArray_SetBaseObject(arr, base)
  */
-    __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 776, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 776, __pyx_L1_error)
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 776, __pyx_L1_error)
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0);
-    if (unlikely(__pyx_t_6)) {
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":777
- * 
- *         if (end - f) - <int>(new_offset - offset[0]) < 15:
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")             # <<<<<<<<<<<<<<
- * 
- *         if ((child.byteorder == c'>' and little_endian) or
- */
-      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 777, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __PYX_ERR(1, 777, __pyx_L1_error)
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":776
- *         child, new_offset = fields
- * 
- *         if (end - f) - <int>(new_offset - offset[0]) < 15:             # <<<<<<<<<<<<<<
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
- * 
- */
-    }
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+}
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":779
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":933
+ *     PyArray_SetBaseObject(arr, base)
  * 
- *         if ((child.byteorder == c'>' and little_endian) or             # <<<<<<<<<<<<<<
- *             (child.byteorder == c'<' and not little_endian)):
- *             raise ValueError(u"Non-native byte order not supported")
+ * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
+ *     base = PyArray_BASE(arr)
+ *     if base is NULL:
  */
-    __pyx_t_7 = ((__pyx_v_child->byteorder == '>') != 0);
-    if (!__pyx_t_7) {
-      goto __pyx_L8_next_or;
-    } else {
-    }
-    __pyx_t_7 = (__pyx_v_little_endian != 0);
-    if (!__pyx_t_7) {
-    } else {
-      __pyx_t_6 = __pyx_t_7;
-      goto __pyx_L7_bool_binop_done;
-    }
-    __pyx_L8_next_or:;
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":780
- * 
- *         if ((child.byteorder == c'>' and little_endian) or
- *             (child.byteorder == c'<' and not little_endian)):             # <<<<<<<<<<<<<<
- *             raise ValueError(u"Non-native byte order not supported")
- *             # One could encode it in the format string and have Cython
- */
-    __pyx_t_7 = ((__pyx_v_child->byteorder == '<') != 0);
-    if (__pyx_t_7) {
-    } else {
-      __pyx_t_6 = __pyx_t_7;
-      goto __pyx_L7_bool_binop_done;
-    }
-    __pyx_t_7 = ((!(__pyx_v_little_endian != 0)) != 0);
-    __pyx_t_6 = __pyx_t_7;
-    __pyx_L7_bool_binop_done:;
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) {
+  PyObject *__pyx_v_base;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("get_array_base", 0);
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":779
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":934
  * 
- *         if ((child.byteorder == c'>' and little_endian) or             # <<<<<<<<<<<<<<
- *             (child.byteorder == c'<' and not little_endian)):
- *             raise ValueError(u"Non-native byte order not supported")
- */
-    if (unlikely(__pyx_t_6)) {
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":781
- *         if ((child.byteorder == c'>' and little_endian) or
- *             (child.byteorder == c'<' and not little_endian)):
- *             raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
- *             # One could encode it in the format string and have Cython
- *             # complain instead, BUT: < and > in format strings also imply
- */
-      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 781, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __PYX_ERR(1, 781, __pyx_L1_error)
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":779
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
- * 
- *         if ((child.byteorder == c'>' and little_endian) or             # <<<<<<<<<<<<<<
- *             (child.byteorder == c'<' and not little_endian)):
- *             raise ValueError(u"Non-native byte order not supported")
+ * cdef inline object get_array_base(ndarray arr):
+ *     base = PyArray_BASE(arr)             # <<<<<<<<<<<<<<
+ *     if base is NULL:
+ *         return None
  */
-    }
+  __pyx_v_base = PyArray_BASE(__pyx_v_arr);
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":791
- * 
- *         # Output padding bytes
- *         while offset[0] < new_offset:             # <<<<<<<<<<<<<<
- *             f[0] = 120 # "x"; pad byte
- *             f += 1
- */
-    while (1) {
-      __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 791, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 791, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 791, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (!__pyx_t_6) break;
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":792
- *         # Output padding bytes
- *         while offset[0] < new_offset:
- *             f[0] = 120 # "x"; pad byte             # <<<<<<<<<<<<<<
- *             f += 1
- *             offset[0] += 1
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":935
+ * cdef inline object get_array_base(ndarray arr):
+ *     base = PyArray_BASE(arr)
+ *     if base is NULL:             # <<<<<<<<<<<<<<
+ *         return None
+ *     return <object>base
  */
-      (__pyx_v_f[0]) = 0x78;
+  __pyx_t_1 = ((__pyx_v_base == NULL) != 0);
+  if (__pyx_t_1) {
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":793
- *         while offset[0] < new_offset:
- *             f[0] = 120 # "x"; pad byte
- *             f += 1             # <<<<<<<<<<<<<<
- *             offset[0] += 1
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":936
+ *     base = PyArray_BASE(arr)
+ *     if base is NULL:
+ *         return None             # <<<<<<<<<<<<<<
+ *     return <object>base
  * 
  */
-      __pyx_v_f = (__pyx_v_f + 1);
+    __Pyx_XDECREF(__pyx_r);
+    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+    goto __pyx_L0;
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":794
- *             f[0] = 120 # "x"; pad byte
- *             f += 1
- *             offset[0] += 1             # <<<<<<<<<<<<<<
- * 
- *         offset[0] += child.itemsize
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":935
+ * cdef inline object get_array_base(ndarray arr):
+ *     base = PyArray_BASE(arr)
+ *     if base is NULL:             # <<<<<<<<<<<<<<
+ *         return None
+ *     return <object>base
  */
-      __pyx_t_8 = 0;
-      (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1);
-    }
+  }
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":796
- *             offset[0] += 1
- * 
- *         offset[0] += child.itemsize             # <<<<<<<<<<<<<<
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":937
+ *     if base is NULL:
+ *         return None
+ *     return <object>base             # <<<<<<<<<<<<<<
  * 
- *         if not PyDataType_HASFIELDS(child):
+ * # Versions of the import_* functions which are more suitable for
  */
-    __pyx_t_8 = 0;
-    (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize);
+  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(((PyObject *)__pyx_v_base));
+  __pyx_r = ((PyObject *)__pyx_v_base);
+  goto __pyx_L0;
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":798
- *         offset[0] += child.itemsize
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":933
+ *     PyArray_SetBaseObject(arr, base)
  * 
- *         if not PyDataType_HASFIELDS(child):             # <<<<<<<<<<<<<<
- *             t = child.type_num
- *             if end - f < 5:
+ * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
+ *     base = PyArray_BASE(arr)
+ *     if base is NULL:
  */
-    __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0);
-    if (__pyx_t_6) {
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":799
- * 
- *         if not PyDataType_HASFIELDS(child):
- *             t = child.type_num             # <<<<<<<<<<<<<<
- *             if end - f < 5:
- *                 raise RuntimeError(u"Format string allocated too short.")
- */
-      __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 799, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4);
-      __pyx_t_4 = 0;
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":800
- *         if not PyDataType_HASFIELDS(child):
- *             t = child.type_num
- *             if end - f < 5:             # <<<<<<<<<<<<<<
- *                 raise RuntimeError(u"Format string allocated too short.")
- * 
- */
-      __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0);
-      if (unlikely(__pyx_t_6)) {
-
-        /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":801
- *             t = child.type_num
- *             if end - f < 5:
- *                 raise RuntimeError(u"Format string allocated too short.")             # <<<<<<<<<<<<<<
- * 
- *             # Until ticket #99 is fixed, use integers to avoid warnings
- */
-        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 801, __pyx_L1_error)
-        __Pyx_GOTREF(__pyx_t_4);
-        __Pyx_Raise(__pyx_t_4, 0, 0, 0);
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        __PYX_ERR(1, 801, __pyx_L1_error)
-
-        /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":800
- *         if not PyDataType_HASFIELDS(child):
- *             t = child.type_num
- *             if end - f < 5:             # <<<<<<<<<<<<<<
- *                 raise RuntimeError(u"Format string allocated too short.")
- * 
- */
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":804
- * 
- *             # Until ticket #99 is fixed, use integers to avoid warnings
- *             if   t == NPY_BYTE:        f[0] =  98 #"b"             # <<<<<<<<<<<<<<
- *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"
- */
-      __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_BYTE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 804, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 804, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 804, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 98;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":805
- *             # Until ticket #99 is fixed, use integers to avoid warnings
- *             if   t == NPY_BYTE:        f[0] =  98 #"b"
- *             elif t == NPY_UBYTE:       f[0] =  66 #"B"             # <<<<<<<<<<<<<<
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"
- */
-      __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UBYTE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 805, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 805, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 805, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 66;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":806
- *             if   t == NPY_BYTE:        f[0] =  98 #"b"
- *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"             # <<<<<<<<<<<<<<
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"
- *             elif t == NPY_INT:         f[0] = 105 #"i"
- */
-      __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_SHORT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 806, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 806, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 806, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 0x68;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":807
- *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"             # <<<<<<<<<<<<<<
- *             elif t == NPY_INT:         f[0] = 105 #"i"
- *             elif t == NPY_UINT:        f[0] =  73 #"I"
- */
-      __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_USHORT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 807, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 807, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 807, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 72;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":808
- *             elif t == NPY_SHORT:       f[0] = 104 #"h"
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"
- *             elif t == NPY_INT:         f[0] = 105 #"i"             # <<<<<<<<<<<<<<
- *             elif t == NPY_UINT:        f[0] =  73 #"I"
- *             elif t == NPY_LONG:        f[0] = 108 #"l"
- */
-      __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_INT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 808, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 808, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 808, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 0x69;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":809
- *             elif t == NPY_USHORT:      f[0] =  72 #"H"
- *             elif t == NPY_INT:         f[0] = 105 #"i"
- *             elif t == NPY_UINT:        f[0] =  73 #"I"             # <<<<<<<<<<<<<<
- *             elif t == NPY_LONG:        f[0] = 108 #"l"
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"
- */
-      __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UINT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 809, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 809, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 809, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 73;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":810
- *             elif t == NPY_INT:         f[0] = 105 #"i"
- *             elif t == NPY_UINT:        f[0] =  73 #"I"
- *             elif t == NPY_LONG:        f[0] = 108 #"l"             # <<<<<<<<<<<<<<
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
- */
-      __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 810, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 810, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 810, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 0x6C;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":811
- *             elif t == NPY_UINT:        f[0] =  73 #"I"
- *             elif t == NPY_LONG:        f[0] = 108 #"l"
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"             # <<<<<<<<<<<<<<
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
- */
-      __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 811, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 811, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 811, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 76;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":812
- *             elif t == NPY_LONG:        f[0] = 108 #"l"
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"             # <<<<<<<<<<<<<<
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
- */
-      __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGLONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 812, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 812, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 812, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 0x71;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":813
- *             elif t == NPY_ULONG:       f[0] = 76  #"L"
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"             # <<<<<<<<<<<<<<
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
- */
-      __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 813, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 813, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 813, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 81;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":814
- *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"             # <<<<<<<<<<<<<<
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
- */
-      __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_FLOAT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 814, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 814, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 814, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 0x66;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":815
- *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"             # <<<<<<<<<<<<<<
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
- */
-      __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 815, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 815, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 815, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 0x64;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":816
- *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"             # <<<<<<<<<<<<<<
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
- */
-      __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 816, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 816, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 816, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 0x67;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":817
- *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf             # <<<<<<<<<<<<<<
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
- *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
- */
-      __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 817, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 817, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 817, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 90;
-        (__pyx_v_f[1]) = 0x66;
-        __pyx_v_f = (__pyx_v_f + 1);
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":818
- *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd             # <<<<<<<<<<<<<<
- *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
- *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
- */
-      __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 818, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 818, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 818, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 90;
-        (__pyx_v_f[1]) = 0x64;
-        __pyx_v_f = (__pyx_v_f + 1);
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":819
- *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
- *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg             # <<<<<<<<<<<<<<
- *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
- *             else:
- */
-      __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 819, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 819, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 819, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_6) {
-        (__pyx_v_f[0]) = 90;
-        (__pyx_v_f[1]) = 0x67;
-        __pyx_v_f = (__pyx_v_f + 1);
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":820
- *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
- *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
- *             elif t == NPY_OBJECT:      f[0] = 79 #"O"             # <<<<<<<<<<<<<<
- *             else:
- *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
- */
-      __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_OBJECT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 820, __pyx_L1_error)
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 820, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 820, __pyx_L1_error)
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (likely(__pyx_t_6)) {
-        (__pyx_v_f[0]) = 79;
-        goto __pyx_L15;
-      }
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":822
- *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
- *             else:
- *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
- *             f += 1
- *         else:
- */
-      /*else*/ {
-        __pyx_t_3 = __Pyx_PyUnicode_FormatSafe(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 822, __pyx_L1_error)
-        __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 822, __pyx_L1_error)
-        __Pyx_GOTREF(__pyx_t_4);
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        __Pyx_Raise(__pyx_t_4, 0, 0, 0);
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        __PYX_ERR(1, 822, __pyx_L1_error)
-      }
-      __pyx_L15:;
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":823
- *             else:
- *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
- *             f += 1             # <<<<<<<<<<<<<<
- *         else:
- *             # Cython ignores struct boundary information ("T{...}"),
- */
-      __pyx_v_f = (__pyx_v_f + 1);
-
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":798
- *         offset[0] += child.itemsize
- * 
- *         if not PyDataType_HASFIELDS(child):             # <<<<<<<<<<<<<<
- *             t = child.type_num
- *             if end - f < 5:
- */
-      goto __pyx_L13;
-    }
-
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":827
- *             # Cython ignores struct boundary information ("T{...}"),
- *             # so don't output it
- *             f = _util_dtypestring(child, f, end, offset)             # <<<<<<<<<<<<<<
- *     return f
- * 
- */
-    /*else*/ {
-      __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == ((char *)NULL))) __PYX_ERR(1, 827, __pyx_L1_error)
-      __pyx_v_f = __pyx_t_9;
-    }
-    __pyx_L13:;
-
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":772
- *     cdef tuple fields
- * 
- *     for childname in descr.names:             # <<<<<<<<<<<<<<
- *         fields = descr.fields[childname]
- *         child, new_offset = fields
- */
-  }
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":828
- *             # so don't output it
- *             f = _util_dtypestring(child, f, end, offset)
- *     return f             # <<<<<<<<<<<<<<
- * 
- * 
- */
-  __pyx_r = __pyx_v_f;
-  goto __pyx_L0;
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":763
- *         return ()
- * 
- * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<
- *     # Recursive utility function used in __getbuffer__ to get format
- *     # string. The new location in the format string is returned.
- */
-
-  /* function exit code */
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_AddTraceback("numpy._util_dtypestring", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XDECREF((PyObject *)__pyx_v_child);
-  __Pyx_XDECREF(__pyx_v_fields);
-  __Pyx_XDECREF(__pyx_v_childname);
-  __Pyx_XDECREF(__pyx_v_new_offset);
-  __Pyx_XDECREF(__pyx_v_t);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":943
- *     int _import_umath() except -1
- * 
- * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
- *     Py_INCREF(base) # important to do this before stealing the reference below!
- *     PyArray_SetBaseObject(arr, base)
- */
-
-static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) {
-  __Pyx_RefNannyDeclarations
-  __Pyx_RefNannySetupContext("set_array_base", 0);
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":944
- * 
- * cdef inline void set_array_base(ndarray arr, object base):
- *     Py_INCREF(base) # important to do this before stealing the reference below!             # <<<<<<<<<<<<<<
- *     PyArray_SetBaseObject(arr, base)
- * 
- */
-  Py_INCREF(__pyx_v_base);
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":945
- * cdef inline void set_array_base(ndarray arr, object base):
- *     Py_INCREF(base) # important to do this before stealing the reference below!
- *     PyArray_SetBaseObject(arr, base)             # <<<<<<<<<<<<<<
- * 
- * cdef inline object get_array_base(ndarray arr):
- */
-  (void)(PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base));
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":943
- *     int _import_umath() except -1
- * 
- * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
- *     Py_INCREF(base) # important to do this before stealing the reference below!
- *     PyArray_SetBaseObject(arr, base)
- */
-
-  /* function exit code */
-  __Pyx_RefNannyFinishContext();
-}
-
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":947
- *     PyArray_SetBaseObject(arr, base)
- * 
- * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
- *     base = PyArray_BASE(arr)
- *     if base is NULL:
- */
-
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) {
-  PyObject *__pyx_v_base;
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannyDeclarations
-  int __pyx_t_1;
-  __Pyx_RefNannySetupContext("get_array_base", 0);
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":948
- * 
- * cdef inline object get_array_base(ndarray arr):
- *     base = PyArray_BASE(arr)             # <<<<<<<<<<<<<<
- *     if base is NULL:
- *         return None
- */
-  __pyx_v_base = PyArray_BASE(__pyx_v_arr);
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":949
- * cdef inline object get_array_base(ndarray arr):
- *     base = PyArray_BASE(arr)
- *     if base is NULL:             # <<<<<<<<<<<<<<
- *         return None
- *     return <object>base
- */
-  __pyx_t_1 = ((__pyx_v_base == NULL) != 0);
-  if (__pyx_t_1) {
-
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":950
- *     base = PyArray_BASE(arr)
- *     if base is NULL:
- *         return None             # <<<<<<<<<<<<<<
- *     return <object>base
- * 
- */
-    __Pyx_XDECREF(__pyx_r);
-    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-    goto __pyx_L0;
-
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":949
- * cdef inline object get_array_base(ndarray arr):
- *     base = PyArray_BASE(arr)
- *     if base is NULL:             # <<<<<<<<<<<<<<
- *         return None
- *     return <object>base
- */
-  }
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":951
- *     if base is NULL:
- *         return None
- *     return <object>base             # <<<<<<<<<<<<<<
- * 
- * # Versions of the import_* functions which are more suitable for
- */
-  __Pyx_XDECREF(__pyx_r);
-  __Pyx_INCREF(((PyObject *)__pyx_v_base));
-  __pyx_r = ((PyObject *)__pyx_v_base);
-  goto __pyx_L0;
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":947
- *     PyArray_SetBaseObject(arr, base)
- * 
- * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
- *     base = PyArray_BASE(arr)
- *     if base is NULL:
- */
-
-  /* function exit code */
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":955
- * # Versions of the import_* functions which are more suitable for
- * # Cython code.
- * cdef inline int import_array() except -1:             # <<<<<<<<<<<<<<
- *     try:
- *         __pyx_import_array()
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":941
+ * # Versions of the import_* functions which are more suitable for
+ * # Cython code.
+ * cdef inline int import_array() except -1:             # <<<<<<<<<<<<<<
+ *     try:
+ *         __pyx_import_array()
  */
 
 static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
@@ -3298,7 +2563,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("import_array", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":956
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":942
  * # Cython code.
  * cdef inline int import_array() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3314,16 +2579,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":957
+      /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":943
  * cdef inline int import_array() except -1:
  *     try:
  *         __pyx_import_array()             # <<<<<<<<<<<<<<
  *     except Exception:
  *         raise ImportError("numpy.core.multiarray failed to import")
  */
-      __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 957, __pyx_L3_error)
+      __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 943, __pyx_L3_error)
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":956
+      /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":942
  * # Cython code.
  * cdef inline int import_array() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3337,7 +2602,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     goto __pyx_L8_try_end;
     __pyx_L3_error:;
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":958
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":944
  *     try:
  *         __pyx_import_array()
  *     except Exception:             # <<<<<<<<<<<<<<
@@ -3347,28 +2612,28 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
     if (__pyx_t_4) {
       __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 958, __pyx_L5_except_error)
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 944, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_GOTREF(__pyx_t_7);
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":959
+      /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":945
  *         __pyx_import_array()
  *     except Exception:
  *         raise ImportError("numpy.core.multiarray failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_umath() except -1:
  */
-      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 959, __pyx_L5_except_error)
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 945, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_Raise(__pyx_t_8, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __PYX_ERR(1, 959, __pyx_L5_except_error)
+      __PYX_ERR(1, 945, __pyx_L5_except_error)
     }
     goto __pyx_L5_except_error;
     __pyx_L5_except_error:;
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":956
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":942
  * # Cython code.
  * cdef inline int import_array() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3383,7 +2648,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     __pyx_L8_try_end:;
   }
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":955
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":941
  * # Versions of the import_* functions which are more suitable for
  * # Cython code.
  * cdef inline int import_array() except -1:             # <<<<<<<<<<<<<<
@@ -3406,7 +2671,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":961
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":947
  *         raise ImportError("numpy.core.multiarray failed to import")
  * 
  * cdef inline int import_umath() except -1:             # <<<<<<<<<<<<<<
@@ -3430,7 +2695,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("import_umath", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":962
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":948
  * 
  * cdef inline int import_umath() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3446,16 +2711,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":963
+      /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":949
  * cdef inline int import_umath() except -1:
  *     try:
  *         _import_umath()             # <<<<<<<<<<<<<<
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")
  */
-      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 963, __pyx_L3_error)
+      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 949, __pyx_L3_error)
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":962
+      /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":948
  * 
  * cdef inline int import_umath() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3469,7 +2734,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     goto __pyx_L8_try_end;
     __pyx_L3_error:;
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":964
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":950
  *     try:
  *         _import_umath()
  *     except Exception:             # <<<<<<<<<<<<<<
@@ -3479,28 +2744,28 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
     if (__pyx_t_4) {
       __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 964, __pyx_L5_except_error)
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 950, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_GOTREF(__pyx_t_7);
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":965
+      /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":951
  *         _import_umath()
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_ufunc() except -1:
  */
-      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 965, __pyx_L5_except_error)
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 951, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_Raise(__pyx_t_8, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __PYX_ERR(1, 965, __pyx_L5_except_error)
+      __PYX_ERR(1, 951, __pyx_L5_except_error)
     }
     goto __pyx_L5_except_error;
     __pyx_L5_except_error:;
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":962
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":948
  * 
  * cdef inline int import_umath() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3515,7 +2780,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     __pyx_L8_try_end:;
   }
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":961
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":947
  *         raise ImportError("numpy.core.multiarray failed to import")
  * 
  * cdef inline int import_umath() except -1:             # <<<<<<<<<<<<<<
@@ -3538,7 +2803,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
   return __pyx_r;
 }
 
-/* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":967
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":953
  *         raise ImportError("numpy.core.umath failed to import")
  * 
  * cdef inline int import_ufunc() except -1:             # <<<<<<<<<<<<<<
@@ -3562,7 +2827,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("import_ufunc", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":968
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":954
  * 
  * cdef inline int import_ufunc() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3578,16 +2843,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":969
+      /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":955
  * cdef inline int import_ufunc() except -1:
  *     try:
  *         _import_umath()             # <<<<<<<<<<<<<<
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")
  */
-      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 969, __pyx_L3_error)
+      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 955, __pyx_L3_error)
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":968
+      /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":954
  * 
  * cdef inline int import_ufunc() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3601,7 +2866,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     goto __pyx_L8_try_end;
     __pyx_L3_error:;
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":970
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":956
  *     try:
  *         _import_umath()
  *     except Exception:             # <<<<<<<<<<<<<<
@@ -3611,28 +2876,28 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
     if (__pyx_t_4) {
       __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 970, __pyx_L5_except_error)
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 956, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_GOTREF(__pyx_t_7);
 
-      /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":971
+      /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":957
  *         _import_umath()
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef extern from *:
  */
-      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 971, __pyx_L5_except_error)
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 957, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_Raise(__pyx_t_8, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __PYX_ERR(1, 971, __pyx_L5_except_error)
+      __PYX_ERR(1, 957, __pyx_L5_except_error)
     }
     goto __pyx_L5_except_error;
     __pyx_L5_except_error:;
 
-    /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":968
+    /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":954
  * 
  * cdef inline int import_ufunc() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3647,7 +2912,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     __pyx_L8_try_end:;
   }
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":967
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":953
  *         raise ImportError("numpy.core.umath failed to import")
  * 
  * cdef inline int import_ufunc() except -1:             # <<<<<<<<<<<<<<
@@ -3670,58 +2935,227 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
   return __pyx_r;
 }
 
-static PyMethodDef __pyx_methods[] = {
-  {0, 0, 0, 0}
-};
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":967
+ * 
+ * 
+ * cdef inline bint is_timedelta64_object(object obj):             # <<<<<<<<<<<<<<
+ *     """
+ *     Cython equivalent of `isinstance(obj, np.timedelta64)`
+ */
 
-#if PY_MAJOR_VERSION >= 3
-#if CYTHON_PEP489_MULTI_PHASE_INIT
-static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/
-static int __pyx_pymod_exec_mandelbrot(PyObject* module); /*proto*/
-static PyModuleDef_Slot __pyx_moduledef_slots[] = {
-  {Py_mod_create, (void*)__pyx_pymod_create},
-  {Py_mod_exec, (void*)__pyx_pymod_exec_mandelbrot},
-  {0, NULL}
-};
-#endif
+static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_obj) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("is_timedelta64_object", 0);
 
-static struct PyModuleDef __pyx_moduledef = {
-    PyModuleDef_HEAD_INIT,
-    "mandelbrot",
-    __pyx_k_Mandelbrot_algorithm, /* m_doc */
-  #if CYTHON_PEP489_MULTI_PHASE_INIT
-    0, /* m_size */
-  #else
-    -1, /* m_size */
-  #endif
-    __pyx_methods /* m_methods */,
-  #if CYTHON_PEP489_MULTI_PHASE_INIT
-    __pyx_moduledef_slots, /* m_slots */
-  #else
-    NULL, /* m_reload */
-  #endif
-    NULL, /* m_traverse */
-    NULL, /* m_clear */
-    NULL /* m_free */
-};
-#endif
-#ifndef CYTHON_SMALL_CODE
-#if defined(__clang__)
-    #define CYTHON_SMALL_CODE
-#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
-    #define CYTHON_SMALL_CODE __attribute__((cold))
-#else
-    #define CYTHON_SMALL_CODE
-#endif
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":979
+ *     bool
+ *     """
+ *     return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyTimedeltaArrType_Type));
+  goto __pyx_L0;
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":967
+ * 
+ * 
+ * cdef inline bint is_timedelta64_object(object obj):             # <<<<<<<<<<<<<<
+ *     """
+ *     Cython equivalent of `isinstance(obj, np.timedelta64)`
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":982
+ * 
+ * 
+ * cdef inline bint is_datetime64_object(object obj):             # <<<<<<<<<<<<<<
+ *     """
+ *     Cython equivalent of `isinstance(obj, np.datetime64)`
+ */
+
+static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_obj) {
+  int __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("is_datetime64_object", 0);
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":994
+ *     bool
+ *     """
+ *     return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type)             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyDatetimeArrType_Type));
+  goto __pyx_L0;
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":982
+ * 
+ * 
+ * cdef inline bint is_datetime64_object(object obj):             # <<<<<<<<<<<<<<
+ *     """
+ *     Cython equivalent of `isinstance(obj, np.datetime64)`
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":997
+ * 
+ * 
+ * cdef inline npy_datetime get_datetime64_value(object obj) nogil:             # <<<<<<<<<<<<<<
+ *     """
+ *     returns the int64 value underlying scalar numpy datetime64 object
+ */
+
+static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *__pyx_v_obj) {
+  npy_datetime __pyx_r;
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":1004
+ *     also needed.  That can be found using `get_datetime64_unit`.
+ *     """
+ *     return (<PyDatetimeScalarObject*>obj).obval             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = ((PyDatetimeScalarObject *)__pyx_v_obj)->obval;
+  goto __pyx_L0;
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":997
+ * 
+ * 
+ * cdef inline npy_datetime get_datetime64_value(object obj) nogil:             # <<<<<<<<<<<<<<
+ *     """
+ *     returns the int64 value underlying scalar numpy datetime64 object
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":1007
+ * 
+ * 
+ * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil:             # <<<<<<<<<<<<<<
+ *     """
+ *     returns the int64 value underlying scalar numpy timedelta64 object
+ */
+
+static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject *__pyx_v_obj) {
+  npy_timedelta __pyx_r;
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":1011
+ *     returns the int64 value underlying scalar numpy timedelta64 object
+ *     """
+ *     return (<PyTimedeltaScalarObject*>obj).obval             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = ((PyTimedeltaScalarObject *)__pyx_v_obj)->obval;
+  goto __pyx_L0;
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":1007
+ * 
+ * 
+ * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil:             # <<<<<<<<<<<<<<
+ *     """
+ *     returns the int64 value underlying scalar numpy timedelta64 object
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+/* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":1014
+ * 
+ * 
+ * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil:             # <<<<<<<<<<<<<<
+ *     """
+ *     returns the unit part of the dtype for a numpy datetime64 object.
+ */
+
+static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObject *__pyx_v_obj) {
+  NPY_DATETIMEUNIT __pyx_r;
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":1018
+ *     returns the unit part of the dtype for a numpy datetime64 object.
+ *     """
+ *     return <NPY_DATETIMEUNIT>(<PyDatetimeScalarObject*>obj).obmeta.base             # <<<<<<<<<<<<<<
+ */
+  __pyx_r = ((NPY_DATETIMEUNIT)((PyDatetimeScalarObject *)__pyx_v_obj)->obmeta.base);
+  goto __pyx_L0;
+
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":1014
+ * 
+ * 
+ * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil:             # <<<<<<<<<<<<<<
+ *     """
+ *     returns the unit part of the dtype for a numpy datetime64 object.
+ */
+
+  /* function exit code */
+  __pyx_L0:;
+  return __pyx_r;
+}
+
+static PyMethodDef __pyx_methods[] = {
+  {0, 0, 0, 0}
+};
+
+#if PY_MAJOR_VERSION >= 3
+#if CYTHON_PEP489_MULTI_PHASE_INIT
+static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/
+static int __pyx_pymod_exec_mandelbrot(PyObject* module); /*proto*/
+static PyModuleDef_Slot __pyx_moduledef_slots[] = {
+  {Py_mod_create, (void*)__pyx_pymod_create},
+  {Py_mod_exec, (void*)__pyx_pymod_exec_mandelbrot},
+  {0, NULL}
+};
+#endif
+
+static struct PyModuleDef __pyx_moduledef = {
+    PyModuleDef_HEAD_INIT,
+    "mandelbrot",
+    __pyx_k_Mandelbrot_algorithm, /* m_doc */
+  #if CYTHON_PEP489_MULTI_PHASE_INIT
+    0, /* m_size */
+  #else
+    -1, /* m_size */
+  #endif
+    __pyx_methods /* m_methods */,
+  #if CYTHON_PEP489_MULTI_PHASE_INIT
+    __pyx_moduledef_slots, /* m_slots */
+  #else
+    NULL, /* m_reload */
+  #endif
+    NULL, /* m_traverse */
+    NULL, /* m_clear */
+    NULL /* m_free */
+};
+#endif
+#ifndef CYTHON_SMALL_CODE
+#if defined(__clang__)
+    #define CYTHON_SMALL_CODE
+#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
+    #define CYTHON_SMALL_CODE __attribute__((cold))
+#else
+    #define CYTHON_SMALL_CODE
+#endif
 #endif
 
 static __Pyx_StringTabEntry __pyx_string_tab[] = {
-  {&__pyx_kp_u_Format_string_allocated_too_shor, __pyx_k_Format_string_allocated_too_shor, sizeof(__pyx_k_Format_string_allocated_too_shor), 0, 1, 0, 0},
-  {&__pyx_kp_u_Format_string_allocated_too_shor_2, __pyx_k_Format_string_allocated_too_shor_2, sizeof(__pyx_k_Format_string_allocated_too_shor_2), 0, 1, 0, 0},
   {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1},
-  {&__pyx_kp_u_Non_native_byte_order_not_suppor, __pyx_k_Non_native_byte_order_not_suppor, sizeof(__pyx_k_Non_native_byte_order_not_suppor), 0, 1, 0, 0},
-  {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 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},
   {&__pyx_n_s_col, __pyx_k_col, sizeof(__pyx_k_col), 0, 0, 1, 1},
   {&__pyx_n_s_cols, __pyx_k_cols, sizeof(__pyx_k_cols), 0, 0, 1, 1},
@@ -3742,7 +3176,6 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s_shape, __pyx_k_shape, sizeof(__pyx_k_shape), 0, 0, 1, 1},
   {&__pyx_kp_s_src_mandelbrot_pyx, __pyx_k_src_mandelbrot_pyx, sizeof(__pyx_k_src_mandelbrot_pyx), 0, 0, 1, 0},
   {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1},
-  {&__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_k_unknown_dtype_code_in_numpy_pxd, sizeof(__pyx_k_unknown_dtype_code_in_numpy_pxd), 0, 1, 0, 0},
   {&__pyx_n_s_x1, __pyx_k_x1, sizeof(__pyx_k_x1), 0, 0, 1, 1},
   {&__pyx_n_s_x2, __pyx_k_x2, sizeof(__pyx_k_x2), 0, 0, 1, 1},
   {&__pyx_n_s_y1, __pyx_k_y1, sizeof(__pyx_k_y1), 0, 0, 1, 1},
@@ -3751,9 +3184,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
 };
 static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) {
   __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 17, __pyx_L1_error)
-  __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(1, 777, __pyx_L1_error)
-  __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(1, 781, __pyx_L1_error)
-  __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 959, __pyx_L1_error)
+  __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 945, __pyx_L1_error)
   return 0;
   __pyx_L1_error:;
   return -1;
@@ -3763,60 +3194,27 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":777
- * 
- *         if (end - f) - <int>(new_offset - offset[0]) < 15:
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")             # <<<<<<<<<<<<<<
- * 
- *         if ((child.byteorder == c'>' and little_endian) or
- */
-  __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple_)) __PYX_ERR(1, 777, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_tuple_);
-  __Pyx_GIVEREF(__pyx_tuple_);
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":781
- *         if ((child.byteorder == c'>' and little_endian) or
- *             (child.byteorder == c'<' and not little_endian)):
- *             raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
- *             # One could encode it in the format string and have Cython
- *             # complain instead, BUT: < and > in format strings also imply
- */
-  __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 781, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_tuple__2);
-  __Pyx_GIVEREF(__pyx_tuple__2);
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":801
- *             t = child.type_num
- *             if end - f < 5:
- *                 raise RuntimeError(u"Format string allocated too short.")             # <<<<<<<<<<<<<<
- * 
- *             # Until ticket #99 is fixed, use integers to avoid warnings
- */
-  __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(1, 801, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_tuple__3);
-  __Pyx_GIVEREF(__pyx_tuple__3);
-
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":959
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":945
  *         __pyx_import_array()
  *     except Exception:
  *         raise ImportError("numpy.core.multiarray failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_umath() except -1:
  */
-  __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(1, 959, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_tuple__4);
-  __Pyx_GIVEREF(__pyx_tuple__4);
+  __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple_)) __PYX_ERR(1, 945, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple_);
+  __Pyx_GIVEREF(__pyx_tuple_);
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":965
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":951
  *         _import_umath()
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_ufunc() except -1:
  */
-  __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(1, 965, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_tuple__5);
-  __Pyx_GIVEREF(__pyx_tuple__5);
+  __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 951, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__2);
+  __Pyx_GIVEREF(__pyx_tuple__2);
 
   /* "mandelbrot.pyx":25
  * 
@@ -3825,10 +3223,10 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
  *                data, unsigned int nmax):
  *     """Compute Mandelbrot fractal"""
  */
-  __pyx_tuple__6 = PyTuple_Pack(14, __pyx_n_s_x1, __pyx_n_s_y1, __pyx_n_s_x2, __pyx_n_s_y2, __pyx_n_s_data, __pyx_n_s_nmax, __pyx_n_s_dx, __pyx_n_s_dy, __pyx_n_s_real, __pyx_n_s_imag, __pyx_n_s_row, __pyx_n_s_col, __pyx_n_s_rows, __pyx_n_s_cols); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 25, __pyx_L1_error)
-  __Pyx_GOTREF(__pyx_tuple__6);
-  __Pyx_GIVEREF(__pyx_tuple__6);
-  __pyx_codeobj__7 = (PyObject*)__Pyx_PyCode_New(6, 0, 14, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__6, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_mandelbrot_pyx, __pyx_n_s_mandelbrot, 25, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__7)) __PYX_ERR(0, 25, __pyx_L1_error)
+  __pyx_tuple__3 = PyTuple_Pack(14, __pyx_n_s_x1, __pyx_n_s_y1, __pyx_n_s_x2, __pyx_n_s_y2, __pyx_n_s_data, __pyx_n_s_nmax, __pyx_n_s_dx, __pyx_n_s_dy, __pyx_n_s_real, __pyx_n_s_imag, __pyx_n_s_row, __pyx_n_s_col, __pyx_n_s_rows, __pyx_n_s_cols); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 25, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__3);
+  __Pyx_GIVEREF(__pyx_tuple__3);
+  __pyx_codeobj__4 = (PyObject*)__Pyx_PyCode_New(6, 0, 14, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__3, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_mandelbrot_pyx, __pyx_n_s_mandelbrot, 25, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__4)) __PYX_ERR(0, 25, __pyx_L1_error)
   __Pyx_RefNannyFinishContext();
   return 0;
   __pyx_L1_error:;
@@ -3902,18 +3300,38 @@ static int __Pyx_modinit_type_import_code(void) {
   __Pyx_ImportType_CheckSize_Warn);
    if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 207, __pyx_L1_error)
+  __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 200, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_ptype_5numpy_dtype = __Pyx_ImportType(__pyx_t_1, "numpy", "dtype", sizeof(PyArray_Descr), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(1, 207, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(1, 200, __pyx_L1_error)
   __pyx_ptype_5numpy_flatiter = __Pyx_ImportType(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(1, 230, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(1, 223, __pyx_L1_error)
   __pyx_ptype_5numpy_broadcast = __Pyx_ImportType(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(1, 234, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(1, 227, __pyx_L1_error)
   __pyx_ptype_5numpy_ndarray = __Pyx_ImportType(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(1, 246, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(1, 239, __pyx_L1_error)
+  __pyx_ptype_5numpy_generic = __Pyx_ImportType(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_generic) __PYX_ERR(1, 771, __pyx_L1_error)
+  __pyx_ptype_5numpy_number = __Pyx_ImportType(__pyx_t_1, "numpy", "number", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_number) __PYX_ERR(1, 773, __pyx_L1_error)
+  __pyx_ptype_5numpy_integer = __Pyx_ImportType(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_integer) __PYX_ERR(1, 775, __pyx_L1_error)
+  __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(1, 777, __pyx_L1_error)
+  __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(1, 779, __pyx_L1_error)
+  __pyx_ptype_5numpy_inexact = __Pyx_ImportType(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(1, 781, __pyx_L1_error)
+  __pyx_ptype_5numpy_floating = __Pyx_ImportType(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_floating) __PYX_ERR(1, 783, __pyx_L1_error)
+  __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(1, 785, __pyx_L1_error)
+  __pyx_ptype_5numpy_flexible = __Pyx_ImportType(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(1, 787, __pyx_L1_error)
+  __pyx_ptype_5numpy_character = __Pyx_ImportType(__pyx_t_1, "numpy", "character", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
+   if (!__pyx_ptype_5numpy_character) __PYX_ERR(1, 789, __pyx_L1_error)
   __pyx_ptype_5numpy_ufunc = __Pyx_ImportType(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(1, 839, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(1, 827, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_RefNannyFinishContext();
   return 0;
@@ -4084,11 +3502,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;
@@ -4163,12 +3579,12 @@ if (!__Pyx_RefNanny) {
   if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "../../Apps/WPy64-3850/python-3.8.5.amd64/lib/site-packages/numpy/__init__.pxd":967
- *         raise ImportError("numpy.core.umath failed to import")
+  /* "../../../usr/lib/python3/dist-packages/numpy/__init__.pxd":1014
  * 
- * cdef inline int import_ufunc() except -1:             # <<<<<<<<<<<<<<
- *     try:
- *         _import_umath()
+ * 
+ * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil:             # <<<<<<<<<<<<<<
+ *     """
+ *     returns the unit part of the dtype for a numpy datetime64 object.
  */
 
   /*--- Wrapped vars code ---*/
@@ -4470,78 +3886,178 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
     return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
 }
 
-/* DictGetItem */
-#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY
-static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) {
-    PyObject *value;
-    value = PyDict_GetItemWithError(d, key);
-    if (unlikely(!value)) {
-        if (!PyErr_Occurred()) {
-            if (unlikely(PyTuple_Check(key))) {
-                PyObject* args = PyTuple_Pack(1, key);
-                if (likely(args)) {
-                    PyErr_SetObject(PyExc_KeyError, args);
-                    Py_DECREF(args);
-                }
-            } else {
-                PyErr_SetObject(PyExc_KeyError, key);
-            }
-        }
-        return NULL;
+/* GetTopmostException */
+#if CYTHON_USE_EXC_INFO_STACK
+static _PyErr_StackItem *
+__Pyx_PyErr_GetTopmostException(PyThreadState *tstate)
+{
+    _PyErr_StackItem *exc_info = tstate->exc_info;
+    while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) &&
+           exc_info->previous_item != NULL)
+    {
+        exc_info = exc_info->previous_item;
     }
-    Py_INCREF(value);
-    return value;
+    return exc_info;
 }
 #endif
 
-/* RaiseTooManyValuesToUnpack */
-static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {
-    PyErr_Format(PyExc_ValueError,
-                 "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected);
-}
-
-/* RaiseNeedMoreValuesToUnpack */
-static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
-    PyErr_Format(PyExc_ValueError,
-                 "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack",
-                 index, (index == 1) ? "" : "s");
+/* SaveResetException */
+#if CYTHON_FAST_THREAD_STATE
+static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
+    #if CYTHON_USE_EXC_INFO_STACK
+    _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate);
+    *type = exc_info->exc_type;
+    *value = exc_info->exc_value;
+    *tb = exc_info->exc_traceback;
+    #else
+    *type = tstate->exc_type;
+    *value = tstate->exc_value;
+    *tb = tstate->exc_traceback;
+    #endif
+    Py_XINCREF(*type);
+    Py_XINCREF(*value);
+    Py_XINCREF(*tb);
 }
-
-/* RaiseNoneIterError */
-static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) {
+    PyObject *tmp_type, *tmp_value, *tmp_tb;
+    #if CYTHON_USE_EXC_INFO_STACK
+    _PyErr_StackItem *exc_info = tstate->exc_info;
+    tmp_type = exc_info->exc_type;
+    tmp_value = exc_info->exc_value;
+    tmp_tb = exc_info->exc_traceback;
+    exc_info->exc_type = type;
+    exc_info->exc_value = value;
+    exc_info->exc_traceback = tb;
+    #else
+    tmp_type = tstate->exc_type;
+    tmp_value = tstate->exc_value;
+    tmp_tb = tstate->exc_traceback;
+    tstate->exc_type = type;
+    tstate->exc_value = value;
+    tstate->exc_traceback = tb;
+    #endif
+    Py_XDECREF(tmp_type);
+    Py_XDECREF(tmp_value);
+    Py_XDECREF(tmp_tb);
 }
+#endif
 
-/* ExtTypeTest */
-static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
-    if (unlikely(!type)) {
-        PyErr_SetString(PyExc_SystemError, "Missing type object");
-        return 0;
+/* PyErrExceptionMatches */
+#if CYTHON_FAST_THREAD_STATE
+static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) {
+    Py_ssize_t i, n;
+    n = PyTuple_GET_SIZE(tuple);
+#if PY_MAJOR_VERSION >= 3
+    for (i=0; i<n; i++) {
+        if (exc_type == PyTuple_GET_ITEM(tuple, i)) return 1;
+    }
+#endif
+    for (i=0; i<n; i++) {
+        if (__Pyx_PyErr_GivenExceptionMatches(exc_type, PyTuple_GET_ITEM(tuple, i))) return 1;
     }
-    if (likely(__Pyx_TypeCheck(obj, type)))
-        return 1;
-    PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s",
-                 Py_TYPE(obj)->tp_name, type->tp_name);
     return 0;
 }
-
-/* PyObjectCall */
-#if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) {
-    PyObject *result;
-    ternaryfunc call = func->ob_type->tp_call;
-    if (unlikely(!call))
-        return PyObject_Call(func, arg, kw);
-    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
-        return NULL;
-    result = (*call)(func, arg, kw);
-    Py_LeaveRecursiveCall();
-    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
-        PyErr_SetString(
-            PyExc_SystemError,
-            "NULL result without error in PyObject_Call");
-    }
-    return result;
+static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err) {
+    PyObject *exc_type = tstate->curexc_type;
+    if (exc_type == err) return 1;
+    if (unlikely(!exc_type)) return 0;
+    if (unlikely(PyTuple_Check(err)))
+        return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err);
+    return __Pyx_PyErr_GivenExceptionMatches(exc_type, err);
+}
+#endif
+
+/* GetException */
+#if CYTHON_FAST_THREAD_STATE
+static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb)
+#else
+static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
+#endif
+{
+    PyObject *local_type, *local_value, *local_tb;
+#if CYTHON_FAST_THREAD_STATE
+    PyObject *tmp_type, *tmp_value, *tmp_tb;
+    local_type = tstate->curexc_type;
+    local_value = tstate->curexc_value;
+    local_tb = tstate->curexc_traceback;
+    tstate->curexc_type = 0;
+    tstate->curexc_value = 0;
+    tstate->curexc_traceback = 0;
+#else
+    PyErr_Fetch(&local_type, &local_value, &local_tb);
+#endif
+    PyErr_NormalizeException(&local_type, &local_value, &local_tb);
+#if CYTHON_FAST_THREAD_STATE
+    if (unlikely(tstate->curexc_type))
+#else
+    if (unlikely(PyErr_Occurred()))
+#endif
+        goto bad;
+    #if PY_MAJOR_VERSION >= 3
+    if (local_tb) {
+        if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0))
+            goto bad;
+    }
+    #endif
+    Py_XINCREF(local_tb);
+    Py_XINCREF(local_type);
+    Py_XINCREF(local_value);
+    *type = local_type;
+    *value = local_value;
+    *tb = local_tb;
+#if CYTHON_FAST_THREAD_STATE
+    #if CYTHON_USE_EXC_INFO_STACK
+    {
+        _PyErr_StackItem *exc_info = tstate->exc_info;
+        tmp_type = exc_info->exc_type;
+        tmp_value = exc_info->exc_value;
+        tmp_tb = exc_info->exc_traceback;
+        exc_info->exc_type = local_type;
+        exc_info->exc_value = local_value;
+        exc_info->exc_traceback = local_tb;
+    }
+    #else
+    tmp_type = tstate->exc_type;
+    tmp_value = tstate->exc_value;
+    tmp_tb = tstate->exc_traceback;
+    tstate->exc_type = local_type;
+    tstate->exc_value = local_value;
+    tstate->exc_traceback = local_tb;
+    #endif
+    Py_XDECREF(tmp_type);
+    Py_XDECREF(tmp_value);
+    Py_XDECREF(tmp_tb);
+#else
+    PyErr_SetExcInfo(local_type, local_value, local_tb);
+#endif
+    return 0;
+bad:
+    *type = 0;
+    *value = 0;
+    *tb = 0;
+    Py_XDECREF(local_type);
+    Py_XDECREF(local_value);
+    Py_XDECREF(local_tb);
+    return -1;
+}
+
+/* PyObjectCall */
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) {
+    PyObject *result;
+    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")))
+        return NULL;
+    result = (*call)(func, arg, kw);
+    Py_LeaveRecursiveCall();
+    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
+        PyErr_SetString(
+            PyExc_SystemError,
+            "NULL result without error in PyObject_Call");
+    }
+    return result;
 }
 #endif
 
@@ -4707,383 +4223,26 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
     PyErr_SetObject(type, value);
     if (tb) {
 #if CYTHON_COMPILING_IN_PYPY
-        PyObject *tmp_type, *tmp_value, *tmp_tb;
-        PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb);
-        Py_INCREF(tb);
-        PyErr_Restore(tmp_type, tmp_value, tb);
-        Py_XDECREF(tmp_tb);
-#else
-        PyThreadState *tstate = __Pyx_PyThreadState_Current;
-        PyObject* tmp_tb = tstate->curexc_traceback;
-        if (tb != tmp_tb) {
-            Py_INCREF(tb);
-            tstate->curexc_traceback = tb;
-            Py_XDECREF(tmp_tb);
-        }
-#endif
-    }
-bad:
-    Py_XDECREF(owned_instance);
-    return;
-}
-#endif
-
-/* PyCFunctionFastCall */
-#if CYTHON_FAST_PYCCALL
-static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) {
-    PyCFunctionObject *func = (PyCFunctionObject*)func_obj;
-    PyCFunction meth = PyCFunction_GET_FUNCTION(func);
-    PyObject *self = PyCFunction_GET_SELF(func);
-    int flags = PyCFunction_GET_FLAGS(func);
-    assert(PyCFunction_Check(func));
-    assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS)));
-    assert(nargs >= 0);
-    assert(nargs == 0 || args != NULL);
-    /* _PyCFunction_FastCallDict() must not be called with an exception set,
-       because it may clear it (directly or indirectly) and so the
-       caller loses its exception */
-    assert(!PyErr_Occurred());
-    if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) {
-        return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL);
-    } else {
-        return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs);
-    }
-}
-#endif
-
-/* PyFunctionFastCall */
-#if CYTHON_FAST_PYCALL
-static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na,
-                                               PyObject *globals) {
-    PyFrameObject *f;
-    PyThreadState *tstate = __Pyx_PyThreadState_Current;
-    PyObject **fastlocals;
-    Py_ssize_t i;
-    PyObject *result;
-    assert(globals != NULL);
-    /* XXX Perhaps we should create a specialized
-       PyFrame_New() that doesn't take locals, but does
-       take builtins without sanity checking them.
-       */
-    assert(tstate != NULL);
-    f = PyFrame_New(tstate, co, globals, NULL);
-    if (f == NULL) {
-        return NULL;
-    }
-    fastlocals = __Pyx_PyFrame_GetLocalsplus(f);
-    for (i = 0; i < na; i++) {
-        Py_INCREF(*args);
-        fastlocals[i] = *args++;
-    }
-    result = PyEval_EvalFrameEx(f,0);
-    ++tstate->recursion_depth;
-    Py_DECREF(f);
-    --tstate->recursion_depth;
-    return result;
-}
-#if 1 || PY_VERSION_HEX < 0x030600B1
-static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) {
-    PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
-    PyObject *globals = PyFunction_GET_GLOBALS(func);
-    PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
-    PyObject *closure;
-#if PY_MAJOR_VERSION >= 3
-    PyObject *kwdefs;
-#endif
-    PyObject *kwtuple, **k;
-    PyObject **d;
-    Py_ssize_t nd;
-    Py_ssize_t nk;
-    PyObject *result;
-    assert(kwargs == NULL || PyDict_Check(kwargs));
-    nk = kwargs ? PyDict_Size(kwargs) : 0;
-    if (Py_EnterRecursiveCall((char*)" while calling a Python object")) {
-        return NULL;
-    }
-    if (
-#if PY_MAJOR_VERSION >= 3
-            co->co_kwonlyargcount == 0 &&
-#endif
-            likely(kwargs == NULL || nk == 0) &&
-            co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
-        if (argdefs == NULL && co->co_argcount == nargs) {
-            result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals);
-            goto done;
-        }
-        else if (nargs == 0 && argdefs != NULL
-                 && co->co_argcount == Py_SIZE(argdefs)) {
-            /* function called with no arguments, but all parameters have
-               a default value: use default values as arguments .*/
-            args = &PyTuple_GET_ITEM(argdefs, 0);
-            result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals);
-            goto done;
-        }
-    }
-    if (kwargs != NULL) {
-        Py_ssize_t pos, i;
-        kwtuple = PyTuple_New(2 * nk);
-        if (kwtuple == NULL) {
-            result = NULL;
-            goto done;
-        }
-        k = &PyTuple_GET_ITEM(kwtuple, 0);
-        pos = i = 0;
-        while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) {
-            Py_INCREF(k[i]);
-            Py_INCREF(k[i+1]);
-            i += 2;
-        }
-        nk = i / 2;
-    }
-    else {
-        kwtuple = NULL;
-        k = NULL;
-    }
-    closure = PyFunction_GET_CLOSURE(func);
-#if PY_MAJOR_VERSION >= 3
-    kwdefs = PyFunction_GET_KW_DEFAULTS(func);
-#endif
-    if (argdefs != NULL) {
-        d = &PyTuple_GET_ITEM(argdefs, 0);
-        nd = Py_SIZE(argdefs);
-    }
-    else {
-        d = NULL;
-        nd = 0;
-    }
-#if PY_MAJOR_VERSION >= 3
-    result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL,
-                               args, (int)nargs,
-                               k, (int)nk,
-                               d, (int)nd, kwdefs, closure);
-#else
-    result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL,
-                               args, (int)nargs,
-                               k, (int)nk,
-                               d, (int)nd, closure);
-#endif
-    Py_XDECREF(kwtuple);
-done:
-    Py_LeaveRecursiveCall();
-    return result;
-}
-#endif
-#endif
-
-/* PyObjectCallMethO */
-#if CYTHON_COMPILING_IN_CPYTHON
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) {
-    PyObject *self, *result;
-    PyCFunction cfunc;
-    cfunc = PyCFunction_GET_FUNCTION(func);
-    self = PyCFunction_GET_SELF(func);
-    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
-        return NULL;
-    result = cfunc(self, arg);
-    Py_LeaveRecursiveCall();
-    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
-        PyErr_SetString(
-            PyExc_SystemError,
-            "NULL result without error in PyObject_Call");
-    }
-    return result;
-}
-#endif
-
-/* PyObjectCallOneArg */
-#if CYTHON_COMPILING_IN_CPYTHON
-static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) {
-    PyObject *result;
-    PyObject *args = PyTuple_New(1);
-    if (unlikely(!args)) return NULL;
-    Py_INCREF(arg);
-    PyTuple_SET_ITEM(args, 0, arg);
-    result = __Pyx_PyObject_Call(func, args, NULL);
-    Py_DECREF(args);
-    return result;
-}
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
-#if CYTHON_FAST_PYCALL
-    if (PyFunction_Check(func)) {
-        return __Pyx_PyFunction_FastCall(func, &arg, 1);
-    }
-#endif
-    if (likely(PyCFunction_Check(func))) {
-        if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) {
-            return __Pyx_PyObject_CallMethO(func, arg);
-#if CYTHON_FAST_PYCCALL
-        } else if (PyCFunction_GET_FLAGS(func) & METH_FASTCALL) {
-            return __Pyx_PyCFunction_FastCall(func, &arg, 1);
-#endif
-        }
-    }
-    return __Pyx__PyObject_CallOneArg(func, arg);
-}
-#else
-static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
-    PyObject *result;
-    PyObject *args = PyTuple_Pack(1, arg);
-    if (unlikely(!args)) return NULL;
-    result = __Pyx_PyObject_Call(func, args, NULL);
-    Py_DECREF(args);
-    return result;
-}
-#endif
-
-/* GetTopmostException */
-#if CYTHON_USE_EXC_INFO_STACK
-static _PyErr_StackItem *
-__Pyx_PyErr_GetTopmostException(PyThreadState *tstate)
-{
-    _PyErr_StackItem *exc_info = tstate->exc_info;
-    while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) &&
-           exc_info->previous_item != NULL)
-    {
-        exc_info = exc_info->previous_item;
-    }
-    return exc_info;
-}
-#endif
-
-/* SaveResetException */
-#if CYTHON_FAST_THREAD_STATE
-static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
-    #if CYTHON_USE_EXC_INFO_STACK
-    _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate);
-    *type = exc_info->exc_type;
-    *value = exc_info->exc_value;
-    *tb = exc_info->exc_traceback;
-    #else
-    *type = tstate->exc_type;
-    *value = tstate->exc_value;
-    *tb = tstate->exc_traceback;
-    #endif
-    Py_XINCREF(*type);
-    Py_XINCREF(*value);
-    Py_XINCREF(*tb);
-}
-static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) {
-    PyObject *tmp_type, *tmp_value, *tmp_tb;
-    #if CYTHON_USE_EXC_INFO_STACK
-    _PyErr_StackItem *exc_info = tstate->exc_info;
-    tmp_type = exc_info->exc_type;
-    tmp_value = exc_info->exc_value;
-    tmp_tb = exc_info->exc_traceback;
-    exc_info->exc_type = type;
-    exc_info->exc_value = value;
-    exc_info->exc_traceback = tb;
-    #else
-    tmp_type = tstate->exc_type;
-    tmp_value = tstate->exc_value;
-    tmp_tb = tstate->exc_traceback;
-    tstate->exc_type = type;
-    tstate->exc_value = value;
-    tstate->exc_traceback = tb;
-    #endif
-    Py_XDECREF(tmp_type);
-    Py_XDECREF(tmp_value);
-    Py_XDECREF(tmp_tb);
-}
-#endif
-
-/* PyErrExceptionMatches */
-#if CYTHON_FAST_THREAD_STATE
-static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) {
-    Py_ssize_t i, n;
-    n = PyTuple_GET_SIZE(tuple);
-#if PY_MAJOR_VERSION >= 3
-    for (i=0; i<n; i++) {
-        if (exc_type == PyTuple_GET_ITEM(tuple, i)) return 1;
-    }
-#endif
-    for (i=0; i<n; i++) {
-        if (__Pyx_PyErr_GivenExceptionMatches(exc_type, PyTuple_GET_ITEM(tuple, i))) return 1;
-    }
-    return 0;
-}
-static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err) {
-    PyObject *exc_type = tstate->curexc_type;
-    if (exc_type == err) return 1;
-    if (unlikely(!exc_type)) return 0;
-    if (unlikely(PyTuple_Check(err)))
-        return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err);
-    return __Pyx_PyErr_GivenExceptionMatches(exc_type, err);
-}
-#endif
-
-/* GetException */
-#if CYTHON_FAST_THREAD_STATE
-static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb)
-#else
-static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
-#endif
-{
-    PyObject *local_type, *local_value, *local_tb;
-#if CYTHON_FAST_THREAD_STATE
-    PyObject *tmp_type, *tmp_value, *tmp_tb;
-    local_type = tstate->curexc_type;
-    local_value = tstate->curexc_value;
-    local_tb = tstate->curexc_traceback;
-    tstate->curexc_type = 0;
-    tstate->curexc_value = 0;
-    tstate->curexc_traceback = 0;
-#else
-    PyErr_Fetch(&local_type, &local_value, &local_tb);
-#endif
-    PyErr_NormalizeException(&local_type, &local_value, &local_tb);
-#if CYTHON_FAST_THREAD_STATE
-    if (unlikely(tstate->curexc_type))
-#else
-    if (unlikely(PyErr_Occurred()))
-#endif
-        goto bad;
-    #if PY_MAJOR_VERSION >= 3
-    if (local_tb) {
-        if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0))
-            goto bad;
-    }
-    #endif
-    Py_XINCREF(local_tb);
-    Py_XINCREF(local_type);
-    Py_XINCREF(local_value);
-    *type = local_type;
-    *value = local_value;
-    *tb = local_tb;
-#if CYTHON_FAST_THREAD_STATE
-    #if CYTHON_USE_EXC_INFO_STACK
-    {
-        _PyErr_StackItem *exc_info = tstate->exc_info;
-        tmp_type = exc_info->exc_type;
-        tmp_value = exc_info->exc_value;
-        tmp_tb = exc_info->exc_traceback;
-        exc_info->exc_type = local_type;
-        exc_info->exc_value = local_value;
-        exc_info->exc_traceback = local_tb;
-    }
-    #else
-    tmp_type = tstate->exc_type;
-    tmp_value = tstate->exc_value;
-    tmp_tb = tstate->exc_traceback;
-    tstate->exc_type = local_type;
-    tstate->exc_value = local_value;
-    tstate->exc_traceback = local_tb;
-    #endif
-    Py_XDECREF(tmp_type);
-    Py_XDECREF(tmp_value);
-    Py_XDECREF(tmp_tb);
+        PyObject *tmp_type, *tmp_value, *tmp_tb;
+        PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb);
+        Py_INCREF(tb);
+        PyErr_Restore(tmp_type, tmp_value, tb);
+        Py_XDECREF(tmp_tb);
 #else
-    PyErr_SetExcInfo(local_type, local_value, local_tb);
+        PyThreadState *tstate = __Pyx_PyThreadState_Current;
+        PyObject* tmp_tb = tstate->curexc_traceback;
+        if (tb != tmp_tb) {
+            Py_INCREF(tb);
+            tstate->curexc_traceback = tb;
+            Py_XDECREF(tmp_tb);
+        }
 #endif
-    return 0;
+    }
 bad:
-    *type = 0;
-    *value = 0;
-    *tb = 0;
-    Py_XDECREF(local_type);
-    Py_XDECREF(local_value);
-    Py_XDECREF(local_tb);
-    return -1;
+    Py_XDECREF(owned_instance);
+    return;
 }
+#endif
 
 /* TypeImport */
 #ifndef __PYX_HAVE_RT_ImportType
@@ -5204,7 +4363,7 @@ static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int
     }
     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;
@@ -5301,30 +4460,31 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
 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,
@@ -5343,11 +4503,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,
@@ -5401,99 +4566,6 @@ 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_long(long value) {
-    const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (is_unsigned) {
-        if (sizeof(long) < sizeof(long)) {
-            return PyInt_FromLong((long) value);
-        } else if (sizeof(long) <= sizeof(unsigned long)) {
-            return PyLong_FromUnsignedLong((unsigned long) value);
-#ifdef HAVE_LONG_LONG
-        } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) {
-            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
-#endif
-        }
-    } else {
-        if (sizeof(long) <= sizeof(long)) {
-            return PyInt_FromLong((long) value);
-#ifdef HAVE_LONG_LONG
-        } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) {
-            return PyLong_FromLongLong((PY_LONG_LONG) value);
-#endif
-        }
-    }
-    {
-        int one = 1; int little = (int)*(unsigned char *)&one;
-        unsigned char *bytes = (unsigned char *)&value;
-        return _PyLong_FromByteArray(bytes, sizeof(long),
-                                     little, !is_unsigned);
-    }
-}
-
-/* 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);
-    }
-}
-
 /* Declarations */
 #if CYTHON_CCOMPLEX
   #ifdef __cplusplus
@@ -5802,40 +4874,16 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value)
     #endif
 #endif
 
-/* CIntToPy */
-static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value) {
-    const enum NPY_TYPES neg_one = (enum NPY_TYPES) ((enum NPY_TYPES) 0 - (enum NPY_TYPES) 1), const_zero = (enum NPY_TYPES) 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (is_unsigned) {
-        if (sizeof(enum NPY_TYPES) < sizeof(long)) {
-            return PyInt_FromLong((long) value);
-        } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned long)) {
-            return PyLong_FromUnsignedLong((unsigned long) value);
-#ifdef HAVE_LONG_LONG
-        } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned PY_LONG_LONG)) {
-            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
-#endif
-        }
-    } else {
-        if (sizeof(enum NPY_TYPES) <= sizeof(long)) {
-            return PyInt_FromLong((long) value);
-#ifdef HAVE_LONG_LONG
-        } else if (sizeof(enum NPY_TYPES) <= 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(enum NPY_TYPES),
-                                     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))) {
@@ -6022,9 +5070,54 @@ raise_neg_overflow:
     return (unsigned 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);
+    }
+}
+
 /* 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))) {
@@ -6211,9 +5304,92 @@ raise_neg_overflow:
     return (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);
+    }
+}
+
+/* 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);
+    }
+}
+
 /* 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))) {
@@ -6718,7 +5894,7 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
     const digit* digits = ((PyLongObject*)b)->ob_digit;
     const Py_ssize_t size = Py_SIZE(b);
     if (likely(__Pyx_sst_abs(size) <= 1)) {
-        ival = likely(size) ? (Py_ssize_t)(digits[0]) : 0;
+        ival = likely(size) ? digits[0] : 0;
         if (size == -1) ival = -ival;
         return ival;
     } else {
@@ -6764,6 +5940,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/src/pcolor.cpp b/src/pcolor.cpp
index 06d680f..4e4d8e2 100644
--- a/src/pcolor.cpp
+++ b/src/pcolor.cpp
@@ -1,446 +1,446 @@
-/* -*- coding: utf-8;mode:c++;c-file-style:"stroustrup" -*- */
-/*
-  Copyright © 2010-2011 CEA
-  Ludovic Aubry
-  Licensed under the terms of the CECILL License
-  (see guiqwt/__init__.py for details)
-*/
-#include <Python.h>
-#define NO_IMPORT_ARRAY
-#define PY_ARRAY_UNIQUE_SYMBOL PyScalerArray
-#include <numpy/arrayobject.h>
-#ifdef _MSC_VER
-    #include <float.h>
-    #pragma fenv_access (on)
-#else
-    #include <fenv.h>
-#endif
-#include <math.h>
-#if defined(_MSC_VER) || defined(__MINGW32__)
-    #define isnan(x) _isnan(x)
-#endif
-#include <stdio.h>
-#include <algorithm>
-#include <vector>
-#include "arrays.hpp"
-#include "scaler.hpp"
-
-using std::vector;
-using std::min;
-using std::max;
-using std::swap;
-
-#if 0
-/** return min(max(a,b,c,d),bound) */
-    static int max4(int a, int b, int c, int d, int bound)
-{
-    int x, y, z;
-    x = (a>b ? a : b);
-    y = (c>d ? c : d);
-    z = (x>y ? x : y);
-    return (z>bound ? bound : z);
-}
-
-/** return max(min(a,b,c,d),bound) */
-    static int min4(int a, int b, int c, int d, int bound)
-{
-    int x, y, z;
-    x = (a<b ? a : b);
-    y = (c<d ? c : d);
-    z = (x<y ? x : y);
-    return (z<bound ? bound : z);
-}
-#endif
-
-static bool vert_line(double _x0, double _y0, double _x1, double _y1, int NX,
-		      vector<int>& imin, vector<int>& imax,
-		      bool draw, npy_uint32 col, Array2D<npy_uint32>& D)
-{
-    int x0 = lrint(_x0);
-    int y0 = lrint(_y0);
-    int x1 = lrint(_x1);
-    int y1 = lrint(_y1);
-    int dx = abs(x1-x0);
-    int dy = abs(y1-y0);
-    int sx, sy;
-    int NY=imin.size()-1;
-    int err, e2;
-    bool visible=false;
-    NX = NX-1;
-    if (x0 < x1)
-	sx = 1;
-    else
-	sx = -1;
-    if (y0 < y1)
-	sy = 1;
-    else
-	sy = -1;
-    err = dx-dy;
-
-    do {
-	if (y0>=0 && y0<=NY) {
-	    int _min = min(imin[y0],x0);
-	    int _max = max(imax[y0],x0);
-	    if (draw) {
-		if (x0>=0 && x0<=NX) {
-		    D.value(x0,y0) = col;
-		}
-	    }
-	    imin[y0] = max( 0,_min);
-	    imax[y0] = min(NX,_max);
-	    if (_min<=NX && _max>=0) {
-		visible=true;
-	    }
-	}
-	if ((x0 == x1) && (y0 == y1))
-	    break;
-	e2 = 2*err;
-	if (e2 > -dy) {
-	    err = err - dy;
-	    x0 = x0 + sx;
-	}
-	if (e2 <  dx) {
-	    err = err + dx;
-	    y0 = y0 + sy;
-	}
-    } while(true);
-    return visible;
-}
-
-
-template<class T>
-struct QuadHelper {
-    const Array2D<T>& X;
-    const Array2D<T>& Y;
-    const Array2D<T>& Z;
-    Array2D<npy_uint32>& D;
-    LutScale<T,npy_uint32>& scale;
-    double x1, x2, y1, y2, m_dx, m_dy;
-    npy_uint32 bgcolor;
-    bool border;
-    bool flat;
-    double uflat, vflat;
-    int ixmin, ixmax, iymin, iymax;
-
-    QuadHelper( const Array2D<T>& X_,
-		const Array2D<T>& Y_,
-		const Array2D<T>& Z_,
-		Array2D<npy_uint32>& D_,
-		LutScale<T,npy_uint32>& scale_,
-		double x1_, double x2_, double y1_, double y2_,
-		bool _border, bool _flat,
-		double _uflat, double _vflat
-	):X(X_), Y(Y_), Z(Z_), D(D_), scale(scale_),
-	  x1(x1_), x2(x2_), y1(y1_), y2(y2_),
-	  bgcolor(0xff000000),
-	  border(_border),
-	  flat(_flat),uflat(_uflat),vflat(_vflat)
-	{
-	    m_dx = D.nj/(x2-x1);
-	    m_dy = D.ni/(y2-y1);
-	}
-
-    void draw_triangles() {
-	int i, j;
-	vector<int> imin, imax;
-	imin.resize(D.ni);
-	imax.resize(D.ni);
-	ixmin = D.nj;
-	iymin = D.ni;
-	ixmax = -1;
-	iymax = -1;
-	for(i=0;i<X.ni-1;++i) {
-	    for(j=0;j<X.nj-1;++j) {
-		draw_quad(i,j,imin,imax);
-	    }
-	}
-    }
-
-    void draw_quad(int qi, int qj,
-		   vector<int>& imin, vector<int>& imax
-	) {
-	int i,j;
-	double u, v;
-	double v0, v1, v2, v3, v4;
-	// Coordonnees du quad dans l'offscreen
-	double ax = (X.value(qj+0,qi+0)-x1)*m_dx, ay=(Y.value(qj+0,qi+0)-y1)*m_dy;
-	double bx = (X.value(qj+0,qi+1)-x1)*m_dx, by=(Y.value(qj+0,qi+1)-y1)*m_dy;
-	double cx = (X.value(qj+1,qi+1)-x1)*m_dx, cy=(Y.value(qj+1,qi+1)-y1)*m_dy;
-	double dx = (X.value(qj+1,qi+0)-x1)*m_dx, dy=(Y.value(qj+1,qi+0)-y1)*m_dy;
-	// indice des sommets (A,B,C,D)<->0,1,2,3<->(qi,qj),(qi+1,qj),(qi+1,qj+1),(qi,qj+1)
-	// trie par ordre x croissant ou y croissant (selon xarg, yarg)
-	double ymin = min(ay,min(by,min(cy,dy)));
-	double ymax = max(ay,max(by,max(cy,dy)));
-
-	int i0 = int(ymin+.5);
-	int i1 = int(ymax+.5);
-//	printf("Quads: i=%d->%d\n", i0, i1);
-
-	if (i0<0) i0=0;
-	if (i1>=D.ni) i1=D.ni-1;
-	if (i1<i0) return;
-
-	iymin = min(iymin,i0);
-	iymax = max(iymax,i1);
-	for(i=i0;i<=i1;++i) {
-	    imax[i]=-1;
-	    imin[i]=D.nj;
-	}
-
-	// Compute the rasterized border of the quad
-	bool visible = false;
-	visible |= vert_line(ax,ay,bx,by,D.nj,imin,imax, border, 0xff000000, D);
-	visible |= vert_line(bx,by,cx,cy,D.nj,imin,imax, border, 0xff000000, D);
-	visible |= vert_line(cx,cy,dx,dy,D.nj,imin,imax, border, 0xff000000, D);
-	visible |= vert_line(dx,dy,ax,ay,D.nj,imin,imax, border, 0xff000000, D);
-	if (!visible)
-	    return;
-
-	double ex = ax+cx-dx-bx;
-	double ey = ay+cy-dy-by;
-	double n = 1./sqrt((cx-ax)*(cx-ax)+(cy-ay)*(cy-ay));
-	if (n>1e2) n = 1.0;
-
-	// Normalize vectors with ||AC||
-	ax *= n; ay *= n;
-	bx = bx*n-ax; by = by*n-ay;
-	cx = cx*n-ax; cy = cy*n-ay;
-	dx = dx*n-ax; dy = dy*n-ay;
-	ex *= n; ey *= n;
-
-	v1 = Z.value(qj,qi);
-	v2 = Z.value(qj+1,qi);
-	v3 = Z.value(qj+1,qi+1);
-	v4 = Z.value(qj,qi+1);
-
-	if (isnan(v1) || isnan(v2) || isnan(v3) || isnan(v4)) {
-	    // XXX Color = Alpha
-	    return ;
-	}
-	int dm=0, dM=0;
-	if (border) {
-	    dm=1;dM=-1;
-	}
-	npy_uint32 col = scale.eval( v1*(1-vflat)*(1-uflat) +
-				 v2*  vflat  *(1-uflat) +
-				 v3*  vflat  *  uflat   +
-				 v4*(1-vflat)*  uflat   );
-	for(i=i0+dm;i<=i1+dM;++i) {
-	    ixmin = min(ixmin,imin[i]);
-	    ixmax = max(ixmax,imax[i]);
-	    int jmin=max(0,imin[i])+dm;
-	    int jmax=min(imax[i],D.nj-1)+dM;
-	    for(j=jmin;j<=jmax;++j) {
-		if (!flat) {
-		    params(j*n,i*n, ax,ay, bx,by, cx,cy, dx,dy, ex,ey, u,v);
-		    if (u<0) u=0.; else if (u>1.) u=1.;
-		    if (v<0) v=0.; else if (v>1.) v=1.;
-		    /* v0 = v1*(1-v)*(1-u) + v2*v*(1-u) + v3*v*u + v4*(1-v)*u; */
-		    v0 = u*( v*(v1-v2+v3-v4)+v4-v1 ) + v*(v2-v1) + v1;
-		    col = scale.eval(v0);
-		}
-		D.value(j,i) = col;
-	    }
-	}
-    }
-
-    void params(double x, double y,
-		double ax, double ay,
-		double bx, double by,
-		double cx, double cy,
-		double dx, double dy,
-		double ex, double ey,
-		double& u, double&v) {
-	/* solves AM=u.AB+v.AD+uv.AE with A,B,C,D quad, AE=DC+BA
-	   M = (x,y)
-	   with u^2.(AB^AE) +u.(AB^AD+AE^AM)+AD^AM=0
-	   v = (AM-u.AB)/(AD+u.AE)
-	*/
-
-	double mx = x-ax, my = y-ay;
-	double a1, a2, b, c, delta;
-
-	if (false && (ex*ex+ey*ey)<1e-8) {
-	    // fast case : parallelogram
-	    if (fabs(dy)>1e-16) {
-		double a=dx/dy;
-		u = (mx-a*y)/(bx-a*by);
-		v = (my-u*by)/dy;
-		return ;
-	    } else {
-		double a=dy/dx;
-		u = (my-a*x)/(by-a*bx);
-		v = (mx-u*bx)/dx;
-		return ;
-	    }
-	}
-	a1 = bx*ey-ex*by;
-	a2 = dx*ey-ex*dy;
-	if (a1>a2) {
-	    b = bx*dy-dx*by + ex*my-mx*ey;
-	    c = dx*my-mx*dy;
-	    if (fabs(a1)>1e-8) {
-		delta = b*b-4*a1*c;
-		u = (-b+sqrt(delta))/(2*a1);
-	    } else {
-		u = -c/b;
-	    }
-	    double den = (dx+u*ex);
-	    if (fabs(den)>1e-8) {
-		v = (mx - u*bx)/den;
-	    } else {
-		den = (dy+u*ey);
-		v = (my - u*by)/den;
-	    }
-	} else {
-	    b = dx*by-bx*dy + ex*my-mx*ey;
-	    c = bx*my-mx*by;
-	    if (fabs(a2)>1e-8) {
-		delta = b*b-4*a2*c;
-		v = (-b+sqrt(delta))/(2*a2);
-	    } else {
-		v = -c/b;
-	    }
-	    double den = (bx+v*ex);
-	    if (fabs(den)>1e-8) {
-		u = (mx - v*dx)/den;
-	    } else {
-		den = (by+v*ey);
-		u = (my - v*dy)/den;
-	    }
-	}
-#if 0
-	if (isnan(u)) {
-	    printf("AM=(%g,%g)\n", mx, my);
-	    printf("AB=(%g,%g)\n", bx, by);
-	    printf("AC=(%g,%g)\n", cx, cy);
-	    printf("AD=(%g,%g)\n", dx, dy);
-	    printf("AE=(%g,%g)\n", ex, ey);
-	    printf("a1=%g, a2=%g, b=%g, c=%g\n", a1, a2, b, c);
-	    printf("u=%g v=%g\n", u, v);
-	}
-#endif
-    }
-};
-
-
-/**
-   Draw a structured grid composed of quads (xy[i,j],xy[i+1,j],xy[i+1,j+1],xy[i,j+1] )
-*/
-PyObject *py_scale_quads(PyObject *self, PyObject *args)
-{
-    PyArrayObject *p_src_x=0, *p_src_y=0, *p_src_z=0, *p_dst=0;
-    PyObject *p_lut_data, *p_dst_data, *p_interp_data, *p_src_data;
-    double x1,x2,y1,y2;
-    int border=0, flat=0;
-    double uflat=0.5;
-    double vflat=0.5;
-
-    if (!PyArg_ParseTuple(args, "OOOOOOOO|i:_scale_quads",
-			  &p_src_x, &p_src_y, &p_src_z, &p_src_data,
-			  &p_dst, &p_dst_data,
-			  &p_lut_data, &p_interp_data,
-			  &border)) {
-	return NULL;
-    }
-    if (!PyArg_ParseTuple(p_interp_data, "i|dd", &flat,&uflat,&vflat)) {
-	PyErr_SetString(PyExc_ValueError, "Interpolation should be a tuple (type[,uflat,vflat])");
-	return NULL;
-    }
-    if (!check_arrays(p_src_x, p_dst)) {
-	return NULL;
-    }
-    if (!PyArg_ParseTuple(p_src_data, "dddd:_scale_quads",
-			  &x1, &y1, &x2, &y2)) {
-	return NULL;
-    }
-    if (PyArray_TYPE(p_src_x)!=NPY_FLOAT64 ||
-	PyArray_TYPE(p_src_y)!=NPY_FLOAT64 ||
-	PyArray_TYPE(p_src_z)!=NPY_FLOAT64) {
-	PyErr_SetString(PyExc_TypeError, "Only support float X,Y,Z");
-	return NULL;
-    }
-    if (PyArray_TYPE(p_dst)!=NPY_UINT32) {
-	PyErr_SetString(PyExc_TypeError, "Only support RGB dest for now");
-	return NULL;
-    }
-
-    double a=1.0, b=0.0;
-    PyObject* p_bg;
-    PyArrayObject* p_cmap;
-    bool apply_bg=true;
-    if (!PyArg_ParseTuple(p_lut_data, "ddO|O", &a, &b, &p_bg, &p_cmap)) {
-	PyErr_SetString(PyExc_ValueError, "Can't interpret pixel transformation tuple");
-	return NULL;
-    }
-    if (p_bg==Py_None) apply_bg=false;
-
-    Array2D<double> X(p_src_x), Y(p_src_y), Z(p_src_z);
-    /* Destination is RGB */
-    unsigned long bg=0;
-    Array2D<npy_uint32> dest(p_dst);
-    if (apply_bg) {
-    #if PY_MAJOR_VERSION >= 3
-        bg=PyLong_AsUnsignedLongMask(p_bg);
-    #else
-        bg=PyInt_AsUnsignedLongMask(p_bg);
-    #endif
-	if (PyErr_Occurred()) return NULL;
-    }
-    if (!check_lut(p_cmap)) {
-	return NULL;
-    }
-    Array1D<npy_uint32> cmap(p_cmap);
-    LutScale<npy_float64,npy_uint32>  scale(a, b, cmap, bg, apply_bg);
-    QuadHelper<double> quad(X,Y,Z,dest,scale, x1, x2, y1, y2, border, flat, uflat, vflat);
-
-    quad.draw_triangles();
-
-    // examine source type
-    return Py_BuildValue("iiii", quad.ixmin, quad.iymin, quad.ixmax, quad.iymax);
-}
-
-PyObject *py_vert_line(PyObject *self, PyObject *args)
-{
-    double x0,y0,x1,y1;
-    int xmax;
-    PyArrayObject *p_min, *p_max;
-
-    if (!PyArg_ParseTuple(args, "ddddiOO:_vert_line", &x0,&y0,&x1,&y1,&xmax,&p_min,&p_max)) {
-	return NULL;
-    }
-    if (!PyArray_Check(p_min) ||
-	!PyArray_Check(p_max)) {
-	PyErr_SetString(PyExc_TypeError, "imin, imax must be ndarray");
-	return NULL;
-    }
-    if (PyArray_TYPE(p_min) != NPY_INT ||
-	PyArray_TYPE(p_max) != NPY_INT) {
-	PyErr_SetString(PyExc_TypeError, "imin, imax must be int ndarray");
-	return NULL;
-    }
-    Array1D<int> pmin(p_min), pmax(p_max);
-    vector<int> imin, imax;
-    int nx = int(max(y0,y1))+1;
-    if (pmin.ni<nx || pmax.ni<nx) {
-	PyErr_SetString(PyExc_TypeError, "imin, imax not large enough");
-	return NULL;
-    }
-    if (y0<0 || y1<0) {
-	PyErr_SetString(PyExc_ValueError, "y bounds must be positive");
-    }
-    imin.resize(nx);
-    imax.resize(nx);
-    for(int i=0;i<nx;++i) {
-	imin[i] = pmin.value(i);
-	imax[i] = pmax.value(i);
-    }
-    Array2D<npy_uint32> dummy;
-    vert_line(x0, y0, x1, y1, xmax, imin, imax, false, 0, dummy);
-    for(int i=0;i<nx;++i) {
-	pmin.value(i) = imin[i];
-	pmax.value(i) = imax[i];
-    }
-    Py_INCREF(Py_None);
-    return Py_None;
-}
+/* -*- coding: utf-8;mode:c++;c-file-style:"stroustrup" -*- */
+/*
+  Copyright © 2010-2011 CEA
+  Ludovic Aubry
+  Licensed under the terms of the CECILL License
+  (see guiqwt/__init__.py for details)
+*/
+#include <Python.h>
+#define NO_IMPORT_ARRAY
+#define PY_ARRAY_UNIQUE_SYMBOL PyScalerArray
+#include <numpy/arrayobject.h>
+#ifdef _MSC_VER
+    #include <float.h>
+    #pragma fenv_access (on)
+#else
+    #include <fenv.h>
+#endif
+#include <math.h>
+#if defined(_MSC_VER) || defined(__MINGW32__)
+    #define isnan(x) _isnan(x)
+#endif
+#include <stdio.h>
+#include <algorithm>
+#include <vector>
+#include "arrays.hpp"
+#include "scaler.hpp"
+
+using std::vector;
+using std::min;
+using std::max;
+using std::swap;
+
+#if 0
+/** return min(max(a,b,c,d),bound) */
+    static int max4(int a, int b, int c, int d, int bound)
+{
+    int x, y, z;
+    x = (a>b ? a : b);
+    y = (c>d ? c : d);
+    z = (x>y ? x : y);
+    return (z>bound ? bound : z);
+}
+
+/** return max(min(a,b,c,d),bound) */
+    static int min4(int a, int b, int c, int d, int bound)
+{
+    int x, y, z;
+    x = (a<b ? a : b);
+    y = (c<d ? c : d);
+    z = (x<y ? x : y);
+    return (z<bound ? bound : z);
+}
+#endif
+
+static bool vert_line(double _x0, double _y0, double _x1, double _y1, int NX,
+		      vector<int>& imin, vector<int>& imax,
+		      bool draw, npy_uint32 col, Array2D<npy_uint32>& D)
+{
+    int x0 = lrint(_x0);
+    int y0 = lrint(_y0);
+    int x1 = lrint(_x1);
+    int y1 = lrint(_y1);
+    int dx = abs(x1-x0);
+    int dy = abs(y1-y0);
+    int sx, sy;
+    int NY=imin.size()-1;
+    int err, e2;
+    bool visible=false;
+    NX = NX-1;
+    if (x0 < x1)
+	sx = 1;
+    else
+	sx = -1;
+    if (y0 < y1)
+	sy = 1;
+    else
+	sy = -1;
+    err = dx-dy;
+
+    do {
+	if (y0>=0 && y0<=NY) {
+	    int _min = min(imin[y0],x0);
+	    int _max = max(imax[y0],x0);
+	    if (draw) {
+		if (x0>=0 && x0<=NX) {
+		    D.value(x0,y0) = col;
+		}
+	    }
+	    imin[y0] = max( 0,_min);
+	    imax[y0] = min(NX,_max);
+	    if (_min<=NX && _max>=0) {
+		visible=true;
+	    }
+	}
+	if ((x0 == x1) && (y0 == y1))
+	    break;
+	e2 = 2*err;
+	if (e2 > -dy) {
+	    err = err - dy;
+	    x0 = x0 + sx;
+	}
+	if (e2 <  dx) {
+	    err = err + dx;
+	    y0 = y0 + sy;
+	}
+    } while(true);
+    return visible;
+}
+
+
+template<class T>
+struct QuadHelper {
+    const Array2D<T>& X;
+    const Array2D<T>& Y;
+    const Array2D<T>& Z;
+    Array2D<npy_uint32>& D;
+    LutScale<T,npy_uint32>& scale;
+    double x1, x2, y1, y2, m_dx, m_dy;
+    npy_uint32 bgcolor;
+    bool border;
+    bool flat;
+    double uflat, vflat;
+    int ixmin, ixmax, iymin, iymax;
+
+    QuadHelper( const Array2D<T>& X_,
+		const Array2D<T>& Y_,
+		const Array2D<T>& Z_,
+		Array2D<npy_uint32>& D_,
+		LutScale<T,npy_uint32>& scale_,
+		double x1_, double x2_, double y1_, double y2_,
+		bool _border, bool _flat,
+		double _uflat, double _vflat
+	):X(X_), Y(Y_), Z(Z_), D(D_), scale(scale_),
+	  x1(x1_), x2(x2_), y1(y1_), y2(y2_),
+	  bgcolor(0xff000000),
+	  border(_border),
+	  flat(_flat),uflat(_uflat),vflat(_vflat)
+	{
+	    m_dx = D.nj/(x2-x1);
+	    m_dy = D.ni/(y2-y1);
+	}
+
+    void draw_triangles() {
+	int i, j;
+	vector<int> imin, imax;
+	imin.resize(D.ni);
+	imax.resize(D.ni);
+	ixmin = D.nj;
+	iymin = D.ni;
+	ixmax = -1;
+	iymax = -1;
+	for(i=0;i<X.ni-1;++i) {
+	    for(j=0;j<X.nj-1;++j) {
+		draw_quad(i,j,imin,imax);
+	    }
+	}
+    }
+
+    void draw_quad(int qi, int qj,
+		   vector<int>& imin, vector<int>& imax
+	) {
+	int i,j;
+	double u, v;
+	double v0, v1, v2, v3, v4;
+	// Coordonnees du quad dans l'offscreen
+	double ax = (X.value(qj+0,qi+0)-x1)*m_dx, ay=(Y.value(qj+0,qi+0)-y1)*m_dy;
+	double bx = (X.value(qj+0,qi+1)-x1)*m_dx, by=(Y.value(qj+0,qi+1)-y1)*m_dy;
+	double cx = (X.value(qj+1,qi+1)-x1)*m_dx, cy=(Y.value(qj+1,qi+1)-y1)*m_dy;
+	double dx = (X.value(qj+1,qi+0)-x1)*m_dx, dy=(Y.value(qj+1,qi+0)-y1)*m_dy;
+	// indice des sommets (A,B,C,D)<->0,1,2,3<->(qi,qj),(qi+1,qj),(qi+1,qj+1),(qi,qj+1)
+	// trie par ordre x croissant ou y croissant (selon xarg, yarg)
+	double ymin = min(ay,min(by,min(cy,dy)));
+	double ymax = max(ay,max(by,max(cy,dy)));
+
+	int i0 = int(ymin+.5);
+	int i1 = int(ymax+.5);
+//	printf("Quads: i=%d->%d\n", i0, i1);
+
+	if (i0<0) i0=0;
+	if (i1>=D.ni) i1=D.ni-1;
+	if (i1<i0) return;
+
+	iymin = min(iymin,i0);
+	iymax = max(iymax,i1);
+	for(i=i0;i<=i1;++i) {
+	    imax[i]=-1;
+	    imin[i]=D.nj;
+	}
+
+	// Compute the rasterized border of the quad
+	bool visible = false;
+	visible |= vert_line(ax,ay,bx,by,D.nj,imin,imax, border, 0xff000000, D);
+	visible |= vert_line(bx,by,cx,cy,D.nj,imin,imax, border, 0xff000000, D);
+	visible |= vert_line(cx,cy,dx,dy,D.nj,imin,imax, border, 0xff000000, D);
+	visible |= vert_line(dx,dy,ax,ay,D.nj,imin,imax, border, 0xff000000, D);
+	if (!visible)
+	    return;
+
+	double ex = ax+cx-dx-bx;
+	double ey = ay+cy-dy-by;
+	double n = 1./sqrt((cx-ax)*(cx-ax)+(cy-ay)*(cy-ay));
+	if (n>1e2) n = 1.0;
+
+	// Normalize vectors with ||AC||
+	ax *= n; ay *= n;
+	bx = bx*n-ax; by = by*n-ay;
+	cx = cx*n-ax; cy = cy*n-ay;
+	dx = dx*n-ax; dy = dy*n-ay;
+	ex *= n; ey *= n;
+
+	v1 = Z.value(qj,qi);
+	v2 = Z.value(qj+1,qi);
+	v3 = Z.value(qj+1,qi+1);
+	v4 = Z.value(qj,qi+1);
+
+	if (isnan(v1) || isnan(v2) || isnan(v3) || isnan(v4)) {
+	    // XXX Color = Alpha
+	    return ;
+	}
+	int dm=0, dM=0;
+	if (border) {
+	    dm=1;dM=-1;
+	}
+	npy_uint32 col = scale.eval( v1*(1-vflat)*(1-uflat) +
+				 v2*  vflat  *(1-uflat) +
+				 v3*  vflat  *  uflat   +
+				 v4*(1-vflat)*  uflat   );
+	for(i=i0+dm;i<=i1+dM;++i) {
+	    ixmin = min(ixmin,imin[i]);
+	    ixmax = max(ixmax,imax[i]);
+	    int jmin=max(0,imin[i])+dm;
+	    int jmax=min(imax[i],D.nj-1)+dM;
+	    for(j=jmin;j<=jmax;++j) {
+		if (!flat) {
+		    params(j*n,i*n, ax,ay, bx,by, cx,cy, dx,dy, ex,ey, u,v);
+		    if (u<0) u=0.; else if (u>1.) u=1.;
+		    if (v<0) v=0.; else if (v>1.) v=1.;
+		    /* v0 = v1*(1-v)*(1-u) + v2*v*(1-u) + v3*v*u + v4*(1-v)*u; */
+		    v0 = u*( v*(v1-v2+v3-v4)+v4-v1 ) + v*(v2-v1) + v1;
+		    col = scale.eval(v0);
+		}
+		D.value(j,i) = col;
+	    }
+	}
+    }
+
+    void params(double x, double y,
+		double ax, double ay,
+		double bx, double by,
+		double cx, double cy,
+		double dx, double dy,
+		double ex, double ey,
+		double& u, double&v) {
+	/* solves AM=u.AB+v.AD+uv.AE with A,B,C,D quad, AE=DC+BA
+	   M = (x,y)
+	   with u^2.(AB^AE) +u.(AB^AD+AE^AM)+AD^AM=0
+	   v = (AM-u.AB)/(AD+u.AE)
+	*/
+
+	double mx = x-ax, my = y-ay;
+	double a1, a2, b, c, delta;
+
+	if (false && (ex*ex+ey*ey)<1e-8) {
+	    // fast case : parallelogram
+	    if (fabs(dy)>1e-16) {
+		double a=dx/dy;
+		u = (mx-a*y)/(bx-a*by);
+		v = (my-u*by)/dy;
+		return ;
+	    } else {
+		double a=dy/dx;
+		u = (my-a*x)/(by-a*bx);
+		v = (mx-u*bx)/dx;
+		return ;
+	    }
+	}
+	a1 = bx*ey-ex*by;
+	a2 = dx*ey-ex*dy;
+	if (a1>a2) {
+	    b = bx*dy-dx*by + ex*my-mx*ey;
+	    c = dx*my-mx*dy;
+	    if (fabs(a1)>1e-8) {
+		delta = b*b-4*a1*c;
+		u = (-b+sqrt(delta))/(2*a1);
+	    } else {
+		u = -c/b;
+	    }
+	    double den = (dx+u*ex);
+	    if (fabs(den)>1e-8) {
+		v = (mx - u*bx)/den;
+	    } else {
+		den = (dy+u*ey);
+		v = (my - u*by)/den;
+	    }
+	} else {
+	    b = dx*by-bx*dy + ex*my-mx*ey;
+	    c = bx*my-mx*by;
+	    if (fabs(a2)>1e-8) {
+		delta = b*b-4*a2*c;
+		v = (-b+sqrt(delta))/(2*a2);
+	    } else {
+		v = -c/b;
+	    }
+	    double den = (bx+v*ex);
+	    if (fabs(den)>1e-8) {
+		u = (mx - v*dx)/den;
+	    } else {
+		den = (by+v*ey);
+		u = (my - v*dy)/den;
+	    }
+	}
+#if 0
+	if (isnan(u)) {
+	    printf("AM=(%g,%g)\n", mx, my);
+	    printf("AB=(%g,%g)\n", bx, by);
+	    printf("AC=(%g,%g)\n", cx, cy);
+	    printf("AD=(%g,%g)\n", dx, dy);
+	    printf("AE=(%g,%g)\n", ex, ey);
+	    printf("a1=%g, a2=%g, b=%g, c=%g\n", a1, a2, b, c);
+	    printf("u=%g v=%g\n", u, v);
+	}
+#endif
+    }
+};
+
+
+/**
+   Draw a structured grid composed of quads (xy[i,j],xy[i+1,j],xy[i+1,j+1],xy[i,j+1] )
+*/
+PyObject *py_scale_quads(PyObject *self, PyObject *args)
+{
+    PyArrayObject *p_src_x=0, *p_src_y=0, *p_src_z=0, *p_dst=0;
+    PyObject *p_lut_data, *p_dst_data, *p_interp_data, *p_src_data;
+    double x1,x2,y1,y2;
+    int border=0, flat=0;
+    double uflat=0.5;
+    double vflat=0.5;
+
+    if (!PyArg_ParseTuple(args, "OOOOOOOO|i:_scale_quads",
+			  &p_src_x, &p_src_y, &p_src_z, &p_src_data,
+			  &p_dst, &p_dst_data,
+			  &p_lut_data, &p_interp_data,
+			  &border)) {
+	return NULL;
+    }
+    if (!PyArg_ParseTuple(p_interp_data, "i|dd", &flat,&uflat,&vflat)) {
+	PyErr_SetString(PyExc_ValueError, "Interpolation should be a tuple (type[,uflat,vflat])");
+	return NULL;
+    }
+    if (!check_arrays(p_src_x, p_dst)) {
+	return NULL;
+    }
+    if (!PyArg_ParseTuple(p_src_data, "dddd:_scale_quads",
+			  &x1, &y1, &x2, &y2)) {
+	return NULL;
+    }
+    if (PyArray_TYPE(p_src_x)!=NPY_FLOAT64 ||
+	PyArray_TYPE(p_src_y)!=NPY_FLOAT64 ||
+	PyArray_TYPE(p_src_z)!=NPY_FLOAT64) {
+	PyErr_SetString(PyExc_TypeError, "Only support float X,Y,Z");
+	return NULL;
+    }
+    if (PyArray_TYPE(p_dst)!=NPY_UINT32) {
+	PyErr_SetString(PyExc_TypeError, "Only support RGB dest for now");
+	return NULL;
+    }
+
+    double a=1.0, b=0.0;
+    PyObject* p_bg;
+    PyArrayObject* p_cmap;
+    bool apply_bg=true;
+    if (!PyArg_ParseTuple(p_lut_data, "ddO|O", &a, &b, &p_bg, &p_cmap)) {
+	PyErr_SetString(PyExc_ValueError, "Can't interpret pixel transformation tuple");
+	return NULL;
+    }
+    if (p_bg==Py_None) apply_bg=false;
+
+    Array2D<double> X(p_src_x), Y(p_src_y), Z(p_src_z);
+    /* Destination is RGB */
+    unsigned long bg=0;
+    Array2D<npy_uint32> dest(p_dst);
+    if (apply_bg) {
+    #if PY_MAJOR_VERSION >= 3
+        bg=PyLong_AsUnsignedLongMask(p_bg);
+    #else
+        bg=PyInt_AsUnsignedLongMask(p_bg);
+    #endif
+	if (PyErr_Occurred()) return NULL;
+    }
+    if (!check_lut(p_cmap)) {
+	return NULL;
+    }
+    Array1D<npy_uint32> cmap(p_cmap);
+    LutScale<npy_float64,npy_uint32>  scale(a, b, cmap, bg, apply_bg);
+    QuadHelper<double> quad(X,Y,Z,dest,scale, x1, x2, y1, y2, border, flat, uflat, vflat);
+
+    quad.draw_triangles();
+
+    // examine source type
+    return Py_BuildValue("iiii", quad.ixmin, quad.iymin, quad.ixmax, quad.iymax);
+}
+
+PyObject *py_vert_line(PyObject *self, PyObject *args)
+{
+    double x0,y0,x1,y1;
+    int xmax;
+    PyArrayObject *p_min, *p_max;
+
+    if (!PyArg_ParseTuple(args, "ddddiOO:_vert_line", &x0,&y0,&x1,&y1,&xmax,&p_min,&p_max)) {
+	return NULL;
+    }
+    if (!PyArray_Check(p_min) ||
+	!PyArray_Check(p_max)) {
+	PyErr_SetString(PyExc_TypeError, "imin, imax must be ndarray");
+	return NULL;
+    }
+    if (PyArray_TYPE(p_min) != NPY_INT ||
+	PyArray_TYPE(p_max) != NPY_INT) {
+	PyErr_SetString(PyExc_TypeError, "imin, imax must be int ndarray");
+	return NULL;
+    }
+    Array1D<int> pmin(p_min), pmax(p_max);
+    vector<int> imin, imax;
+    int nx = int(max(y0,y1))+1;
+    if (pmin.ni<nx || pmax.ni<nx) {
+	PyErr_SetString(PyExc_TypeError, "imin, imax not large enough");
+	return NULL;
+    }
+    if (y0<0 || y1<0) {
+	PyErr_SetString(PyExc_ValueError, "y bounds must be positive");
+    }
+    imin.resize(nx);
+    imax.resize(nx);
+    for(int i=0;i<nx;++i) {
+	imin[i] = pmin.value(i);
+	imax[i] = pmax.value(i);
+    }
+    Array2D<npy_uint32> dummy;
+    vert_line(x0, y0, x1, y1, xmax, imin, imax, false, 0, dummy);
+    for(int i=0;i<nx;++i) {
+	pmin.value(i) = imin[i];
+	pmax.value(i) = imax[i];
+    }
+    Py_INCREF(Py_None);
+    return Py_None;
+}
diff --git a/src/scaler.hpp b/src/scaler.hpp
index cc2150c..515a1b4 100644
--- a/src/scaler.hpp
+++ b/src/scaler.hpp
@@ -1,99 +1,99 @@
-/* -*- coding: utf-8;mode:c++;c-file-style:"stroustrup" -*- */
-/*
-  Copyright � 2010-2011 CEA
-  Ludovic Aubry
-  Licensed under the terms of the CECILL License
-  (see guiqwt/__init__.py for details)
-*/
-
-#ifndef _SCALER_HPP
-#define _SCALER_HPP
-
-#include "points.hpp"
-#include "arrays.hpp"
-
-/* Scaler evaluates int(a*x+b) */
-template<class T, bool is_int=num_trait<T>::is_integer>
-struct Scaler {
-    typedef num_trait<T> trait;
-
-    Scaler(double _a, double _b):a(trait::fromdouble(_a)), b(trait::fromdouble(_b)) {}
-    int scale(T x) const { return trait::toint(a*x+b); }
-    typename trait::value_type a,b;
-};
-template<class T>
-struct Scaler<T,true> {
-    typedef num_trait<fixed> trait;
-
-    Scaler(double _a, double _b):a(trait::fromdouble(_a)), b(trait::fromdouble(_b)) {}
-    int scale(T x) const { return trait::toint(a*x+b); }
-    typename trait::value_type a,b;
-};
-
-template<class T, class D>
-class LinearScale {
-public:
-    typedef T source_type;
-    typedef D dest_type;
-    LinearScale(double _a, double _b, D _bg, bool apply_bg):a(_a), b(_b), bg(_bg), has_bg(apply_bg) {}
-
-    D eval(T x) const {
-	return a*x+b;
-    }
-    void set_bg(D& dest) const {
-	if (has_bg) dest = bg;
-    }
-protected:
-    D a, b;
-    D bg;
-    bool has_bg;
-};
-
-template<class T, class D>
-class LutScale
-{
-public:
-    typedef T source_type;
-    typedef D dest_type;
-    LutScale(double _a, double _b, Array1D<D>& _lut,
-	     D _bg, bool apply_bg):s(_a, _b),lut(_lut), bg(_bg), has_bg(apply_bg) {}
-
-    D eval(T x) const {
-	int val = s.scale(x);
-	if (val<0) {
-	    return lut.value(0);
-	} else if (val>=lut.ni) {
-	    return lut.value(lut.ni-1);
-	}
-	return lut.value(val);
-    }
-    void set_bg(D& dest) const {
-	if (has_bg) dest = bg;
-    }
-protected:
-    Scaler<T>  s;
-    Array1D<D>& lut;
-    D bg;
-    bool has_bg;
-};
-
-template<class T, class D>
-class NoScale
-{
-public:
-    typedef T source_type;
-    typedef D dest_type;
-    NoScale(dest_type _bg, bool apply_bg):bg(_bg), has_bg(apply_bg) {}
-
-    dest_type eval(source_type x) const { return x; }
-    void set_bg(dest_type& dest) const { if (has_bg) dest = bg; }
-protected:
-    dest_type bg;
-    bool has_bg;
-};
-
-bool check_arrays(PyArrayObject* p_src, PyArrayObject *p_dest);
-bool check_lut(PyArrayObject *p_lut);
-
-
-#endif // _SCALER_HPP
+/* -*- coding: utf-8;mode:c++;c-file-style:"stroustrup" -*- */
+/*
+  Copyright � 2010-2011 CEA
+  Ludovic Aubry
+  Licensed under the terms of the CECILL License
+  (see guiqwt/__init__.py for details)
+*/
+
+#ifndef _SCALER_HPP
+#define _SCALER_HPP
+
+#include "points.hpp"
+#include "arrays.hpp"
+
+/* Scaler evaluates int(a*x+b) */
+template<class T, bool is_int=num_trait<T>::is_integer>
+struct Scaler {
+    typedef num_trait<T> trait;
+
+    Scaler(double _a, double _b):a(trait::fromdouble(_a)), b(trait::fromdouble(_b)) {}
+    int scale(T x) const { return trait::toint(a*x+b); }
+    typename trait::value_type a,b;
+};
+template<class T>
+struct Scaler<T,true> {
+    typedef num_trait<fixed> trait;
+
+    Scaler(double _a, double _b):a(trait::fromdouble(_a)), b(trait::fromdouble(_b)) {}
+    int scale(T x) const { return trait::toint(a*x+b); }
+    typename trait::value_type a,b;
+};
+
+template<class T, class D>
+class LinearScale {
+public:
+    typedef T source_type;
+    typedef D dest_type;
+    LinearScale(double _a, double _b, D _bg, bool apply_bg):a(_a), b(_b), bg(_bg), has_bg(apply_bg) {}
+
+    D eval(T x) const {
+	return a*x+b;
+    }
+    void set_bg(D& dest) const {
+	if (has_bg) dest = bg;
+    }
+protected:
+    D a, b;
+    D bg;
+    bool has_bg;
+};
+
+template<class T, class D>
+class LutScale
+{
+public:
+    typedef T source_type;
+    typedef D dest_type;
+    LutScale(double _a, double _b, Array1D<D>& _lut,
+	     D _bg, bool apply_bg):s(_a, _b),lut(_lut), bg(_bg), has_bg(apply_bg) {}
+
+    D eval(T x) const {
+	int val = s.scale(x);
+	if (val<0) {
+	    return lut.value(0);
+	} else if (val>=lut.ni) {
+	    return lut.value(lut.ni-1);
+	}
+	return lut.value(val);
+    }
+    void set_bg(D& dest) const {
+	if (has_bg) dest = bg;
+    }
+protected:
+    Scaler<T>  s;
+    Array1D<D>& lut;
+    D bg;
+    bool has_bg;
+};
+
+template<class T, class D>
+class NoScale
+{
+public:
+    typedef T source_type;
+    typedef D dest_type;
+    NoScale(dest_type _bg, bool apply_bg):bg(_bg), has_bg(apply_bg) {}
+
+    dest_type eval(source_type x) const { return x; }
+    void set_bg(dest_type& dest) const { if (has_bg) dest = bg; }
+protected:
+    dest_type bg;
+    bool has_bg;
+};
+
+bool check_arrays(PyArrayObject* p_src, PyArrayObject *p_dest);
+bool check_lut(PyArrayObject *p_lut);
+
+
+#endif // _SCALER_HPP
diff --git a/upload.bat b/upload.bat
deleted file mode 100755
index 943ea1e..0000000
--- a/upload.bat
+++ /dev/null
@@ -1,7 +0,0 @@
-del MANIFEST
-python setup.py build sdist upload
-python setup.py --no-user-cfg build -c msvc bdist_wininst --sse2 upload
-python setup.py --no-user-cfg build -c msvc bdist_wheel --sse2 upload
-python setup.py --no-user-cfg build -c msvc bdist_wininst --plat-name=win32 --sse2 upload
-python setup.py --no-user-cfg build -c msvc bdist_wheel --plat-name=win32 --sse2 upload
-pause