/* Generated by Cython 0.24 */

/* BEGIN: Cython Metadata
{
    "distutils": {
        "depends": [],
        "extra_compile_args": [
            "-Wno-unused-parameter",
            "-Wno-unused-function"
        ],
        "include_dirs": [
            "/Users/sean/code/frs-wheel-builds/venv35/lib/python3.5/site-packages/numpy/core/include",
            "/Users/sean/code/frs-wheel-builds/parts/gdal/include"
        ],
        "libraries": [
            "gdal"
        ],
        "library_dirs": [
            "/Users/sean/code/frs-wheel-builds/parts/gdal/lib"
        ]
    }
}
END: Cython Metadata */

#define PY_SSIZE_T_CLEAN
#include "Python.h"
#ifndef Py_PYTHON_H
    #error Python headers needed to compile C extensions, please install development version of Python.
#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000)
    #error Cython requires Python 2.6+ or Python 3.2+.
#else
#define CYTHON_ABI "0_24"
#include <stddef.h>
#ifndef offsetof
  #define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
#endif
#if !defined(WIN32) && !defined(MS_WINDOWS)
  #ifndef __stdcall
    #define __stdcall
  #endif
  #ifndef __cdecl
    #define __cdecl
  #endif
  #ifndef __fastcall
    #define __fastcall
  #endif
#endif
#ifndef DL_IMPORT
  #define DL_IMPORT(t) t
#endif
#ifndef DL_EXPORT
  #define DL_EXPORT(t) t
#endif
#ifndef PY_LONG_LONG
  #define PY_LONG_LONG LONG_LONG
#endif
#ifndef Py_HUGE_VAL
  #define Py_HUGE_VAL HUGE_VAL
#endif
#ifdef PYPY_VERSION
  #define CYTHON_COMPILING_IN_PYPY 1
  #define CYTHON_COMPILING_IN_CPYTHON 0
#else
  #define CYTHON_COMPILING_IN_PYPY 0
  #define CYTHON_COMPILING_IN_CPYTHON 1
#endif
#if !defined(CYTHON_USE_PYLONG_INTERNALS) && CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02070000
  #define CYTHON_USE_PYLONG_INTERNALS 1
#endif
#if CYTHON_USE_PYLONG_INTERNALS
  #include "longintrepr.h"
  #undef SHIFT
  #undef BASE
  #undef MASK
#endif
#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag)
  #define Py_OptimizeFlag 0
#endif
#define __PYX_BUILD_PY_SSIZE_T "n"
#define CYTHON_FORMAT_SSIZE_T "z"
#if PY_MAJOR_VERSION < 3
  #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
          PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
  #define __Pyx_DefaultClassType PyClass_Type
#else
  #define __Pyx_BUILTIN_MODULE_NAME "builtins"
  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
          PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
  #define __Pyx_DefaultClassType PyType_Type
#endif
#ifndef Py_TPFLAGS_CHECKTYPES
  #define Py_TPFLAGS_CHECKTYPES 0
#endif
#ifndef Py_TPFLAGS_HAVE_INDEX
  #define Py_TPFLAGS_HAVE_INDEX 0
#endif
#ifndef Py_TPFLAGS_HAVE_NEWBUFFER
  #define Py_TPFLAGS_HAVE_NEWBUFFER 0
#endif
#ifndef Py_TPFLAGS_HAVE_FINALIZE
  #define Py_TPFLAGS_HAVE_FINALIZE 0
#endif
#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)
  #define CYTHON_PEP393_ENABLED 1
  #define __Pyx_PyUnicode_READY(op)       (likely(PyUnicode_IS_READY(op)) ?\
                                              0 : _PyUnicode_Ready((PyObject *)(op)))
  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_LENGTH(u)
  #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)
  #define __Pyx_PyUnicode_KIND(u)         PyUnicode_KIND(u)
  #define __Pyx_PyUnicode_DATA(u)         PyUnicode_DATA(u)
  #define __Pyx_PyUnicode_READ(k, d, i)   PyUnicode_READ(k, d, i)
  #define __Pyx_PyUnicode_IS_TRUE(u)      (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u)))
#else
  #define CYTHON_PEP393_ENABLED 0
  #define __Pyx_PyUnicode_READY(op)       (0)
  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_SIZE(u)
  #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))
  #define __Pyx_PyUnicode_KIND(u)         (sizeof(Py_UNICODE))
  #define __Pyx_PyUnicode_DATA(u)         ((void*)PyUnicode_AS_UNICODE(u))
  #define __Pyx_PyUnicode_READ(k, d, i)   ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i]))
  #define __Pyx_PyUnicode_IS_TRUE(u)      (0 != PyUnicode_GET_SIZE(u))
#endif
#if CYTHON_COMPILING_IN_PYPY
  #define __Pyx_PyUnicode_Concat(a, b)      PyNumber_Add(a, b)
  #define __Pyx_PyUnicode_ConcatSafe(a, b)  PyNumber_Add(a, b)
#else
  #define __Pyx_PyUnicode_Concat(a, b)      PyUnicode_Concat(a, b)
  #define __Pyx_PyUnicode_ConcatSafe(a, b)  ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\
      PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b))
#endif
#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains)
  #define PyUnicode_Contains(u, s)  PySequence_Contains(u, s)
#endif
#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format)
  #define PyObject_Format(obj, fmt)  PyObject_CallMethod(obj, "__format__", "O", fmt)
#endif
#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc)
  #define PyObject_Malloc(s)   PyMem_Malloc(s)
  #define PyObject_Free(p)     PyMem_Free(p)
  #define PyObject_Realloc(p)  PyMem_Realloc(p)
#endif
#define __Pyx_PyString_FormatSafe(a, b)   ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b))
#define __Pyx_PyUnicode_FormatSafe(a, b)  ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b))
#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyString_Format(a, b)  PyUnicode_Format(a, b)
#else
  #define __Pyx_PyString_Format(a, b)  PyString_Format(a, b)
#endif
#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII)
  #define PyObject_ASCII(o)            PyObject_Repr(o)
#endif
#if PY_MAJOR_VERSION >= 3
  #define PyBaseString_Type            PyUnicode_Type
  #define PyStringObject               PyUnicodeObject
  #define PyString_Type                PyUnicode_Type
  #define PyString_Check               PyUnicode_Check
  #define PyString_CheckExact          PyUnicode_CheckExact
#endif
#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj)
  #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj)
#else
  #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj))
  #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj))
#endif
#ifndef PySet_CheckExact
  #define PySet_CheckExact(obj)        (Py_TYPE(obj) == &PySet_Type)
#endif
#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type)
#if PY_MAJOR_VERSION >= 3
  #define PyIntObject                  PyLongObject
  #define PyInt_Type                   PyLong_Type
  #define PyInt_Check(op)              PyLong_Check(op)
  #define PyInt_CheckExact(op)         PyLong_CheckExact(op)
  #define PyInt_FromString             PyLong_FromString
  #define PyInt_FromUnicode            PyLong_FromUnicode
  #define PyInt_FromLong               PyLong_FromLong
  #define PyInt_FromSize_t             PyLong_FromSize_t
  #define PyInt_FromSsize_t            PyLong_FromSsize_t
  #define PyInt_AsLong                 PyLong_AsLong
  #define PyInt_AS_LONG                PyLong_AS_LONG
  #define PyInt_AsSsize_t              PyLong_AsSsize_t
  #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask
  #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
  #define PyNumber_Int                 PyNumber_Long
#endif
#if PY_MAJOR_VERSION >= 3
  #define PyBoolObject                 PyLongObject
#endif
#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY
  #ifndef PyUnicode_InternFromString
    #define PyUnicode_InternFromString(s) PyUnicode_FromString(s)
  #endif
#endif
#if PY_VERSION_HEX < 0x030200A4
  typedef long Py_hash_t;
  #define __Pyx_PyInt_FromHash_t PyInt_FromLong
  #define __Pyx_PyInt_AsHash_t   PyInt_AsLong
#else
  #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
  #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
#endif
#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))
#else
  #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass)
#endif
#if PY_VERSION_HEX >= 0x030500B1
#define __Pyx_PyAsyncMethodsStruct PyAsyncMethods
#define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async)
#elif CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
typedef struct {
    unaryfunc am_await;
    unaryfunc am_aiter;
    unaryfunc am_anext;
} __Pyx_PyAsyncMethodsStruct;
#define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved))
#else
#define __Pyx_PyType_AsAsync(obj) NULL
#endif
#ifndef CYTHON_RESTRICT
  #if defined(__GNUC__)
    #define CYTHON_RESTRICT __restrict__
  #elif defined(_MSC_VER) && _MSC_VER >= 1400
    #define CYTHON_RESTRICT __restrict
  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    #define CYTHON_RESTRICT restrict
  #else
    #define CYTHON_RESTRICT
  #endif
#endif
#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None)

#ifndef CYTHON_INLINE
  #if defined(__GNUC__)
    #define CYTHON_INLINE __inline__
  #elif defined(_MSC_VER)
    #define CYTHON_INLINE __inline
  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    #define CYTHON_INLINE inline
  #else
    #define CYTHON_INLINE
  #endif
#endif

#if defined(WIN32) || defined(MS_WINDOWS)
  #define _USE_MATH_DEFINES
#endif
#include <math.h>
#ifdef NAN
#define __PYX_NAN() ((float) NAN)
#else
static CYTHON_INLINE float __PYX_NAN() {
  float value;
  memset(&value, 0xFF, sizeof(value));
  return value;
}
#endif


#define __PYX_ERR(f_index, lineno, Ln_error) \
{ \
  __pyx_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \
}

#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
#else
  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)
#endif

#ifndef __PYX_EXTERN_C
  #ifdef __cplusplus
    #define __PYX_EXTERN_C extern "C"
  #else
    #define __PYX_EXTERN_C extern
  #endif
#endif

#define __PYX_HAVE__rasterio___base
#define __PYX_HAVE_API__rasterio___base
#include "string.h"
#include "stdlib.h"
#include "cpl_conv.h"
#include "cpl_string.h"
#include "cpl_vsi.h"
#include "ogr_srs_api.h"
#include "gdal.h"
#include "gdalwarper.h"
#include "gdal_alg.h"
#include "ogr_core.h"
#include "ogr_api.h"
#ifdef _OPENMP
#include <omp.h>
#endif /* _OPENMP */

#ifdef PYREX_WITHOUT_ASSERTIONS
#define CYTHON_WITHOUT_ASSERTIONS
#endif

#ifndef CYTHON_UNUSED
# if defined(__GNUC__)
#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
#     define CYTHON_UNUSED __attribute__ ((__unused__))
#   else
#     define CYTHON_UNUSED
#   endif
# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER))
#   define CYTHON_UNUSED __attribute__ ((__unused__))
# else
#   define CYTHON_UNUSED
# endif
#endif
#ifndef CYTHON_NCP_UNUSED
# if CYTHON_COMPILING_IN_CPYTHON
#  define CYTHON_NCP_UNUSED
# else
#  define CYTHON_NCP_UNUSED CYTHON_UNUSED
# endif
#endif
typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding;
                const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry;

#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0
#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0
#define __PYX_DEFAULT_STRING_ENCODING ""
#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString
#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
#define __Pyx_uchar_cast(c) ((unsigned char)c)
#define __Pyx_long_cast(x) ((long)x)
#define __Pyx_fits_Py_ssize_t(v, type, is_signed)  (\
    (sizeof(type) < sizeof(Py_ssize_t))  ||\
    (sizeof(type) > sizeof(Py_ssize_t) &&\
          likely(v < (type)PY_SSIZE_T_MAX ||\
                 v == (type)PY_SSIZE_T_MAX)  &&\
          (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\
                                v == (type)PY_SSIZE_T_MIN)))  ||\
    (sizeof(type) == sizeof(Py_ssize_t) &&\
          (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\
                               v == (type)PY_SSIZE_T_MAX)))  )
#if defined (__cplusplus) && __cplusplus >= 201103L
    #include <cstdlib>
    #define __Pyx_sst_abs(value) std::abs(value)
#elif SIZEOF_INT >= SIZEOF_SIZE_T
    #define __Pyx_sst_abs(value) abs(value)
#elif SIZEOF_LONG >= SIZEOF_SIZE_T
    #define __Pyx_sst_abs(value) labs(value)
#elif defined (_MSC_VER) && defined (_M_X64)
    #define __Pyx_sst_abs(value) _abs64(value)
#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    #define __Pyx_sst_abs(value) llabs(value)
#elif defined (__GNUC__)
    #define __Pyx_sst_abs(value) __builtin_llabs(value)
#else
    #define __Pyx_sst_abs(value) ((value<0) ? -value : value)
#endif
static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject*);
static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length);
#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s))
#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l)
#define __Pyx_PyBytes_FromString        PyBytes_FromString
#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize
static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*);
#if PY_MAJOR_VERSION < 3
    #define __Pyx_PyStr_FromString        __Pyx_PyBytes_FromString
    #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
#else
    #define __Pyx_PyStr_FromString        __Pyx_PyUnicode_FromString
    #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize
#endif
#define __Pyx_PyObject_AsSString(s)    ((signed char*) __Pyx_PyObject_AsString(s))
#define __Pyx_PyObject_AsUString(s)    ((unsigned char*) __Pyx_PyObject_AsString(s))
#define __Pyx_PyObject_FromCString(s)  __Pyx_PyObject_FromString((const char*)s)
#define __Pyx_PyBytes_FromCString(s)   __Pyx_PyBytes_FromString((const char*)s)
#define __Pyx_PyByteArray_FromCString(s)   __Pyx_PyByteArray_FromString((const char*)s)
#define __Pyx_PyStr_FromCString(s)     __Pyx_PyStr_FromString((const char*)s)
#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s)
#if PY_MAJOR_VERSION < 3
static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u)
{
    const Py_UNICODE *u_end = u;
    while (*u_end++) ;
    return (size_t)(u_end - u - 1);
}
#else
#define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen
#endif
#define __Pyx_PyUnicode_FromUnicode(u)       PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u))
#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode
#define __Pyx_PyUnicode_AsUnicode            PyUnicode_AsUnicode
#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj)
#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None)
#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False))
static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);
static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x);
static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
#if CYTHON_COMPILING_IN_CPYTHON
#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
#else
#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x)
#endif
#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x))
#if PY_MAJOR_VERSION >= 3
#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x))
#else
#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x))
#endif
#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x))
#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
static int __Pyx_sys_getdefaultencoding_not_ascii;
static int __Pyx_init_sys_getdefaultencoding_params(void) {
    PyObject* sys;
    PyObject* default_encoding = NULL;
    PyObject* ascii_chars_u = NULL;
    PyObject* ascii_chars_b = NULL;
    const char* default_encoding_c;
    sys = PyImport_ImportModule("sys");
    if (!sys) goto bad;
    default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL);
    Py_DECREF(sys);
    if (!default_encoding) goto bad;
    default_encoding_c = PyBytes_AsString(default_encoding);
    if (!default_encoding_c) goto bad;
    if (strcmp(default_encoding_c, "ascii") == 0) {
        __Pyx_sys_getdefaultencoding_not_ascii = 0;
    } else {
        char ascii_chars[128];
        int c;
        for (c = 0; c < 128; c++) {
            ascii_chars[c] = c;
        }
        __Pyx_sys_getdefaultencoding_not_ascii = 1;
        ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL);
        if (!ascii_chars_u) goto bad;
        ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL);
        if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) {
            PyErr_Format(
                PyExc_ValueError,
                "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.",
                default_encoding_c);
            goto bad;
        }
        Py_DECREF(ascii_chars_u);
        Py_DECREF(ascii_chars_b);
    }
    Py_DECREF(default_encoding);
    return 0;
bad:
    Py_XDECREF(default_encoding);
    Py_XDECREF(ascii_chars_u);
    Py_XDECREF(ascii_chars_b);
    return -1;
}
#endif
#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3
#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL)
#else
#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL)
#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT
static char* __PYX_DEFAULT_STRING_ENCODING;
static int __Pyx_init_sys_getdefaultencoding_params(void) {
    PyObject* sys;
    PyObject* default_encoding = NULL;
    char* default_encoding_c;
    sys = PyImport_ImportModule("sys");
    if (!sys) goto bad;
    default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL);
    Py_DECREF(sys);
    if (!default_encoding) goto bad;
    default_encoding_c = PyBytes_AsString(default_encoding);
    if (!default_encoding_c) goto bad;
    __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c));
    if (!__PYX_DEFAULT_STRING_ENCODING) goto bad;
    strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c);
    Py_DECREF(default_encoding);
    return 0;
bad:
    Py_XDECREF(default_encoding);
    return -1;
}
#endif
#endif


/* Test for GCC > 2.95 */
#if defined(__GNUC__)     && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))
  #define likely(x)   __builtin_expect(!!(x), 1)
  #define unlikely(x) __builtin_expect(!!(x), 0)
#else /* !__GNUC__ or GCC < 2.95 */
  #define likely(x)   (x)
  #define unlikely(x) (x)
#endif /* __GNUC__ */

static PyObject *__pyx_m;
static PyObject *__pyx_d;
static PyObject *__pyx_b;
static PyObject *__pyx_empty_tuple;
static PyObject *__pyx_empty_bytes;
static PyObject *__pyx_empty_unicode;
static int __pyx_lineno;
static int __pyx_clineno = 0;
static const char * __pyx_cfilenm= __FILE__;
static const char *__pyx_filename;


static const char *__pyx_f[] = {
  "rasterio/_base.pyx",
};

/* "_ogr.pxd":2
 * 
 * ctypedef int OGRErr             # <<<<<<<<<<<<<<
 * ctypedef struct OGREnvelope:
 *     double MinX
 */
typedef int __pyx_t_8rasterio_4_ogr_OGRErr;

/*--- Type declarations ---*/
struct __pyx_obj_8rasterio_5_base_DatasetReader;
struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows;
struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__;
struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr;
struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index;
struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_4_genexpr;
struct __pyx_t_8rasterio_4_ogr_OGREnvelope;
typedef struct __pyx_t_8rasterio_4_ogr_OGREnvelope __pyx_t_8rasterio_4_ogr_OGREnvelope;

/* "_ogr.pxd":3
 * 
 * ctypedef int OGRErr
 * ctypedef struct OGREnvelope:             # <<<<<<<<<<<<<<
 *     double MinX
 *     double MaxX
 */
struct __pyx_t_8rasterio_4_ogr_OGREnvelope {
  double MinX;
  double MaxX;
  double MinY;
  double MaxY;
};

/* "rasterio/_base.pxd":3
 * # Base class.
 * 
 * cdef class DatasetReader:             # <<<<<<<<<<<<<<
 *     # Read-only access to dataset metadata. No IO!
 * 
 */
struct __pyx_obj_8rasterio_5_base_DatasetReader {
  PyObject_HEAD
  struct __pyx_vtabstruct_8rasterio_5_base_DatasetReader *__pyx_vtab;
  void *_hds;
  PyObject *name;
  PyObject *mode;
  PyObject *options;
  PyObject *width;
  PyObject *height;
  PyObject *shape;
  PyObject *driver;
  PyObject *_count;
  PyObject *_dtypes;
  PyObject *_closed;
  PyObject *_crs;
  PyObject *_crs_wkt;
  PyObject *_transform;
  PyObject *_block_shapes;
  PyObject *_nodatavals;
  PyObject *_read;
};


/* "rasterio/_base.pyx":363
 *             return flags
 * 
 *     def block_windows(self, bidx=0):             # <<<<<<<<<<<<<<
 *         """Returns an iterator over a band's block windows and their
 *         indexes.
 */
struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows {
  PyObject_HEAD
  PyObject *__pyx_v_bidx;
  PyObject *__pyx_v_block_shapes;
  PyObject *__pyx_v_col;
  PyObject *__pyx_v_d;
  PyObject *__pyx_v_h;
  PyObject *__pyx_v_height;
  int __pyx_v_i;
  int __pyx_v_j;
  PyObject *__pyx_v_m;
  PyObject *__pyx_v_ncols;
  PyObject *__pyx_v_nrows;
  PyObject *__pyx_v_row;
  struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self;
  PyObject *__pyx_v_w;
  PyObject *__pyx_v_width;
  long __pyx_t_0;
  int __pyx_t_1;
  long __pyx_t_2;
  int __pyx_t_3;
};


/* "rasterio/_base.pyx":521
 *         create a clone of this dataset.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             m = self.meta
 *             m.update((k, v.lower()) for k, v in self.tags(
 */
struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__ {
  PyObject_HEAD
  struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self;
};


/* "rasterio/_base.pyx":523
 *         def __get__(self):
 *             m = self.meta
 *             m.update((k, v.lower()) for k, v in self.tags(             # <<<<<<<<<<<<<<
 *                 ns='rio_creation_kwds').items())
 *             if self.is_tiled:
 */
struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr {
  PyObject_HEAD
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__ *__pyx_outer_scope;
  PyObject *__pyx_v_k;
  PyObject *__pyx_v_v;
  PyObject *__pyx_t_0;
  Py_ssize_t __pyx_t_1;
  PyObject *(*__pyx_t_2)(PyObject *);
};


/* "rasterio/_base.pyx":869
 * 
 * 
 * def window_index(window):             # <<<<<<<<<<<<<<
 *     return tuple(slice(*w) for w in window)
 * 
 */
struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index {
  PyObject_HEAD
  PyObject *__pyx_v_window;
};


/* "rasterio/_base.pyx":870
 * 
 * def window_index(window):
 *     return tuple(slice(*w) for w in window)             # <<<<<<<<<<<<<<
 * 
 * 
 */
struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_4_genexpr {
  PyObject_HEAD
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index *__pyx_outer_scope;
  PyObject *__pyx_v_w;
  PyObject *__pyx_t_0;
  Py_ssize_t __pyx_t_1;
  PyObject *(*__pyx_t_2)(PyObject *);
};



/* "rasterio/_base.pyx":43
 * 
 * 
 * cdef class DatasetReader(object):             # <<<<<<<<<<<<<<
 * 
 *     def __init__(self, path, options=None):
 */

struct __pyx_vtabstruct_8rasterio_5_base_DatasetReader {
  void *(*band)(struct __pyx_obj_8rasterio_5_base_DatasetReader *, int);
};
static struct __pyx_vtabstruct_8rasterio_5_base_DatasetReader *__pyx_vtabptr_8rasterio_5_base_DatasetReader;

/* --- Runtime support code (head) --- */
/* Refnanny.proto */
#ifndef CYTHON_REFNANNY
  #define CYTHON_REFNANNY 0
#endif
#if CYTHON_REFNANNY
  typedef struct {
    void (*INCREF)(void*, PyObject*, int);
    void (*DECREF)(void*, PyObject*, int);
    void (*GOTREF)(void*, PyObject*, int);
    void (*GIVEREF)(void*, PyObject*, int);
    void* (*SetupContext)(const char*, int, const char*);
    void (*FinishContext)(void**);
  } __Pyx_RefNannyAPIStruct;
  static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
  static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname);
  #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL;
#ifdef WITH_THREAD
  #define __Pyx_RefNannySetupContext(name, acquire_gil)\
          if (acquire_gil) {\
              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\
              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\
              PyGILState_Release(__pyx_gilstate_save);\
          } else {\
              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\
          }
#else
  #define __Pyx_RefNannySetupContext(name, acquire_gil)\
          __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
#endif
  #define __Pyx_RefNannyFinishContext()\
          __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
  #define __Pyx_INCREF(r)  __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_DECREF(r)  __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_GOTREF(r)  __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_XINCREF(r)  do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0)
  #define __Pyx_XDECREF(r)  do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0)
  #define __Pyx_XGOTREF(r)  do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0)
  #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0)
#else
  #define __Pyx_RefNannyDeclarations
  #define __Pyx_RefNannySetupContext(name, acquire_gil)
  #define __Pyx_RefNannyFinishContext()
  #define __Pyx_INCREF(r) Py_INCREF(r)
  #define __Pyx_DECREF(r) Py_DECREF(r)
  #define __Pyx_GOTREF(r)
  #define __Pyx_GIVEREF(r)
  #define __Pyx_XINCREF(r) Py_XINCREF(r)
  #define __Pyx_XDECREF(r) Py_XDECREF(r)
  #define __Pyx_XGOTREF(r)
  #define __Pyx_XGIVEREF(r)
#endif
#define __Pyx_XDECREF_SET(r, v) do {\
        PyObject *tmp = (PyObject *) r;\
        r = v; __Pyx_XDECREF(tmp);\
    } while (0)
#define __Pyx_DECREF_SET(r, v) do {\
        PyObject *tmp = (PyObject *) r;\
        r = v; __Pyx_DECREF(tmp);\
    } while (0)
#define __Pyx_CLEAR(r)    do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)
#define __Pyx_XCLEAR(r)   do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)

/* PyObjectGetAttrStr.proto */
#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) {
    PyTypeObject* tp = Py_TYPE(obj);
    if (likely(tp->tp_getattro))
        return tp->tp_getattro(obj, attr_name);
#if PY_MAJOR_VERSION < 3
    if (likely(tp->tp_getattr))
        return tp->tp_getattr(obj, PyString_AS_STRING(attr_name));
#endif
    return PyObject_GetAttr(obj, attr_name);
}
#else
#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n)
#endif

/* GetBuiltinName.proto */
static PyObject *__Pyx_GetBuiltinName(PyObject *name);

/* RaiseArgTupleInvalid.proto */
static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found);

/* RaiseDoubleKeywords.proto */
static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name);

/* ParseKeywords.proto */
static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\
    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\
    const char* function_name);

/* IncludeStringH.proto */
#include <string.h>

/* decode_c_string.proto */
static CYTHON_INLINE PyObject* __Pyx_decode_c_string(
         const char* cstring, Py_ssize_t start, Py_ssize_t stop,
         const char* encoding, const char* errors,
         PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors));

/* GetModuleGlobalName.proto */
static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name);

/* 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

/* 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);

/* RaiseTooManyValuesToUnpack.proto */
static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);

/* RaiseNeedMoreValuesToUnpack.proto */
static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);

/* IterFinish.proto */
static CYTHON_INLINE int __Pyx_IterFinish(void);

/* UnpackItemEndCheck.proto */
static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected);

/* PyObjectCallNoArg.proto */
#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func);
#else
#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL)
#endif

/* PyObjectLookupSpecial.proto */
#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02070000
static CYTHON_INLINE PyObject* __Pyx_PyObject_LookupSpecial(PyObject* obj, PyObject* attr_name) {
    PyObject *res;
    PyTypeObject *tp = Py_TYPE(obj);
#if PY_MAJOR_VERSION < 3
    if (unlikely(PyInstance_Check(obj)))
        return __Pyx_PyObject_GetAttrStr(obj, attr_name);
#endif
    res = _PyType_Lookup(tp, attr_name);
    if (likely(res)) {
        descrgetfunc f = Py_TYPE(res)->tp_descr_get;
        if (!f) {
            Py_INCREF(res);
        } else {
            res = f(res, obj, (PyObject *)tp);
        }
    } else {
        PyErr_SetObject(PyExc_AttributeError, attr_name);
    }
    return res;
}
#else
#define __Pyx_PyObject_LookupSpecial(o,n) __Pyx_PyObject_GetAttrStr(o,n)
#endif

/* PyThreadStateGet.proto */
#if CYTHON_COMPILING_IN_CPYTHON
#define __Pyx_PyThreadState_declare  PyThreadState *__pyx_tstate;
#define __Pyx_PyThreadState_assign  __pyx_tstate = PyThreadState_GET();
#else
#define __Pyx_PyThreadState_declare
#define __Pyx_PyThreadState_assign
#endif

/* SaveResetException.proto */
#if CYTHON_COMPILING_IN_CPYTHON
#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

/* GetException.proto */
#if CYTHON_COMPILING_IN_CPYTHON
#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

/* PyErrFetchRestore.proto */
#if CYTHON_COMPILING_IN_CPYTHON
#define __Pyx_ErrRestoreWithState(type, value, tb)  __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb)
#define __Pyx_ErrFetchWithState(type, value, tb)    __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb)
#define __Pyx_ErrRestore(type, value, tb)  __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb)
#define __Pyx_ErrFetch(type, value, tb)    __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb)
static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb);
static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
#else
#define __Pyx_ErrRestoreWithState(type, value, tb)  PyErr_Restore(type, value, tb)
#define __Pyx_ErrFetchWithState(type, value, tb)  PyErr_Fetch(type, value, tb)
#define __Pyx_ErrRestore(type, value, tb)  PyErr_Restore(type, value, tb)
#define __Pyx_ErrFetch(type, value, tb)  PyErr_Fetch(type, value, tb)
#endif

/* PyErrExceptionMatches.proto */
#if CYTHON_COMPILING_IN_CPYTHON
#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

/* RaiseException.proto */
static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause);

/* BytesEquals.proto */
static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals);

/* UnicodeEquals.proto */
static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals);

/* StrEquals.proto */
#if PY_MAJOR_VERSION >= 3
#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals
#else
#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals
#endif

/* PyIntBinop.proto */
#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyInt_EqObjC(PyObject *op1, PyObject *op2, long intval, int inplace);
#else
#define __Pyx_PyInt_EqObjC(op1, op2, intval, inplace)\
    PyObject_RichCompare(op1, op2, Py_EQ)
    #endif

/* PyIntBinop.proto */
#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyInt_RemainderObjC(PyObject *op1, PyObject *op2, long intval, int inplace);
#else
#define __Pyx_PyInt_RemainderObjC(op1, op2, intval, inplace)\
    (inplace ? PyNumber_InPlaceRemainder(op1, op2) : PyNumber_Remainder(op1, op2))
#endif

/* GetItemInt.proto */
#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
    __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\
    (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\
               __Pyx_GetItemInt_Generic(o, to_py_func(i))))
#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
    __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\
    (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL))
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
                                                              int wraparound, int boundscheck);
#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
    __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\
    (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL))
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
                                                              int wraparound, int boundscheck);
static CYTHON_INLINE 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);

/* None.proto */
static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname);

/* SetItemInt.proto */
#define __Pyx_SetItemInt(o, i, v, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
    __Pyx_SetItemInt_Fast(o, (Py_ssize_t)i, v, is_list, wraparound, boundscheck) :\
    (is_list ? (PyErr_SetString(PyExc_IndexError, "list assignment index out of range"), -1) :\
               __Pyx_SetItemInt_Generic(o, to_py_func(i), v)))
static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v);
static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v,
                                               int is_list, int wraparound, int boundscheck);

/* PyIntBinop.proto */
#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace);
#else
#define __Pyx_PyInt_AddObjC(op1, op2, intval, inplace)\
    (inplace ? PyNumber_InPlaceAdd(op1, op2) : PyNumber_Add(op1, op2))
#endif

/* ListAppend.proto */
#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
    PyListObject* L = (PyListObject*) list;
    Py_ssize_t len = Py_SIZE(list);
    if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) {
        Py_INCREF(x);
        PyList_SET_ITEM(list, len, x);
        Py_SIZE(list) = len+1;
        return 0;
    }
    return PyList_Append(list, x);
}
#else
#define __Pyx_PyList_Append(L,x) PyList_Append(L,x)
#endif

/* PyObjectCallMethod1.proto */
static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg);

/* append.proto */
static CYTHON_INLINE int __Pyx_PyObject_Append(PyObject* L, PyObject* x);

/* PyIntBinop.proto */
#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyInt_SubtractObjC(PyObject *op1, PyObject *op2, long intval, int inplace);
#else
#define __Pyx_PyInt_SubtractObjC(op1, op2, intval, inplace)\
    (inplace ? PyNumber_InPlaceSubtract(op1, op2) : PyNumber_Subtract(op1, op2))
#endif

/* None.proto */
static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname);

/* PyFloatBinop.proto */
#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyFloat_DivideObjC(PyObject *op1, PyObject *op2, double floatval, int inplace);
#else
#define __Pyx_PyFloat_DivideObjC(op1, op2, floatval, inplace)\
    ((inplace ? __Pyx_PyNumber_InPlaceDivide(op1, op2) : __Pyx_PyNumber_Divide(op1, op2)))
    #endif

/* PyObjectCallMethod0.proto */
static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name);

/* pop.proto */
static CYTHON_INLINE PyObject* __Pyx__PyObject_Pop(PyObject* L);
#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyList_Pop(PyObject* L);
#define __Pyx_PyObject_Pop(L) (likely(PyList_CheckExact(L)) ?\
    __Pyx_PyList_Pop(L) : __Pyx__PyObject_Pop(L))
#else
#define __Pyx_PyList_Pop(L)  __Pyx__PyObject_Pop(L)
#define __Pyx_PyObject_Pop(L)  __Pyx__PyObject_Pop(L)
#endif

/* UnpackUnboundCMethod.proto */
typedef struct {
    PyObject *type;
    PyObject **method_name;
    PyCFunction func;
    PyObject *method;
    int flag;
} __Pyx_CachedCFunction;

/* CallUnboundCMethod0.proto */
static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self);
#if CYTHON_COMPILING_IN_CPYTHON
#define __Pyx_CallUnboundCMethod0(cfunc, self)\
    ((likely((cfunc)->func)) ?\
        (likely((cfunc)->flag == METH_NOARGS) ?  (*((cfunc)->func))(self, NULL) :\
         (likely((cfunc)->flag == (METH_VARARGS | METH_KEYWORDS)) ?  ((*(PyCFunctionWithKeywords)(cfunc)->func)(self, __pyx_empty_tuple, NULL)) :\
             ((cfunc)->flag == METH_VARARGS ?  (*((cfunc)->func))(self, __pyx_empty_tuple) : __Pyx__CallUnboundCMethod0(cfunc, self)))) :\
        __Pyx__CallUnboundCMethod0(cfunc, self))
#else
#define __Pyx_CallUnboundCMethod0(cfunc, self)  __Pyx__CallUnboundCMethod0(cfunc, self)
#endif

/* PySequenceContains.proto */
static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) {
    int result = PySequence_Contains(seq, item);
    return unlikely(result < 0) ? result : (result == (eq == Py_EQ));
}

/* pyobject_as_double.proto */
static double __Pyx__PyObject_AsDouble(PyObject* obj);
#if CYTHON_COMPILING_IN_PYPY
#define __Pyx_PyObject_AsDouble(obj)\
(likely(PyFloat_CheckExact(obj)) ? PyFloat_AS_DOUBLE(obj) :\
 likely(PyInt_CheckExact(obj)) ?\
 PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj))
#else
#define __Pyx_PyObject_AsDouble(obj)\
((likely(PyFloat_CheckExact(obj))) ?\
 PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj))
#endif

/* PyFloatBinop.proto */
#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyFloat_SubtractCObj(PyObject *op1, PyObject *op2, double floatval, int inplace);
#else
#define __Pyx_PyFloat_SubtractCObj(op1, op2, floatval, inplace)\
    (inplace ? PyNumber_InPlaceSubtract(op1, op2) : PyNumber_Subtract(op1, op2))
#endif

/* StringJoin.proto */
#if PY_MAJOR_VERSION < 3
#define __Pyx_PyString_Join __Pyx_PyBytes_Join
#define __Pyx_PyBaseString_Join(s, v) (PyUnicode_CheckExact(s) ? PyUnicode_Join(s, v) : __Pyx_PyBytes_Join(s, v))
#else
#define __Pyx_PyString_Join PyUnicode_Join
#define __Pyx_PyBaseString_Join PyUnicode_Join
#endif
#if CYTHON_COMPILING_IN_CPYTHON
    #if PY_MAJOR_VERSION < 3
    #define __Pyx_PyBytes_Join _PyString_Join
    #else
    #define __Pyx_PyBytes_Join _PyBytes_Join
    #endif
#else
static CYTHON_INLINE PyObject* __Pyx_PyBytes_Join(PyObject* sep, PyObject* values);
#endif

/* WriteUnraisableException.proto */
static void __Pyx_WriteUnraisable(const char *name, int clineno,
                                  int lineno, const char *filename,
                                  int full_traceback, int nogil);

/* SwapException.proto */
#if CYTHON_COMPILING_IN_CPYTHON
#define __Pyx_ExceptionSwap(type, value, tb)  __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb)
static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
#else
static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb);
#endif

/* SetVTable.proto */
static int __Pyx_SetVtable(PyObject *dict, void *vtable);

/* Import.proto */
static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level);

/* ImportFrom.proto */
static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name);

/* CodeObjectCache.proto */
typedef struct {
    PyCodeObject* code_object;
    int code_line;
} __Pyx_CodeObjectCacheEntry;
struct __Pyx_CodeObjectCache {
    int count;
    int max_count;
    __Pyx_CodeObjectCacheEntry* entries;
};
static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL};
static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line);
static PyCodeObject *__pyx_find_code_object(int code_line);
static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);

/* AddTraceback.proto */
static void __Pyx_AddTraceback(const char *funcname, int c_line,
                               int py_line, const char *filename);

/* CIntToPy.proto */
static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value);

/* CIntToPy.proto */
static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value);

/* CIntToPy.proto */
static CYTHON_INLINE PyObject* __Pyx_PyInt_From_short(short value);

/* CIntFromPy.proto */
static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *);

/* CIntFromPy.proto */
static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *);

/* CIntFromPy.proto */
static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *);

/* FetchCommonType.proto */
static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type);

/* CoroutineBase.proto */
typedef PyObject *(*__pyx_coroutine_body_t)(PyObject *, PyObject *);
typedef struct {
    PyObject_HEAD
    __pyx_coroutine_body_t body;
    PyObject *closure;
    PyObject *exc_type;
    PyObject *exc_value;
    PyObject *exc_traceback;
    PyObject *gi_weakreflist;
    PyObject *classobj;
    PyObject *yieldfrom;
    PyObject *gi_name;
    PyObject *gi_qualname;
    int resume_label;
    char is_running;
} __pyx_CoroutineObject;
static __pyx_CoroutineObject *__Pyx__Coroutine_New(PyTypeObject *type, __pyx_coroutine_body_t body,
                                                   PyObject *closure, PyObject *name, PyObject *qualname);
static int __Pyx_Coroutine_clear(PyObject *self);
#if 1 || PY_VERSION_HEX < 0x030300B0
static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue);
#else
#define __Pyx_PyGen_FetchStopIterationValue(pvalue) PyGen_FetchStopIterationValue(pvalue)
#endif

/* PatchModuleWithCoroutine.proto */
static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code);

/* PatchGeneratorABC.proto */
static int __Pyx_patch_abc(void);

/* Generator.proto */
#define __Pyx_Generator_USED
static PyTypeObject *__pyx_GeneratorType = 0;
#define __Pyx_Generator_CheckExact(obj) (Py_TYPE(obj) == __pyx_GeneratorType)
#define __Pyx_Generator_New(body, closure, name, qualname)\
    __Pyx__Coroutine_New(__pyx_GeneratorType, body, closure, name, qualname)
static PyObject *__Pyx_Generator_Next(PyObject *self);
static int __pyx_Generator_init(void);

/* CheckBinaryVersion.proto */
static int __Pyx_check_binary_version(void);

/* FunctionExport.proto */
static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig);

/* InitStrings.proto */
static int __Pyx_InitStrings(__Pyx_StringTabEntry *t);

static void *__pyx_f_8rasterio_5_base_13DatasetReader_band(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, int __pyx_v_bidx); /* proto*/

/* Module declarations from 'libc.string' */

/* Module declarations from 'libc.stdlib' */

/* Module declarations from 'rasterio' */

/* Module declarations from 'rasterio._gdal' */

/* Module declarations from 'rasterio._ogr' */

/* Module declarations from 'rasterio._base' */
static PyTypeObject *__pyx_ptype_8rasterio_5_base_DatasetReader = 0;
static PyTypeObject *__pyx_ptype_8rasterio_5_base___pyx_scope_struct__block_windows = 0;
static PyTypeObject *__pyx_ptype_8rasterio_5_base___pyx_scope_struct_1___get__ = 0;
static PyTypeObject *__pyx_ptype_8rasterio_5_base___pyx_scope_struct_2_genexpr = 0;
static PyTypeObject *__pyx_ptype_8rasterio_5_base___pyx_scope_struct_3_window_index = 0;
static PyTypeObject *__pyx_ptype_8rasterio_5_base___pyx_scope_struct_4_genexpr = 0;
static void *__pyx_f_8rasterio_5_base__osr_from_crs(PyObject *); /*proto*/
static PyObject *__pyx_f_8rasterio_5_base_crop_window(PyObject *, int, int, int __pyx_skip_dispatch); /*proto*/
static PyObject *__pyx_f_8rasterio_5_base_eval_window(PyObject *, int, int, int __pyx_skip_dispatch); /*proto*/
#define __Pyx_MODULE_NAME "rasterio._base"
int __pyx_module_is_main_rasterio___base = 0;

/* Implementation of 'rasterio._base' */
static PyObject *__pyx_builtin_IndexError;
static PyObject *__pyx_builtin_ValueError;
static PyObject *__pyx_builtin_UserWarning;
static PyObject *__pyx_builtin_range;
static PyObject *__pyx_builtin_zip;
static PyObject *__pyx_builtin_FutureWarning;
static PyObject *__pyx_builtin_round;
static PyObject *__pyx_builtin_TypeError;
static PyObject *__pyx_builtin_AssertionError;
static const char __pyx_k_a[] = "a";
static const char __pyx_k_b[] = "b";
static const char __pyx_k_c[] = "c";
static const char __pyx_k_d[] = "d";
static const char __pyx_k_i[] = "i";
static const char __pyx_k_n[] = "n";
static const char __pyx_k_r[] = "r";
static const char __pyx_k_s[] = "+%s";
static const char __pyx_k_t[] = "t";
static const char __pyx_k_x[] = "x";
static const char __pyx_k_y[] = "y";
static const char __pyx_k_z[] = "z";
static const char __pyx_k_ns[] = "ns";
static const char __pyx_k_op[] = "op";
static const char __pyx_k_os[] = "os";
static const char __pyx_k_xs[] = "xs";
static const char __pyx_k_ys[] = "ys";
static const char __pyx_k_zs[] = "zs";
static const char __pyx_k_Env[] = "Env";
static const char __pyx_k__10[] = "=";
static const char __pyx_k__12[] = "+";
static const char __pyx_k__30[] = " ";
static const char __pyx_k__49[] = ":";
static const char __pyx_k_col[] = "col";
static const char __pyx_k_crs[] = "crs";
static const char __pyx_k_dst[] = "dst";
static const char __pyx_k_eps[] = "eps";
static const char __pyx_k_err[] = "err";
static const char __pyx_k_get[] = "get";
static const char __pyx_k_log[] = "log";
static const char __pyx_k_pop[] = "pop";
static const char __pyx_k_res[] = "res";
static const char __pyx_k_row[] = "row";
static const char __pyx_k_s_s[] = "+%s=%s";
static const char __pyx_k_src[] = "src";
static const char __pyx_k_sys[] = "sys";
static const char __pyx_k_top[] = "top";
static const char __pyx_k_zip[] = "zip";
static const char __pyx_k_EPSG[] = "EPSG";
static const char __pyx_k_args[] = "args";
static const char __pyx_k_bidx[] = "bidx";
static const char __pyx_k_ceil[] = "ceil";
static const char __pyx_k_cple[] = "cple";
static const char __pyx_k_crs1[] = "crs1";
static const char __pyx_k_crs2[] = "crs2";
static const char __pyx_k_epsg[] = "epsg:";
static const char __pyx_k_exit[] = "__exit__";
static const char __pyx_k_info[] = "info";
static const char __pyx_k_init[] = "init";
static const char __pyx_k_join[] = "join";
static const char __pyx_k_left[] = "left";
static const char __pyx_k_main[] = "__main__";
static const char __pyx_k_math[] = "math";
static const char __pyx_k_meta[] = "meta";
static const char __pyx_k_name[] = "name";
static const char __pyx_k_open[] = "open";
static const char __pyx_k_path[] = "path";
static const char __pyx_k_send[] = "send";
static const char __pyx_k_sqrt[] = "sqrt";
static const char __pyx_k_stop[] = "stop";
static const char __pyx_k_tags[] = "tags";
static const char __pyx_k_test[] = "__test__";
static const char __pyx_k_type[] = "type";
static const char __pyx_k_warn[] = "warn";
static const char __pyx_k_check[] = "check";
static const char __pyx_k_close[] = "close";
static const char __pyx_k_count[] = "count";
static const char __pyx_k_debug[] = "debug";
static const char __pyx_k_dtype[] = "dtype";
static const char __pyx_k_enter[] = "__enter__";
static const char __pyx_k_float[] = "float_";
static const char __pyx_k_floor[] = "floor";
static const char __pyx_k_items[] = "items";
static const char __pyx_k_lower[] = "lower";
static const char __pyx_k_major[] = "major";
static const char __pyx_k_minor[] = "minor";
static const char __pyx_k_range[] = "range";
static const char __pyx_k_right[] = "right";
static const char __pyx_k_round[] = "round";
static const char __pyx_k_split[] = "split";
static const char __pyx_k_strip[] = "strip";
static const char __pyx_k_throw[] = "throw";
static const char __pyx_k_tiled[] = "tiled";
static const char __pyx_k_upper[] = "upper";
static const char __pyx_k_utf_8[] = "utf-8";
static const char __pyx_k_value[] = "value";
static const char __pyx_k_ver_b[] = "ver_b";
static const char __pyx_k_ver_c[] = "ver_c";
static const char __pyx_k_width[] = "width";
static const char __pyx_k_Affine[] = "Affine";
static const char __pyx_k_affine[] = "affine";
static const char __pyx_k_append[] = "append";
static const char __pyx_k_bottom[] = "bottom";
static const char __pyx_k_bounds[] = "bounds";
static const char __pyx_k_closed[] = "closed";
static const char __pyx_k_driver[] = "driver";
static const char __pyx_k_dtypes[] = "dtypes";
static const char __pyx_k_encode[] = "encode";
static const char __pyx_k_errmsg[] = "errmsg";
static const char __pyx_k_height[] = "height";
static const char __pyx_k_import[] = "__import__";
static const char __pyx_k_lstrip[] = "lstrip";
static const char __pyx_k_name_2[] = "__name__";
static const char __pyx_k_nodata[] = "nodata";
static const char __pyx_k_proj_c[] = "proj_c";
static const char __pyx_k_res_xs[] = "res_xs";
static const char __pyx_k_res_ys[] = "res_ys";
static const char __pyx_k_res_zs[] = "res_zs";
static const char __pyx_k_retval[] = "retval";
static const char __pyx_k_scheme[] = "scheme";
static const char __pyx_k_update[] = "update";
static const char __pyx_k_window[] = "window";
static const char __pyx_k_wktext[] = "wktext";
static const char __pyx_k_archive[] = "archive";
static const char __pyx_k_dst_crs[] = "dst_crs";
static const char __pyx_k_failure[] = "failure";
static const char __pyx_k_genexpr[] = "genexpr";
static const char __pyx_k_get_crs[] = "get_crs";
static const char __pyx_k_indexes[] = "indexes";
static const char __pyx_k_logging[] = "logging";
static const char __pyx_k_no_defs[] = "no_defs";
static const char __pyx_k_options[] = "options";
static const char __pyx_k_osr_crs[] = "osr_crs";
static const char __pyx_k_src_crs[] = "src_crs";
static const char __pyx_k_to_gdal[] = "to_gdal";
static const char __pyx_k_CRSError[] = "CRSError";
static const char __pyx_k_Params_s[] = "Params: %s";
static const char __pyx_k_compress[] = "compress";
static const char __pyx_k_is_tiled[] = "is_tiled";
static const char __pyx_k_osr_crs1[] = "osr_crs1";
static const char __pyx_k_osr_crs2[] = "osr_crs2";
static const char __pyx_k_rasterio[] = "rasterio";
static const char __pyx_k_read_crs[] = "read_crs";
static const char __pyx_k_vsi_path[] = "vsi_path";
static const char __pyx_k_warnings[] = "warnings";
static const char __pyx_k_CPLErrors[] = "CPLErrors";
static const char __pyx_k_GDALError[] = "GDALError";
static const char __pyx_k_NULL_band[] = "NULL band";
static const char __pyx_k_Null_band[] = "Null band";
static const char __pyx_k_TypeError[] = "TypeError";
static const char __pyx_k_boundless[] = "boundless";
static const char __pyx_k_dtype_fwd[] = "dtype_fwd";
static const char __pyx_k_epsg_4326[] = "epsg:4326";
static const char __pyx_k_from_gdal[] = "from_gdal";
static const char __pyx_k_getLogger[] = "getLogger";
static const char __pyx_k_get_index[] = "get_index";
static const char __pyx_k_precision[] = "precision";
static const char __pyx_k_traceback[] = "traceback";
static const char __pyx_k_transform[] = "transform";
static const char __pyx_k_INTERLEAVE[] = "INTERLEAVE";
static const char __pyx_k_IndexError[] = "IndexError";
static const char __pyx_k_ValueError[] = "ValueError";
static const char __pyx_k_blockxsize[] = "blockxsize";
static const char __pyx_k_blockysize[] = "blockysize";
static const char __pyx_k_get_window[] = "get_window";
static const char __pyx_k_interleave[] = "interleave";
static const char __pyx_k_nodatavals[] = "nodatavals";
static const char __pyx_k_parse_path[] = "parse_path";
static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__";
static const char __pyx_k_stacklevel[] = "stacklevel";
static const char __pyx_k_BoundingBox[] = "BoundingBox";
static const char __pyx_k_COMPRESSION[] = "COMPRESSION";
static const char __pyx_k_ColorInterp[] = "ColorInterp";
static const char __pyx_k_Compression[] = "Compression";
static const char __pyx_k_UserWarning[] = "UserWarning";
static const char __pyx_k_compression[] = "compression";
static const char __pyx_k_is_same_crs[] = "is_same_crs";
static const char __pyx_k_photometric[] = "photometric";
static const char __pyx_k_transform_2[] = "_transform";
static const char __pyx_k_translation[] = "translation";
static const char __pyx_k_window_stop[] = "window_stop";
static const char __pyx_k_Interleaving[] = "Interleaving";
static const char __pyx_k_Null_dataset[] = "Null dataset";
static const char __pyx_k_block_shapes[] = "block_shapes";
static const char __pyx_k_dtype_ranges[] = "dtype_ranges";
static const char __pyx_k_gdal_version[] = "gdal_version";
static const char __pyx_k_interleaving[] = "interleaving";
static const char __pyx_k_rasterio_env[] = "rasterio.env";
static const char __pyx_k_rasterio_vfs[] = "rasterio.vfs";
static const char __pyx_k_read_crs_wkt[] = "read_crs_wkt";
static const char __pyx_k_window_index[] = "window_index";
static const char __pyx_k_window_shape[] = "window_shape";
static const char __pyx_k_window_start[] = "window_start";
static const char __pyx_k_Color_d_d_d_d[] = "Color: (%d, %d, %d, %d)";
static const char __pyx_k_FutureWarning[] = "FutureWarning";
static const char __pyx_k_block_windows[] = "block_windows";
static const char __pyx_k_get_transform[] = "get_transform";
static const char __pyx_k_rasterio__err[] = "rasterio._err";
static const char __pyx_k_AssertionError[] = "AssertionError";
static const char __pyx_k_get_nodatavals[] = "get_nodatavals";
static const char __pyx_k_rasterio__base[] = "rasterio._base";
static const char __pyx_k_rasterio_enums[] = "rasterio.enums";
static const char __pyx_k_read_transform[] = "read_transform";
static const char __pyx_k_CPLE_IllegalArg[] = "CPLE_IllegalArg";
static const char __pyx_k_CPLE_OpenFailed[] = "CPLE_OpenFailed";
static const char __pyx_k_IMAGE_STRUCTURE[] = "IMAGE_STRUCTURE";
static const char __pyx_k_Null_projection[] = "Null projection";
static const char __pyx_k_RasterioIOError[] = "RasterioIOError";
static const char __pyx_k_invalid_width_d[] = "invalid width: %d";
static const char __pyx_k_rasterio_coords[] = "rasterio.coords";
static const char __pyx_k_rasterio_errors[] = "rasterio.errors";
static const char __pyx_k_NULL_color_table[] = "NULL color table";
static const char __pyx_k_invalid_height_d[] = "invalid height: %d";
static const char __pyx_k_is_projected_crs[] = "is_projected_crs";
static const char __pyx_k_tastes_like_gdal[] = "tastes_like_gdal";
static const char __pyx_k_CPLE_NotSupported[] = "CPLE_NotSupported";
static const char __pyx_k_PhotometricInterp[] = "PhotometricInterp";
static const char __pyx_k_is_geographic_crs[] = "is_geographic_crs";
static const char __pyx_k_rio_creation_kwds[] = "rio_creation_kwds";
static const char __pyx_k_Invalid_band_index[] = "Invalid band index";
static const char __pyx_k_SOURCE_COLOR_SPACE[] = "SOURCE_COLOR_SPACE";
static const char __pyx_k_check_gdal_version[] = "check_gdal_version";
static const char __pyx_k_rasterio_transform[] = "rasterio.transform";
static const char __pyx_k_Dataset_r_is_started[] = "Dataset %r is started.";
static const char __pyx_k_Got_coordinate_system[] = "Got coordinate system";
static const char __pyx_k_Numpy_free_base_classes[] = "Numpy-free base classes.";
static const char __pyx_k_PROJ_4_to_be_imported_r[] = "PROJ.4 to be imported: %r";
static const char __pyx_k_Exited_Dataset_r_context[] = "Exited Dataset %r context.";
static const char __pyx_k_NULL_color_at_d_skipping[] = "NULL color at %d, skipping";
static const char __pyx_k_Dataset_r_has_been_closed[] = "Dataset %r has been closed.";
static const char __pyx_k_Dataset_r_has_been_stopped[] = "Dataset %r has been stopped.";
static const char __pyx_k_Entering_Dataset_r_context[] = "Entering Dataset %r context.";
static const char __pyx_k_DatasetReader_block_windows[] = "DatasetReader.block_windows";
static const char __pyx_k_Unexpected_proj_parameter_s[] = "Unexpected proj parameter %s";
static const char __pyx_k_window_index_locals_genexpr[] = "window_index.<locals>.genexpr";
static const char __pyx_k_invalid_window_col_range_d_d[] = "invalid window: col range (%d, %d)";
static const char __pyx_k_invalid_window_row_range_d_d[] = "invalid window: row range (%d, %d)";
static const char __pyx_k_s_RasterReader_name_s_mode_s[] = "<%s RasterReader name='%s' mode='%s'>";
static const char __pyx_k_Can_t_read_closed_raster_file[] = "Can't read closed raster file";
static const char __pyx_k_can_t_read_closed_raster_file[] = "can't read closed raster file";
static const char __pyx_k_Failed_to_auto_identify_EPSG_d[] = "Failed to auto identify EPSG: %d";
static const char __pyx_k_GDAL_dataset_has_no_projection[] = "GDAL dataset has no projection.";
static const char __pyx_k_Dataset_has_no_geotransform_set[] = "Dataset has no geotransform set.  Default transform will be applied (Affine.identity())";
static const char __pyx_k_Nodata_success_d_Nodata_value_f[] = "Nodata success: %d, Nodata value: %f";
static const char __pyx_k_The_value_of_this_property_will[] = "The value of this property will change in version 1.0. Please see https://github.com/mapbox/rasterio/issues/86 for details.";
static const char __pyx_k_Users_sean_code_frs_wheel_build[] = "/Users/sean/code/frs-wheel-builds/src/rasterio/rasterio/_base.pyx";
static const char __pyx_k_A_band_index_must_be_provided_wh[] = "A band index must be provided when band block shapesare inhomogeneous";
static const char __pyx_k_DatasetReader___get___locals_gen[] = "DatasetReader.__get__.<locals>.genexpr";
static const char __pyx_k_Unexpected_NULL_spatial_referenc[] = "Unexpected NULL spatial reference";
static const char __pyx_k_Unexpected_Null_spatial_referenc[] = "Unexpected Null spatial reference";
static const char __pyx_k_invalid_window_structure_expecti[] = "invalid window structure; expecting ((row_start, row_stop), (col_start, col_stop))";
static PyObject *__pyx_kp_s_A_band_index_must_be_provided_wh;
static PyObject *__pyx_n_s_Affine;
static PyObject *__pyx_n_s_AssertionError;
static PyObject *__pyx_n_s_BoundingBox;
static PyObject *__pyx_n_s_COMPRESSION;
static PyObject *__pyx_n_s_CPLE_IllegalArg;
static PyObject *__pyx_n_s_CPLE_NotSupported;
static PyObject *__pyx_n_s_CPLE_OpenFailed;
static PyObject *__pyx_n_s_CPLErrors;
static PyObject *__pyx_n_s_CRSError;
static PyObject *__pyx_kp_s_Can_t_read_closed_raster_file;
static PyObject *__pyx_n_s_ColorInterp;
static PyObject *__pyx_kp_s_Color_d_d_d_d;
static PyObject *__pyx_n_s_Compression;
static PyObject *__pyx_n_s_DatasetReader___get___locals_gen;
static PyObject *__pyx_n_s_DatasetReader_block_windows;
static PyObject *__pyx_kp_s_Dataset_has_no_geotransform_set;
static PyObject *__pyx_kp_s_Dataset_r_has_been_closed;
static PyObject *__pyx_kp_s_Dataset_r_has_been_stopped;
static PyObject *__pyx_kp_s_Dataset_r_is_started;
static PyObject *__pyx_n_s_EPSG;
static PyObject *__pyx_kp_s_Entering_Dataset_r_context;
static PyObject *__pyx_n_s_Env;
static PyObject *__pyx_kp_s_Exited_Dataset_r_context;
static PyObject *__pyx_kp_s_Failed_to_auto_identify_EPSG_d;
static PyObject *__pyx_n_s_FutureWarning;
static PyObject *__pyx_n_s_GDALError;
static PyObject *__pyx_kp_s_GDAL_dataset_has_no_projection;
static PyObject *__pyx_kp_s_Got_coordinate_system;
static PyObject *__pyx_n_s_IMAGE_STRUCTURE;
static PyObject *__pyx_n_s_INTERLEAVE;
static PyObject *__pyx_n_s_IndexError;
static PyObject *__pyx_n_s_Interleaving;
static PyObject *__pyx_kp_s_Invalid_band_index;
static PyObject *__pyx_kp_s_NULL_band;
static PyObject *__pyx_kp_s_NULL_color_at_d_skipping;
static PyObject *__pyx_kp_s_NULL_color_table;
static PyObject *__pyx_kp_s_Nodata_success_d_Nodata_value_f;
static PyObject *__pyx_kp_s_Null_band;
static PyObject *__pyx_kp_s_Null_dataset;
static PyObject *__pyx_kp_s_Null_projection;
static PyObject *__pyx_kp_s_PROJ_4_to_be_imported_r;
static PyObject *__pyx_kp_s_Params_s;
static PyObject *__pyx_n_s_PhotometricInterp;
static PyObject *__pyx_n_s_RasterioIOError;
static PyObject *__pyx_n_s_SOURCE_COLOR_SPACE;
static PyObject *__pyx_kp_s_The_value_of_this_property_will;
static PyObject *__pyx_n_s_TypeError;
static PyObject *__pyx_kp_s_Unexpected_NULL_spatial_referenc;
static PyObject *__pyx_kp_s_Unexpected_Null_spatial_referenc;
static PyObject *__pyx_kp_s_Unexpected_proj_parameter_s;
static PyObject *__pyx_n_s_UserWarning;
static PyObject *__pyx_kp_s_Users_sean_code_frs_wheel_build;
static PyObject *__pyx_n_s_ValueError;
static PyObject *__pyx_kp_s__10;
static PyObject *__pyx_kp_s__12;
static PyObject *__pyx_kp_s__30;
static PyObject *__pyx_kp_s__49;
static PyObject *__pyx_n_s_a;
static PyObject *__pyx_n_s_affine;
static PyObject *__pyx_n_s_append;
static PyObject *__pyx_n_s_archive;
static PyObject *__pyx_n_s_args;
static PyObject *__pyx_n_s_b;
static PyObject *__pyx_n_s_bidx;
static PyObject *__pyx_n_s_block_shapes;
static PyObject *__pyx_n_s_block_windows;
static PyObject *__pyx_n_s_blockxsize;
static PyObject *__pyx_n_s_blockysize;
static PyObject *__pyx_n_s_bottom;
static PyObject *__pyx_n_s_boundless;
static PyObject *__pyx_n_s_bounds;
static PyObject *__pyx_n_s_c;
static PyObject *__pyx_kp_s_can_t_read_closed_raster_file;
static PyObject *__pyx_n_s_ceil;
static PyObject *__pyx_n_s_check;
static PyObject *__pyx_n_s_check_gdal_version;
static PyObject *__pyx_n_s_close;
static PyObject *__pyx_n_s_closed;
static PyObject *__pyx_n_s_col;
static PyObject *__pyx_n_s_compress;
static PyObject *__pyx_n_s_compression;
static PyObject *__pyx_n_s_count;
static PyObject *__pyx_n_s_cple;
static PyObject *__pyx_n_s_crs;
static PyObject *__pyx_n_s_crs1;
static PyObject *__pyx_n_s_crs2;
static PyObject *__pyx_n_s_d;
static PyObject *__pyx_n_s_debug;
static PyObject *__pyx_n_s_driver;
static PyObject *__pyx_n_s_dst;
static PyObject *__pyx_n_s_dst_crs;
static PyObject *__pyx_n_s_dtype;
static PyObject *__pyx_n_s_dtype_fwd;
static PyObject *__pyx_n_s_dtype_ranges;
static PyObject *__pyx_n_s_dtypes;
static PyObject *__pyx_n_s_encode;
static PyObject *__pyx_n_s_enter;
static PyObject *__pyx_n_s_eps;
static PyObject *__pyx_kp_s_epsg;
static PyObject *__pyx_kp_s_epsg_4326;
static PyObject *__pyx_n_s_err;
static PyObject *__pyx_n_s_errmsg;
static PyObject *__pyx_n_s_exit;
static PyObject *__pyx_n_s_failure;
static PyObject *__pyx_n_s_float;
static PyObject *__pyx_n_s_floor;
static PyObject *__pyx_n_s_from_gdal;
static PyObject *__pyx_n_s_gdal_version;
static PyObject *__pyx_n_s_genexpr;
static PyObject *__pyx_n_s_get;
static PyObject *__pyx_n_s_getLogger;
static PyObject *__pyx_n_s_get_crs;
static PyObject *__pyx_n_s_get_index;
static PyObject *__pyx_n_s_get_nodatavals;
static PyObject *__pyx_n_s_get_transform;
static PyObject *__pyx_n_s_get_window;
static PyObject *__pyx_n_s_height;
static PyObject *__pyx_n_s_i;
static PyObject *__pyx_n_s_import;
static PyObject *__pyx_n_s_indexes;
static PyObject *__pyx_n_s_info;
static PyObject *__pyx_n_s_init;
static PyObject *__pyx_n_s_interleave;
static PyObject *__pyx_n_s_interleaving;
static PyObject *__pyx_kp_s_invalid_height_d;
static PyObject *__pyx_kp_s_invalid_width_d;
static PyObject *__pyx_kp_s_invalid_window_col_range_d_d;
static PyObject *__pyx_kp_s_invalid_window_row_range_d_d;
static PyObject *__pyx_kp_s_invalid_window_structure_expecti;
static PyObject *__pyx_n_s_is_geographic_crs;
static PyObject *__pyx_n_s_is_projected_crs;
static PyObject *__pyx_n_s_is_same_crs;
static PyObject *__pyx_n_s_is_tiled;
static PyObject *__pyx_n_s_items;
static PyObject *__pyx_n_s_join;
static PyObject *__pyx_n_s_left;
static PyObject *__pyx_n_s_log;
static PyObject *__pyx_n_s_logging;
static PyObject *__pyx_n_s_lower;
static PyObject *__pyx_n_s_lstrip;
static PyObject *__pyx_n_s_main;
static PyObject *__pyx_n_s_major;
static PyObject *__pyx_n_s_math;
static PyObject *__pyx_n_s_meta;
static PyObject *__pyx_n_s_minor;
static PyObject *__pyx_n_s_n;
static PyObject *__pyx_n_s_name;
static PyObject *__pyx_n_s_name_2;
static PyObject *__pyx_n_s_no_defs;
static PyObject *__pyx_n_s_nodata;
static PyObject *__pyx_n_s_nodatavals;
static PyObject *__pyx_n_s_ns;
static PyObject *__pyx_n_s_op;
static PyObject *__pyx_n_s_open;
static PyObject *__pyx_n_s_options;
static PyObject *__pyx_n_s_os;
static PyObject *__pyx_n_s_osr_crs;
static PyObject *__pyx_n_s_osr_crs1;
static PyObject *__pyx_n_s_osr_crs2;
static PyObject *__pyx_n_s_parse_path;
static PyObject *__pyx_n_s_path;
static PyObject *__pyx_n_s_photometric;
static PyObject *__pyx_n_s_pop;
static PyObject *__pyx_n_s_precision;
static PyObject *__pyx_n_s_proj_c;
static PyObject *__pyx_n_s_pyx_vtable;
static PyObject *__pyx_n_s_r;
static PyObject *__pyx_n_s_range;
static PyObject *__pyx_n_s_rasterio;
static PyObject *__pyx_n_s_rasterio__base;
static PyObject *__pyx_n_s_rasterio__err;
static PyObject *__pyx_n_s_rasterio_coords;
static PyObject *__pyx_n_s_rasterio_enums;
static PyObject *__pyx_n_s_rasterio_env;
static PyObject *__pyx_n_s_rasterio_errors;
static PyObject *__pyx_n_s_rasterio_transform;
static PyObject *__pyx_n_s_rasterio_vfs;
static PyObject *__pyx_n_s_read_crs;
static PyObject *__pyx_n_s_read_crs_wkt;
static PyObject *__pyx_n_s_read_transform;
static PyObject *__pyx_n_s_res;
static PyObject *__pyx_n_s_res_xs;
static PyObject *__pyx_n_s_res_ys;
static PyObject *__pyx_n_s_res_zs;
static PyObject *__pyx_n_s_retval;
static PyObject *__pyx_n_s_right;
static PyObject *__pyx_n_s_rio_creation_kwds;
static PyObject *__pyx_n_s_round;
static PyObject *__pyx_n_s_row;
static PyObject *__pyx_kp_s_s;
static PyObject *__pyx_kp_s_s_RasterReader_name_s_mode_s;
static PyObject *__pyx_kp_s_s_s;
static PyObject *__pyx_n_s_scheme;
static PyObject *__pyx_n_s_send;
static PyObject *__pyx_n_s_split;
static PyObject *__pyx_n_s_sqrt;
static PyObject *__pyx_n_s_src;
static PyObject *__pyx_n_s_src_crs;
static PyObject *__pyx_n_s_stacklevel;
static PyObject *__pyx_n_s_stop;
static PyObject *__pyx_n_s_strip;
static PyObject *__pyx_n_s_sys;
static PyObject *__pyx_n_s_t;
static PyObject *__pyx_n_s_tags;
static PyObject *__pyx_n_s_tastes_like_gdal;
static PyObject *__pyx_n_s_test;
static PyObject *__pyx_n_s_throw;
static PyObject *__pyx_n_s_tiled;
static PyObject *__pyx_n_s_to_gdal;
static PyObject *__pyx_n_s_top;
static PyObject *__pyx_n_s_traceback;
static PyObject *__pyx_n_s_transform;
static PyObject *__pyx_n_s_transform_2;
static PyObject *__pyx_n_s_translation;
static PyObject *__pyx_n_s_type;
static PyObject *__pyx_n_s_update;
static PyObject *__pyx_n_s_upper;
static PyObject *__pyx_kp_s_utf_8;
static PyObject *__pyx_n_s_value;
static PyObject *__pyx_n_s_ver_b;
static PyObject *__pyx_n_s_ver_c;
static PyObject *__pyx_n_s_vsi_path;
static PyObject *__pyx_n_s_warn;
static PyObject *__pyx_n_s_warnings;
static PyObject *__pyx_n_s_width;
static PyObject *__pyx_n_s_window;
static PyObject *__pyx_n_s_window_index;
static PyObject *__pyx_n_s_window_index_locals_genexpr;
static PyObject *__pyx_n_s_window_shape;
static PyObject *__pyx_n_s_window_start;
static PyObject *__pyx_n_s_window_stop;
static PyObject *__pyx_n_s_wktext;
static PyObject *__pyx_n_s_x;
static PyObject *__pyx_n_s_xs;
static PyObject *__pyx_n_s_y;
static PyObject *__pyx_n_s_ys;
static PyObject *__pyx_n_s_z;
static PyObject *__pyx_n_s_zip;
static PyObject *__pyx_n_s_zs;
static PyObject *__pyx_pf_8rasterio_5_base_check_gdal_version(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_major, PyObject *__pyx_v_minor); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_2gdal_version(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader___init__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_path, PyObject *__pyx_v_options); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_2__repr__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4start(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6_has_band(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_8read_crs(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_10read_crs_wkt(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_12read_transform(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_14stop(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_16close(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_18__enter__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_20__exit__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_type, CYTHON_UNUSED PyObject *__pyx_v_value, CYTHON_UNUSED PyObject *__pyx_v_traceback); /* proto */
static void __pyx_pf_8rasterio_5_base_13DatasetReader_22__dealloc__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6closed___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_5count___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7indexes___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6dtypes___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_12block_shapes___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_24get_nodatavals(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_10nodatavals___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6nodata___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_10mask_flags___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_26block_windows(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6bounds___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_3res___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_29ul(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_row, PyObject *__pyx_v_col); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_31index(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_x, PyObject *__pyx_v_y, PyObject *__pyx_v_op, PyObject *__pyx_v_precision); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_33window(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_left, PyObject *__pyx_v_bottom, PyObject *__pyx_v_right, PyObject *__pyx_v_top, PyObject *__pyx_v_boundless); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_35window_transform(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_window); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_37window_bounds(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_window); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4meta___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_11compression___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_12interleaving___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_11photometric___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_8is_tiled___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7profile_7__get___genexpr(PyObject *__pyx_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7profile___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_39lnglat(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_41get_crs(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_3crs___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7crs_wkt___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_43get_transform(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_9transform___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6affine___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_45tags(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx, PyObject *__pyx_v_ns); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_47colorinterp(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_49colormap(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4kwds___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_51overviews(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_53checksum(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx, PyObject *__pyx_v_window); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4name___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4mode___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7options___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_5width___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6height___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_5shape___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6driver___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_6driver_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_6driver_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6_count___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_6_count_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_6_count_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7_dtypes___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_7_dtypes_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_7_dtypes_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7_closed___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_7_closed_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_7_closed_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4_crs___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_4_crs_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_4_crs_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_8_crs_wkt___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_8_crs_wkt_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_8_crs_wkt_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_10_transform___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_10_transform_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_10_transform_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_13_block_shapes___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_13_block_shapes_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_13_block_shapes_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_11_nodatavals___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_11_nodatavals_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_11_nodatavals_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_5_read___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_5_read_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_8rasterio_5_base_13DatasetReader_5_read_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_4crop_window(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_window, int __pyx_v_height, int __pyx_v_width); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_6eval_window(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_window, int __pyx_v_height, int __pyx_v_width); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_8get_index(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x, PyObject *__pyx_v_y, PyObject *__pyx_v_affine, PyObject *__pyx_v_op, PyObject *__pyx_v_precision); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_10get_window(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_left, PyObject *__pyx_v_bottom, PyObject *__pyx_v_right, PyObject *__pyx_v_top, PyObject *__pyx_v_affine, PyObject *__pyx_v_precision); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_12window_shape(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_window, PyObject *__pyx_v_height, PyObject *__pyx_v_width); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_12window_index_genexpr(PyObject *__pyx_self); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_14window_index(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_window); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_16tastes_like_gdal(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_t); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_18_transform(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_src_crs, PyObject *__pyx_v_dst_crs, PyObject *__pyx_v_xs, PyObject *__pyx_v_ys, PyObject *__pyx_v_zs); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_20is_geographic_crs(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_crs); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_22is_projected_crs(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_crs); /* proto */
static PyObject *__pyx_pf_8rasterio_5_base_24is_same_crs(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_crs1, PyObject *__pyx_v_crs2); /* proto */
static PyObject *__pyx_tp_new_8rasterio_5_base_DatasetReader(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_8rasterio_5_base___pyx_scope_struct__block_windows(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_8rasterio_5_base___pyx_scope_struct_1___get__(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_8rasterio_5_base___pyx_scope_struct_2_genexpr(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_8rasterio_5_base___pyx_scope_struct_3_window_index(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_8rasterio_5_base___pyx_scope_struct_4_genexpr(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static __Pyx_CachedCFunction __pyx_umethod_PyList_Type_pop = {0, &__pyx_n_s_pop, 0, 0, 0};
static PyObject *__pyx_float_0_0;
static PyObject *__pyx_float_0_1;
static PyObject *__pyx_float_1_0;
static PyObject *__pyx_float_2_0;
static PyObject *__pyx_float_10_0;
static PyObject *__pyx_int_0;
static PyObject *__pyx_int_1;
static PyObject *__pyx_int_2;
static PyObject *__pyx_int_6;
static PyObject *__pyx_int_neg_1;
static PyObject *__pyx_k__28;
static PyObject *__pyx_k__46;
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__7;
static PyObject *__pyx_tuple__8;
static PyObject *__pyx_tuple__9;
static PyObject *__pyx_tuple__11;
static PyObject *__pyx_tuple__13;
static PyObject *__pyx_tuple__14;
static PyObject *__pyx_tuple__15;
static PyObject *__pyx_tuple__16;
static PyObject *__pyx_tuple__17;
static PyObject *__pyx_tuple__18;
static PyObject *__pyx_tuple__19;
static PyObject *__pyx_tuple__20;
static PyObject *__pyx_tuple__21;
static PyObject *__pyx_tuple__22;
static PyObject *__pyx_tuple__23;
static PyObject *__pyx_tuple__24;
static PyObject *__pyx_tuple__25;
static PyObject *__pyx_tuple__26;
static PyObject *__pyx_tuple__27;
static PyObject *__pyx_tuple__29;
static PyObject *__pyx_tuple__31;
static PyObject *__pyx_tuple__32;
static PyObject *__pyx_tuple__33;
static PyObject *__pyx_tuple__34;
static PyObject *__pyx_tuple__35;
static PyObject *__pyx_tuple__36;
static PyObject *__pyx_tuple__37;
static PyObject *__pyx_tuple__38;
static PyObject *__pyx_tuple__39;
static PyObject *__pyx_tuple__40;
static PyObject *__pyx_tuple__41;
static PyObject *__pyx_tuple__42;
static PyObject *__pyx_tuple__43;
static PyObject *__pyx_tuple__44;
static PyObject *__pyx_tuple__45;
static PyObject *__pyx_tuple__47;
static PyObject *__pyx_tuple__48;
static PyObject *__pyx_tuple__50;
static PyObject *__pyx_tuple__51;
static PyObject *__pyx_tuple__52;
static PyObject *__pyx_tuple__53;
static PyObject *__pyx_tuple__54;
static PyObject *__pyx_tuple__56;
static PyObject *__pyx_tuple__58;
static PyObject *__pyx_tuple__60;
static PyObject *__pyx_tuple__62;
static PyObject *__pyx_tuple__64;
static PyObject *__pyx_tuple__66;
static PyObject *__pyx_tuple__68;
static PyObject *__pyx_tuple__70;
static PyObject *__pyx_tuple__72;
static PyObject *__pyx_tuple__74;
static PyObject *__pyx_codeobj__55;
static PyObject *__pyx_codeobj__57;
static PyObject *__pyx_codeobj__59;
static PyObject *__pyx_codeobj__61;
static PyObject *__pyx_codeobj__63;
static PyObject *__pyx_codeobj__65;
static PyObject *__pyx_codeobj__67;
static PyObject *__pyx_codeobj__69;
static PyObject *__pyx_codeobj__71;
static PyObject *__pyx_codeobj__73;
static PyObject *__pyx_codeobj__75;

/* "rasterio/_base.pyx":30
 * 
 * 
 * def check_gdal_version(major, minor):             # <<<<<<<<<<<<<<
 *     """Return True if the major and minor versions match."""
 *     return bool(_gdal.GDALCheckVersion(int(major), int(minor), NULL))
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_1check_gdal_version(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_check_gdal_version[] = "Return True if the major and minor versions match.";
static PyMethodDef __pyx_mdef_8rasterio_5_base_1check_gdal_version = {"check_gdal_version", (PyCFunction)__pyx_pw_8rasterio_5_base_1check_gdal_version, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_check_gdal_version};
static PyObject *__pyx_pw_8rasterio_5_base_1check_gdal_version(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_major = 0;
  PyObject *__pyx_v_minor = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("check_gdal_version (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_major,&__pyx_n_s_minor,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_major)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_minor)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("check_gdal_version", 1, 2, 2, 1); __PYX_ERR(0, 30, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "check_gdal_version") < 0)) __PYX_ERR(0, 30, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_major = values[0];
    __pyx_v_minor = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("check_gdal_version", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 30, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.check_gdal_version", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_check_gdal_version(__pyx_self, __pyx_v_major, __pyx_v_minor);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_check_gdal_version(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_major, PyObject *__pyx_v_minor) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_t_2;
  int __pyx_t_3;
  int __pyx_t_4;
  __Pyx_RefNannySetupContext("check_gdal_version", 0);

  /* "rasterio/_base.pyx":32
 * def check_gdal_version(major, minor):
 *     """Return True if the major and minor versions match."""
 *     return bool(_gdal.GDALCheckVersion(int(major), int(minor), NULL))             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyNumber_Int(__pyx_v_major); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 32, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 32, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyNumber_Int(__pyx_v_minor); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 32, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 32, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyInt_From_int(GDALCheckVersion(__pyx_t_2, __pyx_t_3, NULL)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 32, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 32, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyBool_FromLong((!(!__pyx_t_4))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 32, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":30
 * 
 * 
 * def check_gdal_version(major, minor):             # <<<<<<<<<<<<<<
 *     """Return True if the major and minor versions match."""
 *     return bool(_gdal.GDALCheckVersion(int(major), int(minor), NULL))
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("rasterio._base.check_gdal_version", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":35
 * 
 * 
 * def gdal_version():             # <<<<<<<<<<<<<<
 *     """Return the version as a major.minor.patchlevel string."""
 *     cdef const char *ver_c = NULL
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_3gdal_version(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8rasterio_5_base_2gdal_version[] = "Return the version as a major.minor.patchlevel string.";
static PyMethodDef __pyx_mdef_8rasterio_5_base_3gdal_version = {"gdal_version", (PyCFunction)__pyx_pw_8rasterio_5_base_3gdal_version, METH_NOARGS, __pyx_doc_8rasterio_5_base_2gdal_version};
static PyObject *__pyx_pw_8rasterio_5_base_3gdal_version(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("gdal_version (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_2gdal_version(__pyx_self);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_2gdal_version(CYTHON_UNUSED PyObject *__pyx_self) {
  char const *__pyx_v_ver_c;
  char const *__pyx_v_ver_b;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("gdal_version", 0);

  /* "rasterio/_base.pyx":37
 * def gdal_version():
 *     """Return the version as a major.minor.patchlevel string."""
 *     cdef const char *ver_c = NULL             # <<<<<<<<<<<<<<
 *     ver_c = _gdal.GDALVersionInfo("RELEASE_NAME")
 *     ver_b = ver_c
 */
  __pyx_v_ver_c = NULL;

  /* "rasterio/_base.pyx":38
 *     """Return the version as a major.minor.patchlevel string."""
 *     cdef const char *ver_c = NULL
 *     ver_c = _gdal.GDALVersionInfo("RELEASE_NAME")             # <<<<<<<<<<<<<<
 *     ver_b = ver_c
 *     return ver_b.decode('utf-8')
 */
  __pyx_v_ver_c = GDALVersionInfo(((char const *)"RELEASE_NAME"));

  /* "rasterio/_base.pyx":39
 *     cdef const char *ver_c = NULL
 *     ver_c = _gdal.GDALVersionInfo("RELEASE_NAME")
 *     ver_b = ver_c             # <<<<<<<<<<<<<<
 *     return ver_b.decode('utf-8')
 * 
 */
  __pyx_v_ver_b = __pyx_v_ver_c;

  /* "rasterio/_base.pyx":40
 *     ver_c = _gdal.GDALVersionInfo("RELEASE_NAME")
 *     ver_b = ver_c
 *     return ver_b.decode('utf-8')             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_decode_c_string(__pyx_v_ver_b, 0, strlen(__pyx_v_ver_b), NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 40, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":35
 * 
 * 
 * def gdal_version():             # <<<<<<<<<<<<<<
 *     """Return the version as a major.minor.patchlevel string."""
 *     cdef const char *ver_c = NULL
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("rasterio._base.gdal_version", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":45
 * cdef class DatasetReader(object):
 * 
 *     def __init__(self, path, options=None):             # <<<<<<<<<<<<<<
 *         self.name = path
 *         self.mode = 'r'
 */

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_path = 0;
  PyObject *__pyx_v_options = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_path,&__pyx_n_s_options,0};
    PyObject* values[2] = {0,0};
    values[1] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_path)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_options);
          if (value) { values[1] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 45, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_path = values[0];
    __pyx_v_options = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 45, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader___init__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), __pyx_v_path, __pyx_v_options);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader___init__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_path, PyObject *__pyx_v_options) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  __Pyx_RefNannySetupContext("__init__", 0);

  /* "rasterio/_base.pyx":46
 * 
 *     def __init__(self, path, options=None):
 *         self.name = path             # <<<<<<<<<<<<<<
 *         self.mode = 'r'
 *         self.options = options or {}
 */
  __Pyx_INCREF(__pyx_v_path);
  __Pyx_GIVEREF(__pyx_v_path);
  __Pyx_GOTREF(__pyx_v_self->name);
  __Pyx_DECREF(__pyx_v_self->name);
  __pyx_v_self->name = __pyx_v_path;

  /* "rasterio/_base.pyx":47
 *     def __init__(self, path, options=None):
 *         self.name = path
 *         self.mode = 'r'             # <<<<<<<<<<<<<<
 *         self.options = options or {}
 *         self._hds = NULL
 */
  __Pyx_INCREF(__pyx_n_s_r);
  __Pyx_GIVEREF(__pyx_n_s_r);
  __Pyx_GOTREF(__pyx_v_self->mode);
  __Pyx_DECREF(__pyx_v_self->mode);
  __pyx_v_self->mode = __pyx_n_s_r;

  /* "rasterio/_base.pyx":48
 *         self.name = path
 *         self.mode = 'r'
 *         self.options = options or {}             # <<<<<<<<<<<<<<
 *         self._hds = NULL
 *         self._count = 0
 */
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_options); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 48, __pyx_L1_error)
  if (!__pyx_t_2) {
  } else {
    __Pyx_INCREF(__pyx_v_options);
    __pyx_t_1 = __pyx_v_options;
    goto __pyx_L3_bool_binop_done;
  }
  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 48, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_t_3);
  __pyx_t_1 = __pyx_t_3;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_L3_bool_binop_done:;
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->options);
  __Pyx_DECREF(__pyx_v_self->options);
  __pyx_v_self->options = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":49
 *         self.mode = 'r'
 *         self.options = options or {}
 *         self._hds = NULL             # <<<<<<<<<<<<<<
 *         self._count = 0
 *         self._closed = True
 */
  __pyx_v_self->_hds = NULL;

  /* "rasterio/_base.pyx":50
 *         self.options = options or {}
 *         self._hds = NULL
 *         self._count = 0             # <<<<<<<<<<<<<<
 *         self._closed = True
 *         self._dtypes = []
 */
  __Pyx_INCREF(__pyx_int_0);
  __Pyx_GIVEREF(__pyx_int_0);
  __Pyx_GOTREF(__pyx_v_self->_count);
  __Pyx_DECREF(__pyx_v_self->_count);
  __pyx_v_self->_count = __pyx_int_0;

  /* "rasterio/_base.pyx":51
 *         self._hds = NULL
 *         self._count = 0
 *         self._closed = True             # <<<<<<<<<<<<<<
 *         self._dtypes = []
 *         self._block_shapes = None
 */
  __Pyx_INCREF(Py_True);
  __Pyx_GIVEREF(Py_True);
  __Pyx_GOTREF(__pyx_v_self->_closed);
  __Pyx_DECREF(__pyx_v_self->_closed);
  __pyx_v_self->_closed = Py_True;

  /* "rasterio/_base.pyx":52
 *         self._count = 0
 *         self._closed = True
 *         self._dtypes = []             # <<<<<<<<<<<<<<
 *         self._block_shapes = None
 *         self._nodatavals = []
 */
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 52, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->_dtypes);
  __Pyx_DECREF(__pyx_v_self->_dtypes);
  __pyx_v_self->_dtypes = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":53
 *         self._closed = True
 *         self._dtypes = []
 *         self._block_shapes = None             # <<<<<<<<<<<<<<
 *         self._nodatavals = []
 *         self._crs = None
 */
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_block_shapes);
  __Pyx_DECREF(__pyx_v_self->_block_shapes);
  __pyx_v_self->_block_shapes = Py_None;

  /* "rasterio/_base.pyx":54
 *         self._dtypes = []
 *         self._block_shapes = None
 *         self._nodatavals = []             # <<<<<<<<<<<<<<
 *         self._crs = None
 *         self._crs_wkt = None
 */
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 54, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->_nodatavals);
  __Pyx_DECREF(__pyx_v_self->_nodatavals);
  __pyx_v_self->_nodatavals = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":55
 *         self._block_shapes = None
 *         self._nodatavals = []
 *         self._crs = None             # <<<<<<<<<<<<<<
 *         self._crs_wkt = None
 *         self._read = False
 */
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_crs);
  __Pyx_DECREF(__pyx_v_self->_crs);
  __pyx_v_self->_crs = Py_None;

  /* "rasterio/_base.pyx":56
 *         self._nodatavals = []
 *         self._crs = None
 *         self._crs_wkt = None             # <<<<<<<<<<<<<<
 *         self._read = False
 * 
 */
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_crs_wkt);
  __Pyx_DECREF(__pyx_v_self->_crs_wkt);
  __pyx_v_self->_crs_wkt = Py_None;

  /* "rasterio/_base.pyx":57
 *         self._crs = None
 *         self._crs_wkt = None
 *         self._read = False             # <<<<<<<<<<<<<<
 * 
 *     def __repr__(self):
 */
  __Pyx_INCREF(Py_False);
  __Pyx_GIVEREF(Py_False);
  __Pyx_GOTREF(__pyx_v_self->_read);
  __Pyx_DECREF(__pyx_v_self->_read);
  __pyx_v_self->_read = Py_False;

  /* "rasterio/_base.pyx":45
 * cdef class DatasetReader(object):
 * 
 *     def __init__(self, path, options=None):             # <<<<<<<<<<<<<<
 *         self.name = path
 *         self.mode = 'r'
 */

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":59
 *         self._read = False
 * 
 *     def __repr__(self):             # <<<<<<<<<<<<<<
 *         return "<%s RasterReader name='%s' mode='%s'>" % (
 *             self.closed and 'closed' or 'open',
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_3__repr__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_3__repr__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_2__repr__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_2__repr__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  __Pyx_RefNannySetupContext("__repr__", 0);

  /* "rasterio/_base.pyx":60
 * 
 *     def __repr__(self):
 *         return "<%s RasterReader name='%s' mode='%s'>" % (             # <<<<<<<<<<<<<<
 *             self.closed and 'closed' or 'open',
 *             self.name,
 */
  __Pyx_XDECREF(__pyx_r);

  /* "rasterio/_base.pyx":61
 *     def __repr__(self):
 *         return "<%s RasterReader name='%s' mode='%s'>" % (
 *             self.closed and 'closed' or 'open',             # <<<<<<<<<<<<<<
 *             self.name,
 *             self.mode)
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_closed); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 61, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 61, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (!__pyx_t_3) {
    goto __pyx_L4_next_or;
  } else {
  }
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_n_s_closed); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 61, __pyx_L1_error)
  if (!__pyx_t_3) {
  } else {
    __Pyx_INCREF(__pyx_n_s_closed);
    __pyx_t_1 = __pyx_n_s_closed;
    goto __pyx_L3_bool_binop_done;
  }
  __pyx_L4_next_or:;
  __Pyx_INCREF(__pyx_n_s_open);
  __pyx_t_1 = __pyx_n_s_open;
  __pyx_L3_bool_binop_done:;

  /* "rasterio/_base.pyx":63
 *             self.closed and 'closed' or 'open',
 *             self.name,
 *             self.mode)             # <<<<<<<<<<<<<<
 * 
 *     def start(self):
 */
  __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 61, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
  __Pyx_INCREF(__pyx_v_self->name);
  __Pyx_GIVEREF(__pyx_v_self->name);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_self->name);
  __Pyx_INCREF(__pyx_v_self->mode);
  __Pyx_GIVEREF(__pyx_v_self->mode);
  PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_self->mode);
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":60
 * 
 *     def __repr__(self):
 *         return "<%s RasterReader name='%s' mode='%s'>" % (             # <<<<<<<<<<<<<<
 *             self.closed and 'closed' or 'open',
 *             self.name,
 */
  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_s_RasterReader_name_s_mode_s, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":59
 *         self._read = False
 * 
 *     def __repr__(self):             # <<<<<<<<<<<<<<
 *         return "<%s RasterReader name='%s' mode='%s'>" % (
 *             self.closed and 'closed' or 'open',
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":65
 *             self.mode)
 * 
 *     def start(self):             # <<<<<<<<<<<<<<
 *         """Start of the dataset reader life cycle."""
 *         path, archive, scheme = parse_path(self.name)
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_5start(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_4start[] = "Start of the dataset reader life cycle.";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_5start(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("start (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_4start(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4start(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_v_path = NULL;
  PyObject *__pyx_v_archive = NULL;
  PyObject *__pyx_v_scheme = NULL;
  PyObject *__pyx_v_name_b = NULL;
  char const *__pyx_v_fname;
  PyObject *__pyx_v_cple = NULL;
  PyObject *__pyx_v_err = NULL;
  void *__pyx_v_drv;
  char const *__pyx_v_drv_name;
  CYTHON_UNUSED PyObject *__pyx_v__ = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *(*__pyx_t_6)(PyObject *);
  char const *__pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *__pyx_t_10 = NULL;
  PyObject *__pyx_t_11 = NULL;
  PyObject *__pyx_t_12 = NULL;
  PyObject *__pyx_t_13 = NULL;
  PyObject *__pyx_t_14 = NULL;
  PyObject *__pyx_t_15 = NULL;
  int __pyx_t_16;
  int __pyx_t_17;
  int __pyx_t_18;
  PyObject *__pyx_t_19 = NULL;
  PyObject *__pyx_t_20 = NULL;
  PyObject *__pyx_t_21 = NULL;
  Py_ssize_t __pyx_t_22;
  __Pyx_RefNannySetupContext("start", 0);

  /* "rasterio/_base.pyx":67
 *     def start(self):
 *         """Start of the dataset reader life cycle."""
 *         path, archive, scheme = parse_path(self.name)             # <<<<<<<<<<<<<<
 *         path = vsi_path(path, archive=archive, scheme=scheme)
 *         name_b = path.encode('utf-8')
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_parse_path); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 67, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (!__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_self->name); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 67, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 67, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL;
    __Pyx_INCREF(__pyx_v_self->name);
    __Pyx_GIVEREF(__pyx_v_self->name);
    PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_self->name);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 67, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 3)) {
      if (size > 3) __Pyx_RaiseTooManyValuesError(3);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 67, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 2); 
    } else {
      __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_4 = PyList_GET_ITEM(sequence, 1); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 2); 
    }
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_3);
    #else
    __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 67, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 67, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 67, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_5 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 67, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_6 = Py_TYPE(__pyx_t_5)->tp_iternext;
    index = 0; __pyx_t_2 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_2)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_2);
    index = 1; __pyx_t_4 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_4)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_4);
    index = 2; __pyx_t_3 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_3)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_3);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_6(__pyx_t_5), 3) < 0) __PYX_ERR(0, 67, __pyx_L1_error)
    __pyx_t_6 = NULL;
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_6 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 67, __pyx_L1_error)
    __pyx_L4_unpacking_done:;
  }
  __pyx_v_path = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_archive = __pyx_t_4;
  __pyx_t_4 = 0;
  __pyx_v_scheme = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":68
 *         """Start of the dataset reader life cycle."""
 *         path, archive, scheme = parse_path(self.name)
 *         path = vsi_path(path, archive=archive, scheme=scheme)             # <<<<<<<<<<<<<<
 *         name_b = path.encode('utf-8')
 *         cdef const char *fname = name_b
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_vsi_path); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_v_path);
  __Pyx_GIVEREF(__pyx_v_path);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_path);
  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_archive, __pyx_v_archive) < 0) __PYX_ERR(0, 68, __pyx_L1_error)
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_scheme, __pyx_v_scheme) < 0) __PYX_ERR(0, 68, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF_SET(__pyx_v_path, __pyx_t_2);
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":69
 *         path, archive, scheme = parse_path(self.name)
 *         path = vsi_path(path, archive=archive, scheme=scheme)
 *         name_b = path.encode('utf-8')             # <<<<<<<<<<<<<<
 *         cdef const char *fname = name_b
 *         try:
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_path, __pyx_n_s_encode); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_name_b = __pyx_t_4;
  __pyx_t_4 = 0;

  /* "rasterio/_base.pyx":70
 *         path = vsi_path(path, archive=archive, scheme=scheme)
 *         name_b = path.encode('utf-8')
 *         cdef const char *fname = name_b             # <<<<<<<<<<<<<<
 *         try:
 *             with CPLErrors() as cple:
 */
  __pyx_t_7 = __Pyx_PyObject_AsString(__pyx_v_name_b); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) __PYX_ERR(0, 70, __pyx_L1_error)
  __pyx_v_fname = __pyx_t_7;

  /* "rasterio/_base.pyx":71
 *         name_b = path.encode('utf-8')
 *         cdef const char *fname = name_b
 *         try:             # <<<<<<<<<<<<<<
 *             with CPLErrors() as cple:
 *                 self._hds = _gdal.GDALOpen(fname, 0)
 */
  {
    __Pyx_PyThreadState_declare
    __Pyx_PyThreadState_assign
    __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10);
    __Pyx_XGOTREF(__pyx_t_8);
    __Pyx_XGOTREF(__pyx_t_9);
    __Pyx_XGOTREF(__pyx_t_10);
    /*try:*/ {

      /* "rasterio/_base.pyx":72
 *         cdef const char *fname = name_b
 *         try:
 *             with CPLErrors() as cple:             # <<<<<<<<<<<<<<
 *                 self._hds = _gdal.GDALOpen(fname, 0)
 *                 cple.check()
 */
      /*with:*/ {
        __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_CPLErrors); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 72, __pyx_L5_error)
        __Pyx_GOTREF(__pyx_t_2);
        __pyx_t_3 = NULL;
        if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
          __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
          if (likely(__pyx_t_3)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
            __Pyx_INCREF(__pyx_t_3);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_2, function);
          }
        }
        if (__pyx_t_3) {
          __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 72, __pyx_L5_error)
          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        } else {
          __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 72, __pyx_L5_error)
        }
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __pyx_t_11 = __Pyx_PyObject_LookupSpecial(__pyx_t_4, __pyx_n_s_exit); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 72, __pyx_L5_error)
        __Pyx_GOTREF(__pyx_t_11);
        __pyx_t_3 = __Pyx_PyObject_LookupSpecial(__pyx_t_4, __pyx_n_s_enter); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 72, __pyx_L13_error)
        __Pyx_GOTREF(__pyx_t_3);
        __pyx_t_1 = NULL;
        if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
          __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3);
          if (likely(__pyx_t_1)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
            __Pyx_INCREF(__pyx_t_1);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_3, function);
          }
        }
        if (__pyx_t_1) {
          __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 72, __pyx_L13_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        } else {
          __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 72, __pyx_L13_error)
        }
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        __pyx_t_3 = __pyx_t_2;
        __pyx_t_2 = 0;
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        /*try:*/ {
          {
            __Pyx_PyThreadState_declare
            __Pyx_PyThreadState_assign
            __Pyx_ExceptionSave(&__pyx_t_12, &__pyx_t_13, &__pyx_t_14);
            __Pyx_XGOTREF(__pyx_t_12);
            __Pyx_XGOTREF(__pyx_t_13);
            __Pyx_XGOTREF(__pyx_t_14);
            /*try:*/ {
              __pyx_v_cple = __pyx_t_3;
              __pyx_t_3 = 0;

              /* "rasterio/_base.pyx":73
 *         try:
 *             with CPLErrors() as cple:
 *                 self._hds = _gdal.GDALOpen(fname, 0)             # <<<<<<<<<<<<<<
 *                 cple.check()
 *         except CPLE_OpenFailed as err:
 */
              __pyx_v_self->_hds = GDALOpen(__pyx_v_fname, 0);

              /* "rasterio/_base.pyx":74
 *             with CPLErrors() as cple:
 *                 self._hds = _gdal.GDALOpen(fname, 0)
 *                 cple.check()             # <<<<<<<<<<<<<<
 *         except CPLE_OpenFailed as err:
 *             raise RasterioIOError(err.errmsg)
 */
              __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_cple, __pyx_n_s_check); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 74, __pyx_L19_error)
              __Pyx_GOTREF(__pyx_t_4);
              __pyx_t_2 = NULL;
              if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_4))) {
                __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
                if (likely(__pyx_t_2)) {
                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
                  __Pyx_INCREF(__pyx_t_2);
                  __Pyx_INCREF(function);
                  __Pyx_DECREF_SET(__pyx_t_4, function);
                }
              }
              if (__pyx_t_2) {
                __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 74, __pyx_L19_error)
                __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
              } else {
                __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 74, __pyx_L19_error)
              }
              __Pyx_GOTREF(__pyx_t_3);
              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

              /* "rasterio/_base.pyx":72
 *         cdef const char *fname = name_b
 *         try:
 *             with CPLErrors() as cple:             # <<<<<<<<<<<<<<
 *                 self._hds = _gdal.GDALOpen(fname, 0)
 *                 cple.check()
 */
            }
            __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
            __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
            __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
            goto __pyx_L26_try_end;
            __pyx_L19_error:;
            __Pyx_PyThreadState_assign
            __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
            __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
            __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
            __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
            __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
            /*except:*/ {
              __Pyx_AddTraceback("rasterio._base.DatasetReader.start", __pyx_clineno, __pyx_lineno, __pyx_filename);
              if (__Pyx_GetException(&__pyx_t_3, &__pyx_t_4, &__pyx_t_2) < 0) __PYX_ERR(0, 72, __pyx_L21_except_error)
              __Pyx_GOTREF(__pyx_t_3);
              __Pyx_GOTREF(__pyx_t_4);
              __Pyx_GOTREF(__pyx_t_2);
              __pyx_t_1 = PyTuple_Pack(3, __pyx_t_3, __pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L21_except_error)
              __Pyx_GOTREF(__pyx_t_1);
              __pyx_t_15 = __Pyx_PyObject_Call(__pyx_t_11, __pyx_t_1, NULL);
              __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
              if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 72, __pyx_L21_except_error)
              __Pyx_GOTREF(__pyx_t_15);
              __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_15);
              __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
              if (__pyx_t_16 < 0) __PYX_ERR(0, 72, __pyx_L21_except_error)
              __pyx_t_17 = ((!(__pyx_t_16 != 0)) != 0);
              if (__pyx_t_17) {
                __Pyx_GIVEREF(__pyx_t_3);
                __Pyx_GIVEREF(__pyx_t_4);
                __Pyx_XGIVEREF(__pyx_t_2);
                __Pyx_ErrRestoreWithState(__pyx_t_3, __pyx_t_4, __pyx_t_2);
                __pyx_t_3 = 0; __pyx_t_4 = 0; __pyx_t_2 = 0; 
                __PYX_ERR(0, 72, __pyx_L21_except_error)
              }
              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
              goto __pyx_L20_exception_handled;
            }
            __pyx_L21_except_error:;
            __Pyx_PyThreadState_assign
            __Pyx_XGIVEREF(__pyx_t_12);
            __Pyx_XGIVEREF(__pyx_t_13);
            __Pyx_XGIVEREF(__pyx_t_14);
            __Pyx_ExceptionReset(__pyx_t_12, __pyx_t_13, __pyx_t_14);
            goto __pyx_L5_error;
            __pyx_L20_exception_handled:;
            __Pyx_PyThreadState_assign
            __Pyx_XGIVEREF(__pyx_t_12);
            __Pyx_XGIVEREF(__pyx_t_13);
            __Pyx_XGIVEREF(__pyx_t_14);
            __Pyx_ExceptionReset(__pyx_t_12, __pyx_t_13, __pyx_t_14);
            __pyx_L26_try_end:;
          }
        }
        /*finally:*/ {
          /*normal exit:*/{
            if (__pyx_t_11) {
              __pyx_t_14 = __Pyx_PyObject_Call(__pyx_t_11, __pyx_tuple__2, NULL);
              __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
              if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 72, __pyx_L5_error)
              __Pyx_GOTREF(__pyx_t_14);
              __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
            }
            goto __pyx_L18;
          }
          __pyx_L18:;
        }
        goto __pyx_L30;
        __pyx_L13_error:;
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        goto __pyx_L5_error;
        __pyx_L30:;
      }

      /* "rasterio/_base.pyx":71
 *         name_b = path.encode('utf-8')
 *         cdef const char *fname = name_b
 *         try:             # <<<<<<<<<<<<<<
 *             with CPLErrors() as cple:
 *                 self._hds = _gdal.GDALOpen(fname, 0)
 */
    }
    __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
    goto __pyx_L12_try_end;
    __pyx_L5_error:;
    __Pyx_PyThreadState_assign
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":75
 *                 self._hds = _gdal.GDALOpen(fname, 0)
 *                 cple.check()
 *         except CPLE_OpenFailed as err:             # <<<<<<<<<<<<<<
 *             raise RasterioIOError(err.errmsg)
 * 
 */
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_CPLE_OpenFailed); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 75, __pyx_L7_except_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_18 = __Pyx_PyErr_ExceptionMatches(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (__pyx_t_18) {
      __Pyx_AddTraceback("rasterio._base.DatasetReader.start", __pyx_clineno, __pyx_lineno, __pyx_filename);
      if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_4, &__pyx_t_3) < 0) __PYX_ERR(0, 75, __pyx_L7_except_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __pyx_v_err = __pyx_t_4;

      /* "rasterio/_base.pyx":76
 *                 cple.check()
 *         except CPLE_OpenFailed as err:
 *             raise RasterioIOError(err.errmsg)             # <<<<<<<<<<<<<<
 * 
 *         cdef void *drv
 */
      __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_RasterioIOError); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 76, __pyx_L7_except_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_19 = __Pyx_PyObject_GetAttrStr(__pyx_v_err, __pyx_n_s_errmsg); if (unlikely(!__pyx_t_19)) __PYX_ERR(0, 76, __pyx_L7_except_error)
      __Pyx_GOTREF(__pyx_t_19);
      __pyx_t_20 = NULL;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
        __pyx_t_20 = PyMethod_GET_SELF(__pyx_t_5);
        if (likely(__pyx_t_20)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
          __Pyx_INCREF(__pyx_t_20);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_5, function);
        }
      }
      if (!__pyx_t_20) {
        __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_19); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L7_except_error)
        __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
        __Pyx_GOTREF(__pyx_t_1);
      } else {
        __pyx_t_21 = PyTuple_New(1+1); if (unlikely(!__pyx_t_21)) __PYX_ERR(0, 76, __pyx_L7_except_error)
        __Pyx_GOTREF(__pyx_t_21);
        __Pyx_GIVEREF(__pyx_t_20); PyTuple_SET_ITEM(__pyx_t_21, 0, __pyx_t_20); __pyx_t_20 = NULL;
        __Pyx_GIVEREF(__pyx_t_19);
        PyTuple_SET_ITEM(__pyx_t_21, 0+1, __pyx_t_19);
        __pyx_t_19 = 0;
        __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_21, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L7_except_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_DECREF(__pyx_t_21); __pyx_t_21 = 0;
      }
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_Raise(__pyx_t_1, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __PYX_ERR(0, 76, __pyx_L7_except_error)
    }
    goto __pyx_L7_except_error;
    __pyx_L7_except_error:;

    /* "rasterio/_base.pyx":71
 *         name_b = path.encode('utf-8')
 *         cdef const char *fname = name_b
 *         try:             # <<<<<<<<<<<<<<
 *             with CPLErrors() as cple:
 *                 self._hds = _gdal.GDALOpen(fname, 0)
 */
    __Pyx_PyThreadState_assign
    __Pyx_XGIVEREF(__pyx_t_8);
    __Pyx_XGIVEREF(__pyx_t_9);
    __Pyx_XGIVEREF(__pyx_t_10);
    __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10);
    goto __pyx_L1_error;
    __pyx_L12_try_end:;
  }

  /* "rasterio/_base.pyx":80
 *         cdef void *drv
 *         cdef const char *drv_name
 *         drv = _gdal.GDALGetDatasetDriver(self._hds)             # <<<<<<<<<<<<<<
 *         drv_name = _gdal.GDALGetDriverShortName(drv)
 *         self.driver = drv_name.decode('utf-8')
 */
  __pyx_v_drv = GDALGetDatasetDriver(__pyx_v_self->_hds);

  /* "rasterio/_base.pyx":81
 *         cdef const char *drv_name
 *         drv = _gdal.GDALGetDatasetDriver(self._hds)
 *         drv_name = _gdal.GDALGetDriverShortName(drv)             # <<<<<<<<<<<<<<
 *         self.driver = drv_name.decode('utf-8')
 * 
 */
  __pyx_v_drv_name = GDALGetDriverShortName(__pyx_v_drv);

  /* "rasterio/_base.pyx":82
 *         drv = _gdal.GDALGetDatasetDriver(self._hds)
 *         drv_name = _gdal.GDALGetDriverShortName(drv)
 *         self.driver = drv_name.decode('utf-8')             # <<<<<<<<<<<<<<
 * 
 *         self._count = _gdal.GDALGetRasterCount(self._hds)
 */
  __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_drv_name, 0, strlen(__pyx_v_drv_name), NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 82, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_3);
  __Pyx_GOTREF(__pyx_v_self->driver);
  __Pyx_DECREF(__pyx_v_self->driver);
  __pyx_v_self->driver = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":84
 *         self.driver = drv_name.decode('utf-8')
 * 
 *         self._count = _gdal.GDALGetRasterCount(self._hds)             # <<<<<<<<<<<<<<
 *         self.width = _gdal.GDALGetRasterXSize(self._hds)
 *         self.height = _gdal.GDALGetRasterYSize(self._hds)
 */
  __pyx_t_3 = __Pyx_PyInt_From_int(GDALGetRasterCount(__pyx_v_self->_hds)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 84, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_3);
  __Pyx_GOTREF(__pyx_v_self->_count);
  __Pyx_DECREF(__pyx_v_self->_count);
  __pyx_v_self->_count = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":85
 * 
 *         self._count = _gdal.GDALGetRasterCount(self._hds)
 *         self.width = _gdal.GDALGetRasterXSize(self._hds)             # <<<<<<<<<<<<<<
 *         self.height = _gdal.GDALGetRasterYSize(self._hds)
 *         self.shape = (self.height, self.width)
 */
  __pyx_t_3 = __Pyx_PyInt_From_int(GDALGetRasterXSize(__pyx_v_self->_hds)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 85, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_3);
  __Pyx_GOTREF(__pyx_v_self->width);
  __Pyx_DECREF(__pyx_v_self->width);
  __pyx_v_self->width = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":86
 *         self._count = _gdal.GDALGetRasterCount(self._hds)
 *         self.width = _gdal.GDALGetRasterXSize(self._hds)
 *         self.height = _gdal.GDALGetRasterYSize(self._hds)             # <<<<<<<<<<<<<<
 *         self.shape = (self.height, self.width)
 * 
 */
  __pyx_t_3 = __Pyx_PyInt_From_int(GDALGetRasterYSize(__pyx_v_self->_hds)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 86, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_3);
  __Pyx_GOTREF(__pyx_v_self->height);
  __Pyx_DECREF(__pyx_v_self->height);
  __pyx_v_self->height = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":87
 *         self.width = _gdal.GDALGetRasterXSize(self._hds)
 *         self.height = _gdal.GDALGetRasterYSize(self._hds)
 *         self.shape = (self.height, self.width)             # <<<<<<<<<<<<<<
 * 
 *         self._transform = self.read_transform()
 */
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 87, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_v_self->height);
  __Pyx_GIVEREF(__pyx_v_self->height);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_self->height);
  __Pyx_INCREF(__pyx_v_self->width);
  __Pyx_GIVEREF(__pyx_v_self->width);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->width);
  __Pyx_GIVEREF(__pyx_t_3);
  __Pyx_GOTREF(__pyx_v_self->shape);
  __Pyx_DECREF(__pyx_v_self->shape);
  __pyx_v_self->shape = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":89
 *         self.shape = (self.height, self.width)
 * 
 *         self._transform = self.read_transform()             # <<<<<<<<<<<<<<
 *         self._crs = self.read_crs()
 *         self._crs_wkt = self.read_crs_wkt()
 */
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_read_transform); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 89, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
    }
  }
  if (__pyx_t_2) {
    __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 89, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  } else {
    __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 89, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_GIVEREF(__pyx_t_3);
  __Pyx_GOTREF(__pyx_v_self->_transform);
  __Pyx_DECREF(__pyx_v_self->_transform);
  __pyx_v_self->_transform = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":90
 * 
 *         self._transform = self.read_transform()
 *         self._crs = self.read_crs()             # <<<<<<<<<<<<<<
 *         self._crs_wkt = self.read_crs_wkt()
 * 
 */
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_read_crs); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 90, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
    }
  }
  if (__pyx_t_2) {
    __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 90, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  } else {
    __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 90, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_GIVEREF(__pyx_t_3);
  __Pyx_GOTREF(__pyx_v_self->_crs);
  __Pyx_DECREF(__pyx_v_self->_crs);
  __pyx_v_self->_crs = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":91
 *         self._transform = self.read_transform()
 *         self._crs = self.read_crs()
 *         self._crs_wkt = self.read_crs_wkt()             # <<<<<<<<<<<<<<
 * 
 *         # touch self.meta
 */
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_read_crs_wkt); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 91, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
    }
  }
  if (__pyx_t_2) {
    __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 91, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  } else {
    __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 91, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_GIVEREF(__pyx_t_3);
  __Pyx_GOTREF(__pyx_v_self->_crs_wkt);
  __Pyx_DECREF(__pyx_v_self->_crs_wkt);
  __pyx_v_self->_crs_wkt = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":94
 * 
 *         # touch self.meta
 *         _ = self.meta             # <<<<<<<<<<<<<<
 * 
 *         self._closed = False
 */
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_meta); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 94, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_v__ = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":96
 *         _ = self.meta
 * 
 *         self._closed = False             # <<<<<<<<<<<<<<
 *         log.debug("Dataset %r is started.", self)
 * 
 */
  __Pyx_INCREF(Py_False);
  __Pyx_GIVEREF(Py_False);
  __Pyx_GOTREF(__pyx_v_self->_closed);
  __Pyx_DECREF(__pyx_v_self->_closed);
  __pyx_v_self->_closed = Py_False;

  /* "rasterio/_base.pyx":97
 * 
 *         self._closed = False
 *         log.debug("Dataset %r is started.", self)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 97, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_debug); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 97, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = NULL;
  __pyx_t_22 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_22 = 1;
    }
  }
  __pyx_t_1 = PyTuple_New(2+__pyx_t_22); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 97, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (__pyx_t_4) {
    __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4); __pyx_t_4 = NULL;
  }
  __Pyx_INCREF(__pyx_kp_s_Dataset_r_is_started);
  __Pyx_GIVEREF(__pyx_kp_s_Dataset_r_is_started);
  PyTuple_SET_ITEM(__pyx_t_1, 0+__pyx_t_22, __pyx_kp_s_Dataset_r_is_started);
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
  PyTuple_SET_ITEM(__pyx_t_1, 1+__pyx_t_22, ((PyObject *)__pyx_v_self));
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 97, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":65
 *             self.mode)
 * 
 *     def start(self):             # <<<<<<<<<<<<<<
 *         """Start of the dataset reader life cycle."""
 *         path, archive, scheme = parse_path(self.name)
 */

  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_19);
  __Pyx_XDECREF(__pyx_t_20);
  __Pyx_XDECREF(__pyx_t_21);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.start", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_path);
  __Pyx_XDECREF(__pyx_v_archive);
  __Pyx_XDECREF(__pyx_v_scheme);
  __Pyx_XDECREF(__pyx_v_name_b);
  __Pyx_XDECREF(__pyx_v_cple);
  __Pyx_XDECREF(__pyx_v_err);
  __Pyx_XDECREF(__pyx_v__);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":100
 * 
 * 
 *     cdef void *band(self, int bidx) except NULL:             # <<<<<<<<<<<<<<
 *         cdef void *hband = NULL
 *         try:
 */

static void *__pyx_f_8rasterio_5_base_13DatasetReader_band(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, int __pyx_v_bidx) {
  void *__pyx_v_hband;
  PyObject *__pyx_v_cple = NULL;
  PyObject *__pyx_v_exc = NULL;
  void *__pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *__pyx_t_10 = NULL;
  PyObject *__pyx_t_11 = NULL;
  PyObject *__pyx_t_12 = NULL;
  int __pyx_t_13;
  int __pyx_t_14;
  int __pyx_t_15;
  PyObject *__pyx_t_16 = NULL;
  __Pyx_RefNannySetupContext("band", 0);

  /* "rasterio/_base.pyx":101
 * 
 *     cdef void *band(self, int bidx) except NULL:
 *         cdef void *hband = NULL             # <<<<<<<<<<<<<<
 *         try:
 *             with CPLErrors() as cple:
 */
  __pyx_v_hband = NULL;

  /* "rasterio/_base.pyx":102
 *     cdef void *band(self, int bidx) except NULL:
 *         cdef void *hband = NULL
 *         try:             # <<<<<<<<<<<<<<
 *             with CPLErrors() as cple:
 *                 hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
  {
    __Pyx_PyThreadState_declare
    __Pyx_PyThreadState_assign
    __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3);
    __Pyx_XGOTREF(__pyx_t_1);
    __Pyx_XGOTREF(__pyx_t_2);
    __Pyx_XGOTREF(__pyx_t_3);
    /*try:*/ {

      /* "rasterio/_base.pyx":103
 *         cdef void *hband = NULL
 *         try:
 *             with CPLErrors() as cple:             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *                 cple.check()
 */
      /*with:*/ {
        __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_CPLErrors); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 103, __pyx_L3_error)
        __Pyx_GOTREF(__pyx_t_5);
        __pyx_t_6 = NULL;
        if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
          __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
          if (likely(__pyx_t_6)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
            __Pyx_INCREF(__pyx_t_6);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_5, function);
          }
        }
        if (__pyx_t_6) {
          __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 103, __pyx_L3_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        } else {
          __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 103, __pyx_L3_error)
        }
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        __pyx_t_7 = __Pyx_PyObject_LookupSpecial(__pyx_t_4, __pyx_n_s_exit); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 103, __pyx_L3_error)
        __Pyx_GOTREF(__pyx_t_7);
        __pyx_t_6 = __Pyx_PyObject_LookupSpecial(__pyx_t_4, __pyx_n_s_enter); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 103, __pyx_L11_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_8 = NULL;
        if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_6))) {
          __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_6);
          if (likely(__pyx_t_8)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
            __Pyx_INCREF(__pyx_t_8);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_6, function);
          }
        }
        if (__pyx_t_8) {
          __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_8); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 103, __pyx_L11_error)
          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        } else {
          __pyx_t_5 = __Pyx_PyObject_CallNoArg(__pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 103, __pyx_L11_error)
        }
        __Pyx_GOTREF(__pyx_t_5);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_6 = __pyx_t_5;
        __pyx_t_5 = 0;
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        /*try:*/ {
          {
            __Pyx_PyThreadState_declare
            __Pyx_PyThreadState_assign
            __Pyx_ExceptionSave(&__pyx_t_9, &__pyx_t_10, &__pyx_t_11);
            __Pyx_XGOTREF(__pyx_t_9);
            __Pyx_XGOTREF(__pyx_t_10);
            __Pyx_XGOTREF(__pyx_t_11);
            /*try:*/ {
              __pyx_v_cple = __pyx_t_6;
              __pyx_t_6 = 0;

              /* "rasterio/_base.pyx":104
 *         try:
 *             with CPLErrors() as cple:
 *                 hband = _gdal.GDALGetRasterBand(self._hds, bidx)             # <<<<<<<<<<<<<<
 *                 cple.check()
 *         except CPLE_IllegalArg as exc:
 */
              __pyx_v_hband = GDALGetRasterBand(__pyx_v_self->_hds, __pyx_v_bidx);

              /* "rasterio/_base.pyx":105
 *             with CPLErrors() as cple:
 *                 hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *                 cple.check()             # <<<<<<<<<<<<<<
 *         except CPLE_IllegalArg as exc:
 *             raise IndexError(str(exc))
 */
              __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_cple, __pyx_n_s_check); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 105, __pyx_L17_error)
              __Pyx_GOTREF(__pyx_t_4);
              __pyx_t_5 = NULL;
              if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_4))) {
                __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);
                if (likely(__pyx_t_5)) {
                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
                  __Pyx_INCREF(__pyx_t_5);
                  __Pyx_INCREF(function);
                  __Pyx_DECREF_SET(__pyx_t_4, function);
                }
              }
              if (__pyx_t_5) {
                __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 105, __pyx_L17_error)
                __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
              } else {
                __pyx_t_6 = __Pyx_PyObject_CallNoArg(__pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 105, __pyx_L17_error)
              }
              __Pyx_GOTREF(__pyx_t_6);
              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
              __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;

              /* "rasterio/_base.pyx":103
 *         cdef void *hband = NULL
 *         try:
 *             with CPLErrors() as cple:             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *                 cple.check()
 */
            }
            __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
            __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
            __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
            goto __pyx_L24_try_end;
            __pyx_L17_error:;
            __Pyx_PyThreadState_assign
            __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
            __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
            __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
            __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
            /*except:*/ {
              __Pyx_AddTraceback("rasterio._base.DatasetReader.band", __pyx_clineno, __pyx_lineno, __pyx_filename);
              if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_4, &__pyx_t_5) < 0) __PYX_ERR(0, 103, __pyx_L19_except_error)
              __Pyx_GOTREF(__pyx_t_6);
              __Pyx_GOTREF(__pyx_t_4);
              __Pyx_GOTREF(__pyx_t_5);
              __pyx_t_8 = PyTuple_Pack(3, __pyx_t_6, __pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 103, __pyx_L19_except_error)
              __Pyx_GOTREF(__pyx_t_8);
              __pyx_t_12 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_8, NULL);
              __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
              __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
              if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 103, __pyx_L19_except_error)
              __Pyx_GOTREF(__pyx_t_12);
              __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_12);
              __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
              if (__pyx_t_13 < 0) __PYX_ERR(0, 103, __pyx_L19_except_error)
              __pyx_t_14 = ((!(__pyx_t_13 != 0)) != 0);
              if (__pyx_t_14) {
                __Pyx_GIVEREF(__pyx_t_6);
                __Pyx_GIVEREF(__pyx_t_4);
                __Pyx_XGIVEREF(__pyx_t_5);
                __Pyx_ErrRestoreWithState(__pyx_t_6, __pyx_t_4, __pyx_t_5);
                __pyx_t_6 = 0; __pyx_t_4 = 0; __pyx_t_5 = 0; 
                __PYX_ERR(0, 103, __pyx_L19_except_error)
              }
              __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
              __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
              goto __pyx_L18_exception_handled;
            }
            __pyx_L19_except_error:;
            __Pyx_PyThreadState_assign
            __Pyx_XGIVEREF(__pyx_t_9);
            __Pyx_XGIVEREF(__pyx_t_10);
            __Pyx_XGIVEREF(__pyx_t_11);
            __Pyx_ExceptionReset(__pyx_t_9, __pyx_t_10, __pyx_t_11);
            goto __pyx_L3_error;
            __pyx_L18_exception_handled:;
            __Pyx_PyThreadState_assign
            __Pyx_XGIVEREF(__pyx_t_9);
            __Pyx_XGIVEREF(__pyx_t_10);
            __Pyx_XGIVEREF(__pyx_t_11);
            __Pyx_ExceptionReset(__pyx_t_9, __pyx_t_10, __pyx_t_11);
            __pyx_L24_try_end:;
          }
        }
        /*finally:*/ {
          /*normal exit:*/{
            if (__pyx_t_7) {
              __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_tuple__3, NULL);
              __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
              if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 103, __pyx_L3_error)
              __Pyx_GOTREF(__pyx_t_11);
              __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
            }
            goto __pyx_L16;
          }
          __pyx_L16:;
        }
        goto __pyx_L28;
        __pyx_L11_error:;
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        goto __pyx_L3_error;
        __pyx_L28:;
      }

      /* "rasterio/_base.pyx":102
 *     cdef void *band(self, int bidx) except NULL:
 *         cdef void *hband = NULL
 *         try:             # <<<<<<<<<<<<<<
 *             with CPLErrors() as cple:
 *                 hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
    }
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    goto __pyx_L10_try_end;
    __pyx_L3_error:;
    __Pyx_PyThreadState_assign
    __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;

    /* "rasterio/_base.pyx":106
 *                 hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *                 cple.check()
 *         except CPLE_IllegalArg as exc:             # <<<<<<<<<<<<<<
 *             raise IndexError(str(exc))
 *         return hband
 */
    __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_CPLE_IllegalArg); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 106, __pyx_L5_except_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_15 = __Pyx_PyErr_ExceptionMatches(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    if (__pyx_t_15) {
      __Pyx_AddTraceback("rasterio._base.DatasetReader.band", __pyx_clineno, __pyx_lineno, __pyx_filename);
      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_4, &__pyx_t_6) < 0) __PYX_ERR(0, 106, __pyx_L5_except_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_INCREF(__pyx_t_4);
      __pyx_v_exc = __pyx_t_4;

      /* "rasterio/_base.pyx":107
 *                 cple.check()
 *         except CPLE_IllegalArg as exc:
 *             raise IndexError(str(exc))             # <<<<<<<<<<<<<<
 *         return hband
 * 
 */
      __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 107, __pyx_L5_except_error)
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_INCREF(__pyx_v_exc);
      __Pyx_GIVEREF(__pyx_v_exc);
      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_exc);
      __pyx_t_16 = __Pyx_PyObject_Call(((PyObject *)(&PyString_Type)), __pyx_t_8, NULL); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 107, __pyx_L5_except_error)
      __Pyx_GOTREF(__pyx_t_16);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 107, __pyx_L5_except_error)
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_GIVEREF(__pyx_t_16);
      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_16);
      __pyx_t_16 = 0;
      __pyx_t_16 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_t_8, NULL); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 107, __pyx_L5_except_error)
      __Pyx_GOTREF(__pyx_t_16);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_Raise(__pyx_t_16, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
      __PYX_ERR(0, 107, __pyx_L5_except_error)
    }
    goto __pyx_L5_except_error;
    __pyx_L5_except_error:;

    /* "rasterio/_base.pyx":102
 *     cdef void *band(self, int bidx) except NULL:
 *         cdef void *hband = NULL
 *         try:             # <<<<<<<<<<<<<<
 *             with CPLErrors() as cple:
 *                 hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
    __Pyx_PyThreadState_assign
    __Pyx_XGIVEREF(__pyx_t_1);
    __Pyx_XGIVEREF(__pyx_t_2);
    __Pyx_XGIVEREF(__pyx_t_3);
    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
    goto __pyx_L1_error;
    __pyx_L10_try_end:;
  }

  /* "rasterio/_base.pyx":108
 *         except CPLE_IllegalArg as exc:
 *             raise IndexError(str(exc))
 *         return hband             # <<<<<<<<<<<<<<
 * 
 *     def _has_band(self, bidx):
 */
  __pyx_r = __pyx_v_hband;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":100
 * 
 * 
 *     cdef void *band(self, int bidx) except NULL:             # <<<<<<<<<<<<<<
 *         cdef void *hband = NULL
 *         try:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_16);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.band", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_cple);
  __Pyx_XDECREF(__pyx_v_exc);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":110
 *         return hband
 * 
 *     def _has_band(self, bidx):             # <<<<<<<<<<<<<<
 *         cdef void *hband = NULL
 *         try:
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7_has_band(PyObject *__pyx_v_self, PyObject *__pyx_v_bidx); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7_has_band(PyObject *__pyx_v_self, PyObject *__pyx_v_bidx) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_has_band (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6_has_band(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_bidx));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6_has_band(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx) {
  CYTHON_UNUSED void *__pyx_v_hband;
  PyObject *__pyx_v_cple = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *__pyx_t_10 = NULL;
  PyObject *__pyx_t_11 = NULL;
  int __pyx_t_12;
  PyObject *__pyx_t_13 = NULL;
  int __pyx_t_14;
  int __pyx_t_15;
  __Pyx_RefNannySetupContext("_has_band", 0);

  /* "rasterio/_base.pyx":111
 * 
 *     def _has_band(self, bidx):
 *         cdef void *hband = NULL             # <<<<<<<<<<<<<<
 *         try:
 *             with CPLErrors() as cple:
 */
  __pyx_v_hband = NULL;

  /* "rasterio/_base.pyx":112
 *     def _has_band(self, bidx):
 *         cdef void *hband = NULL
 *         try:             # <<<<<<<<<<<<<<
 *             with CPLErrors() as cple:
 *                 hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
  {
    __Pyx_PyThreadState_declare
    __Pyx_PyThreadState_assign
    __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3);
    __Pyx_XGOTREF(__pyx_t_1);
    __Pyx_XGOTREF(__pyx_t_2);
    __Pyx_XGOTREF(__pyx_t_3);
    /*try:*/ {

      /* "rasterio/_base.pyx":113
 *         cdef void *hband = NULL
 *         try:
 *             with CPLErrors() as cple:             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *                 cple.check()
 */
      /*with:*/ {
        __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_CPLErrors); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 113, __pyx_L3_error)
        __Pyx_GOTREF(__pyx_t_5);
        __pyx_t_6 = NULL;
        if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
          __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
          if (likely(__pyx_t_6)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
            __Pyx_INCREF(__pyx_t_6);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_5, function);
          }
        }
        if (__pyx_t_6) {
          __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 113, __pyx_L3_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        } else {
          __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 113, __pyx_L3_error)
        }
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        __pyx_t_7 = __Pyx_PyObject_LookupSpecial(__pyx_t_4, __pyx_n_s_exit); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 113, __pyx_L3_error)
        __Pyx_GOTREF(__pyx_t_7);
        __pyx_t_6 = __Pyx_PyObject_LookupSpecial(__pyx_t_4, __pyx_n_s_enter); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 113, __pyx_L11_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_8 = NULL;
        if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_6))) {
          __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_6);
          if (likely(__pyx_t_8)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
            __Pyx_INCREF(__pyx_t_8);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_6, function);
          }
        }
        if (__pyx_t_8) {
          __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_8); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 113, __pyx_L11_error)
          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        } else {
          __pyx_t_5 = __Pyx_PyObject_CallNoArg(__pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 113, __pyx_L11_error)
        }
        __Pyx_GOTREF(__pyx_t_5);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_6 = __pyx_t_5;
        __pyx_t_5 = 0;
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        /*try:*/ {
          {
            __Pyx_PyThreadState_declare
            __Pyx_PyThreadState_assign
            __Pyx_ExceptionSave(&__pyx_t_9, &__pyx_t_10, &__pyx_t_11);
            __Pyx_XGOTREF(__pyx_t_9);
            __Pyx_XGOTREF(__pyx_t_10);
            __Pyx_XGOTREF(__pyx_t_11);
            /*try:*/ {
              __pyx_v_cple = __pyx_t_6;
              __pyx_t_6 = 0;

              /* "rasterio/_base.pyx":114
 *         try:
 *             with CPLErrors() as cple:
 *                 hband = _gdal.GDALGetRasterBand(self._hds, bidx)             # <<<<<<<<<<<<<<
 *                 cple.check()
 *         except CPLE_IllegalArg:
 */
              __pyx_t_12 = __Pyx_PyInt_As_int(__pyx_v_bidx); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 114, __pyx_L17_error)
              __pyx_v_hband = GDALGetRasterBand(__pyx_v_self->_hds, __pyx_t_12);

              /* "rasterio/_base.pyx":115
 *             with CPLErrors() as cple:
 *                 hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *                 cple.check()             # <<<<<<<<<<<<<<
 *         except CPLE_IllegalArg:
 *             return False
 */
              __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_cple, __pyx_n_s_check); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 115, __pyx_L17_error)
              __Pyx_GOTREF(__pyx_t_4);
              __pyx_t_5 = NULL;
              if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_4))) {
                __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);
                if (likely(__pyx_t_5)) {
                  PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
                  __Pyx_INCREF(__pyx_t_5);
                  __Pyx_INCREF(function);
                  __Pyx_DECREF_SET(__pyx_t_4, function);
                }
              }
              if (__pyx_t_5) {
                __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 115, __pyx_L17_error)
                __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
              } else {
                __pyx_t_6 = __Pyx_PyObject_CallNoArg(__pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 115, __pyx_L17_error)
              }
              __Pyx_GOTREF(__pyx_t_6);
              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
              __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;

              /* "rasterio/_base.pyx":113
 *         cdef void *hband = NULL
 *         try:
 *             with CPLErrors() as cple:             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *                 cple.check()
 */
            }
            __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
            __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
            __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
            goto __pyx_L24_try_end;
            __pyx_L17_error:;
            __Pyx_PyThreadState_assign
            __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
            __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
            __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
            __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
            /*except:*/ {
              __Pyx_AddTraceback("rasterio._base.DatasetReader._has_band", __pyx_clineno, __pyx_lineno, __pyx_filename);
              if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_4, &__pyx_t_5) < 0) __PYX_ERR(0, 113, __pyx_L19_except_error)
              __Pyx_GOTREF(__pyx_t_6);
              __Pyx_GOTREF(__pyx_t_4);
              __Pyx_GOTREF(__pyx_t_5);
              __pyx_t_8 = PyTuple_Pack(3, __pyx_t_6, __pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 113, __pyx_L19_except_error)
              __Pyx_GOTREF(__pyx_t_8);
              __pyx_t_13 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_8, NULL);
              __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
              __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
              if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 113, __pyx_L19_except_error)
              __Pyx_GOTREF(__pyx_t_13);
              __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_13);
              __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
              if (__pyx_t_14 < 0) __PYX_ERR(0, 113, __pyx_L19_except_error)
              __pyx_t_15 = ((!(__pyx_t_14 != 0)) != 0);
              if (__pyx_t_15) {
                __Pyx_GIVEREF(__pyx_t_6);
                __Pyx_GIVEREF(__pyx_t_4);
                __Pyx_XGIVEREF(__pyx_t_5);
                __Pyx_ErrRestoreWithState(__pyx_t_6, __pyx_t_4, __pyx_t_5);
                __pyx_t_6 = 0; __pyx_t_4 = 0; __pyx_t_5 = 0; 
                __PYX_ERR(0, 113, __pyx_L19_except_error)
              }
              __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
              __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
              __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
              goto __pyx_L18_exception_handled;
            }
            __pyx_L19_except_error:;
            __Pyx_PyThreadState_assign
            __Pyx_XGIVEREF(__pyx_t_9);
            __Pyx_XGIVEREF(__pyx_t_10);
            __Pyx_XGIVEREF(__pyx_t_11);
            __Pyx_ExceptionReset(__pyx_t_9, __pyx_t_10, __pyx_t_11);
            goto __pyx_L3_error;
            __pyx_L18_exception_handled:;
            __Pyx_PyThreadState_assign
            __Pyx_XGIVEREF(__pyx_t_9);
            __Pyx_XGIVEREF(__pyx_t_10);
            __Pyx_XGIVEREF(__pyx_t_11);
            __Pyx_ExceptionReset(__pyx_t_9, __pyx_t_10, __pyx_t_11);
            __pyx_L24_try_end:;
          }
        }
        /*finally:*/ {
          /*normal exit:*/{
            if (__pyx_t_7) {
              __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_tuple__4, NULL);
              __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
              if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 113, __pyx_L3_error)
              __Pyx_GOTREF(__pyx_t_11);
              __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
            }
            goto __pyx_L16;
          }
          __pyx_L16:;
        }
        goto __pyx_L28;
        __pyx_L11_error:;
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        goto __pyx_L3_error;
        __pyx_L28:;
      }

      /* "rasterio/_base.pyx":112
 *     def _has_band(self, bidx):
 *         cdef void *hband = NULL
 *         try:             # <<<<<<<<<<<<<<
 *             with CPLErrors() as cple:
 *                 hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
    }
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    goto __pyx_L10_try_end;
    __pyx_L3_error:;
    __Pyx_PyThreadState_assign
    __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;

    /* "rasterio/_base.pyx":116
 *                 hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *                 cple.check()
 *         except CPLE_IllegalArg:             # <<<<<<<<<<<<<<
 *             return False
 *         return True
 */
    __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_CPLE_IllegalArg); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 116, __pyx_L5_except_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_12 = __Pyx_PyErr_ExceptionMatches(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    if (__pyx_t_12) {
      __Pyx_AddTraceback("rasterio._base.DatasetReader._has_band", __pyx_clineno, __pyx_lineno, __pyx_filename);
      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_4, &__pyx_t_6) < 0) __PYX_ERR(0, 116, __pyx_L5_except_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_GOTREF(__pyx_t_6);

      /* "rasterio/_base.pyx":117
 *                 cple.check()
 *         except CPLE_IllegalArg:
 *             return False             # <<<<<<<<<<<<<<
 *         return True
 * 
 */
      __Pyx_XDECREF(__pyx_r);
      __Pyx_INCREF(Py_False);
      __pyx_r = Py_False;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      goto __pyx_L6_except_return;
    }
    goto __pyx_L5_except_error;
    __pyx_L5_except_error:;

    /* "rasterio/_base.pyx":112
 *     def _has_band(self, bidx):
 *         cdef void *hband = NULL
 *         try:             # <<<<<<<<<<<<<<
 *             with CPLErrors() as cple:
 *                 hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
    __Pyx_PyThreadState_assign
    __Pyx_XGIVEREF(__pyx_t_1);
    __Pyx_XGIVEREF(__pyx_t_2);
    __Pyx_XGIVEREF(__pyx_t_3);
    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
    goto __pyx_L1_error;
    __pyx_L6_except_return:;
    __Pyx_PyThreadState_assign
    __Pyx_XGIVEREF(__pyx_t_1);
    __Pyx_XGIVEREF(__pyx_t_2);
    __Pyx_XGIVEREF(__pyx_t_3);
    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
    goto __pyx_L0;
    __pyx_L10_try_end:;
  }

  /* "rasterio/_base.pyx":118
 *         except CPLE_IllegalArg:
 *             return False
 *         return True             # <<<<<<<<<<<<<<
 * 
 *     def read_crs(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(Py_True);
  __pyx_r = Py_True;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":110
 *         return hband
 * 
 *     def _has_band(self, bidx):             # <<<<<<<<<<<<<<
 *         cdef void *hband = NULL
 *         try:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("rasterio._base.DatasetReader._has_band", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_cple);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":120
 *         return True
 * 
 *     def read_crs(self):             # <<<<<<<<<<<<<<
 *         cdef char *proj_c = NULL
 *         cdef const char * auth_key = NULL
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_9read_crs(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_9read_crs(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("read_crs (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_8read_crs(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_8read_crs(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  char *__pyx_v_proj_c;
  char const *__pyx_v_auth_key;
  char const *__pyx_v_auth_val;
  void *__pyx_v_osr;
  PyObject *__pyx_v_crs = NULL;
  char const *__pyx_v_wkt;
  char const *__pyx_v_wkt_b;
  int __pyx_v_retval;
  char const *__pyx_v_key_b;
  PyObject *__pyx_v_key = NULL;
  char const *__pyx_v_val_b;
  PyObject *__pyx_v_val = NULL;
  char *__pyx_v_proj_b;
  PyObject *__pyx_v_value = NULL;
  PyObject *__pyx_v_param = NULL;
  PyObject *__pyx_v_kv = NULL;
  PyObject *__pyx_v_k = NULL;
  PyObject *__pyx_v_v = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  size_t __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  Py_ssize_t __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  int __pyx_t_9;
  PyObject *(*__pyx_t_10)(PyObject *);
  Py_ssize_t __pyx_t_11;
  PyObject *(*__pyx_t_12)(PyObject *);
  PyObject *__pyx_t_13 = NULL;
  PyObject *__pyx_t_14 = NULL;
  PyObject *__pyx_t_15 = NULL;
  int __pyx_t_16;
  __Pyx_RefNannySetupContext("read_crs", 0);

  /* "rasterio/_base.pyx":121
 * 
 *     def read_crs(self):
 *         cdef char *proj_c = NULL             # <<<<<<<<<<<<<<
 *         cdef const char * auth_key = NULL
 *         cdef const char * auth_val = NULL
 */
  __pyx_v_proj_c = NULL;

  /* "rasterio/_base.pyx":122
 *     def read_crs(self):
 *         cdef char *proj_c = NULL
 *         cdef const char * auth_key = NULL             # <<<<<<<<<<<<<<
 *         cdef const char * auth_val = NULL
 *         cdef void *osr = NULL
 */
  __pyx_v_auth_key = NULL;

  /* "rasterio/_base.pyx":123
 *         cdef char *proj_c = NULL
 *         cdef const char * auth_key = NULL
 *         cdef const char * auth_val = NULL             # <<<<<<<<<<<<<<
 *         cdef void *osr = NULL
 *         if self._hds == NULL:
 */
  __pyx_v_auth_val = NULL;

  /* "rasterio/_base.pyx":124
 *         cdef const char * auth_key = NULL
 *         cdef const char * auth_val = NULL
 *         cdef void *osr = NULL             # <<<<<<<<<<<<<<
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")
 */
  __pyx_v_osr = NULL;

  /* "rasterio/_base.pyx":125
 *         cdef const char * auth_val = NULL
 *         cdef void *osr = NULL
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Null dataset")
 *         crs = {}
 */
  __pyx_t_1 = ((__pyx_v_self->_hds == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":126
 *         cdef void *osr = NULL
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")             # <<<<<<<<<<<<<<
 *         crs = {}
 *         cdef const char * wkt = _gdal.GDALGetProjectionRef(self._hds)
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 126, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 126, __pyx_L1_error)

    /* "rasterio/_base.pyx":125
 *         cdef const char * auth_val = NULL
 *         cdef void *osr = NULL
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Null dataset")
 *         crs = {}
 */
  }

  /* "rasterio/_base.pyx":127
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")
 *         crs = {}             # <<<<<<<<<<<<<<
 *         cdef const char * wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:
 */
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 127, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v_crs = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":128
 *             raise ValueError("Null dataset")
 *         crs = {}
 *         cdef const char * wkt = _gdal.GDALGetProjectionRef(self._hds)             # <<<<<<<<<<<<<<
 *         if wkt is NULL:
 *             raise ValueError("Unexpected NULL spatial reference")
 */
  __pyx_v_wkt = GDALGetProjectionRef(__pyx_v_self->_hds);

  /* "rasterio/_base.pyx":129
 *         crs = {}
 *         cdef const char * wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt
 */
  __pyx_t_1 = ((__pyx_v_wkt == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":130
 *         cdef const char * wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:
 *             raise ValueError("Unexpected NULL spatial reference")             # <<<<<<<<<<<<<<
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 130, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 130, __pyx_L1_error)

    /* "rasterio/_base.pyx":129
 *         crs = {}
 *         cdef const char * wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt
 */
  }

  /* "rasterio/_base.pyx":131
 *         if wkt is NULL:
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt             # <<<<<<<<<<<<<<
 *         if len(wkt_b) > 0:
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 */
  __pyx_v_wkt_b = __pyx_v_wkt;

  /* "rasterio/_base.pyx":132
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:             # <<<<<<<<<<<<<<
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             if osr == NULL:
 */
  __pyx_t_3 = strlen(__pyx_v_wkt_b); 
  __pyx_t_1 = ((__pyx_t_3 > 0) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":133
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:
 *             osr = _gdal.OSRNewSpatialReference(wkt)             # <<<<<<<<<<<<<<
 *             if osr == NULL:
 *                 raise ValueError("Unexpected NULL spatial reference")
 */
    __pyx_v_osr = OSRNewSpatialReference(__pyx_v_wkt);

    /* "rasterio/_base.pyx":134
 *         if len(wkt_b) > 0:
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             if osr == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("Unexpected NULL spatial reference")
 *             log.debug("Got coordinate system")
 */
    __pyx_t_1 = ((__pyx_v_osr == NULL) != 0);
    if (__pyx_t_1) {

      /* "rasterio/_base.pyx":135
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             if osr == NULL:
 *                 raise ValueError("Unexpected NULL spatial reference")             # <<<<<<<<<<<<<<
 *             log.debug("Got coordinate system")
 * 
 */
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 135, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_Raise(__pyx_t_2, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __PYX_ERR(0, 135, __pyx_L1_error)

      /* "rasterio/_base.pyx":134
 *         if len(wkt_b) > 0:
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             if osr == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("Unexpected NULL spatial reference")
 *             log.debug("Got coordinate system")
 */
    }

    /* "rasterio/_base.pyx":136
 *             if osr == NULL:
 *                 raise ValueError("Unexpected NULL spatial reference")
 *             log.debug("Got coordinate system")             # <<<<<<<<<<<<<<
 * 
 *             retval = _gdal.OSRAutoIdentifyEPSG(osr)
 */
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 136, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_debug); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 136, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 136, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":138
 *             log.debug("Got coordinate system")
 * 
 *             retval = _gdal.OSRAutoIdentifyEPSG(osr)             # <<<<<<<<<<<<<<
 *             if retval > 0:
 *                 log.info("Failed to auto identify EPSG: %d", retval)
 */
    __pyx_v_retval = OSRAutoIdentifyEPSG(__pyx_v_osr);

    /* "rasterio/_base.pyx":139
 * 
 *             retval = _gdal.OSRAutoIdentifyEPSG(osr)
 *             if retval > 0:             # <<<<<<<<<<<<<<
 *                 log.info("Failed to auto identify EPSG: %d", retval)
 * 
 */
    __pyx_t_1 = ((__pyx_v_retval > 0) != 0);
    if (__pyx_t_1) {

      /* "rasterio/_base.pyx":140
 *             retval = _gdal.OSRAutoIdentifyEPSG(osr)
 *             if retval > 0:
 *                 log.info("Failed to auto identify EPSG: %d", retval)             # <<<<<<<<<<<<<<
 * 
 *             auth_key = _gdal.OSRGetAuthorityName(osr, NULL)
 */
      __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 140, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_info); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 140, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_retval); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 140, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_6 = NULL;
      __pyx_t_7 = 0;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
        __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
        if (likely(__pyx_t_6)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
          __Pyx_INCREF(__pyx_t_6);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_5, function);
          __pyx_t_7 = 1;
        }
      }
      __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 140, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      if (__pyx_t_6) {
        __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_6); __pyx_t_6 = NULL;
      }
      __Pyx_INCREF(__pyx_kp_s_Failed_to_auto_identify_EPSG_d);
      __Pyx_GIVEREF(__pyx_kp_s_Failed_to_auto_identify_EPSG_d);
      PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_kp_s_Failed_to_auto_identify_EPSG_d);
      __Pyx_GIVEREF(__pyx_t_4);
      PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_t_4);
      __pyx_t_4 = 0;
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_8, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 140, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

      /* "rasterio/_base.pyx":139
 * 
 *             retval = _gdal.OSRAutoIdentifyEPSG(osr)
 *             if retval > 0:             # <<<<<<<<<<<<<<
 *                 log.info("Failed to auto identify EPSG: %d", retval)
 * 
 */
    }

    /* "rasterio/_base.pyx":142
 *                 log.info("Failed to auto identify EPSG: %d", retval)
 * 
 *             auth_key = _gdal.OSRGetAuthorityName(osr, NULL)             # <<<<<<<<<<<<<<
 *             auth_val = _gdal.OSRGetAuthorityCode(osr, NULL)
 * 
 */
    __pyx_v_auth_key = OSRGetAuthorityName(__pyx_v_osr, NULL);

    /* "rasterio/_base.pyx":143
 * 
 *             auth_key = _gdal.OSRGetAuthorityName(osr, NULL)
 *             auth_val = _gdal.OSRGetAuthorityCode(osr, NULL)             # <<<<<<<<<<<<<<
 * 
 *             if auth_key != NULL and auth_val != NULL:
 */
    __pyx_v_auth_val = OSRGetAuthorityCode(__pyx_v_osr, NULL);

    /* "rasterio/_base.pyx":145
 *             auth_val = _gdal.OSRGetAuthorityCode(osr, NULL)
 * 
 *             if auth_key != NULL and auth_val != NULL:             # <<<<<<<<<<<<<<
 *                 key_b = auth_key
 *                 key = key_b.decode('utf-8')
 */
    __pyx_t_9 = ((__pyx_v_auth_key != NULL) != 0);
    if (__pyx_t_9) {
    } else {
      __pyx_t_1 = __pyx_t_9;
      goto __pyx_L9_bool_binop_done;
    }
    __pyx_t_9 = ((__pyx_v_auth_val != NULL) != 0);
    __pyx_t_1 = __pyx_t_9;
    __pyx_L9_bool_binop_done:;
    if (__pyx_t_1) {

      /* "rasterio/_base.pyx":146
 * 
 *             if auth_key != NULL and auth_val != NULL:
 *                 key_b = auth_key             # <<<<<<<<<<<<<<
 *                 key = key_b.decode('utf-8')
 *                 if key == 'EPSG':
 */
      __pyx_v_key_b = __pyx_v_auth_key;

      /* "rasterio/_base.pyx":147
 *             if auth_key != NULL and auth_val != NULL:
 *                 key_b = auth_key
 *                 key = key_b.decode('utf-8')             # <<<<<<<<<<<<<<
 *                 if key == 'EPSG':
 *                     val_b = auth_val
 */
      __pyx_t_2 = __Pyx_decode_c_string(__pyx_v_key_b, 0, strlen(__pyx_v_key_b), NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 147, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_v_key = __pyx_t_2;
      __pyx_t_2 = 0;

      /* "rasterio/_base.pyx":148
 *                 key_b = auth_key
 *                 key = key_b.decode('utf-8')
 *                 if key == 'EPSG':             # <<<<<<<<<<<<<<
 *                     val_b = auth_val
 *                     val = val_b.decode('utf-8')
 */
      __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_key, __pyx_n_s_EPSG, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 148, __pyx_L1_error)
      if (__pyx_t_1) {

        /* "rasterio/_base.pyx":149
 *                 key = key_b.decode('utf-8')
 *                 if key == 'EPSG':
 *                     val_b = auth_val             # <<<<<<<<<<<<<<
 *                     val = val_b.decode('utf-8')
 *                     crs['init'] = "epsg:" + val
 */
        __pyx_v_val_b = __pyx_v_auth_val;

        /* "rasterio/_base.pyx":150
 *                 if key == 'EPSG':
 *                     val_b = auth_val
 *                     val = val_b.decode('utf-8')             # <<<<<<<<<<<<<<
 *                     crs['init'] = "epsg:" + val
 *             else:
 */
        __pyx_t_2 = __Pyx_decode_c_string(__pyx_v_val_b, 0, strlen(__pyx_v_val_b), NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 150, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        __pyx_v_val = __pyx_t_2;
        __pyx_t_2 = 0;

        /* "rasterio/_base.pyx":151
 *                     val_b = auth_val
 *                     val = val_b.decode('utf-8')
 *                     crs['init'] = "epsg:" + val             # <<<<<<<<<<<<<<
 *             else:
 *                 _gdal.OSRExportToProj4(osr, &proj_c)
 */
        __pyx_t_2 = PyNumber_Add(__pyx_kp_s_epsg, __pyx_v_val); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 151, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        if (unlikely(PyDict_SetItem(__pyx_v_crs, __pyx_n_s_init, __pyx_t_2) < 0)) __PYX_ERR(0, 151, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

        /* "rasterio/_base.pyx":148
 *                 key_b = auth_key
 *                 key = key_b.decode('utf-8')
 *                 if key == 'EPSG':             # <<<<<<<<<<<<<<
 *                     val_b = auth_val
 *                     val = val_b.decode('utf-8')
 */
      }

      /* "rasterio/_base.pyx":145
 *             auth_val = _gdal.OSRGetAuthorityCode(osr, NULL)
 * 
 *             if auth_key != NULL and auth_val != NULL:             # <<<<<<<<<<<<<<
 *                 key_b = auth_key
 *                 key = key_b.decode('utf-8')
 */
      goto __pyx_L8;
    }

    /* "rasterio/_base.pyx":153
 *                     crs['init'] = "epsg:" + val
 *             else:
 *                 _gdal.OSRExportToProj4(osr, &proj_c)             # <<<<<<<<<<<<<<
 *                 if proj_c == NULL:
 *                     raise ValueError("Unexpected Null spatial reference")
 */
    /*else*/ {
      OSRExportToProj4(__pyx_v_osr, (&__pyx_v_proj_c));

      /* "rasterio/_base.pyx":154
 *             else:
 *                 _gdal.OSRExportToProj4(osr, &proj_c)
 *                 if proj_c == NULL:             # <<<<<<<<<<<<<<
 *                     raise ValueError("Unexpected Null spatial reference")
 *                 proj_b = proj_c
 */
      __pyx_t_1 = ((__pyx_v_proj_c == NULL) != 0);
      if (__pyx_t_1) {

        /* "rasterio/_base.pyx":155
 *                 _gdal.OSRExportToProj4(osr, &proj_c)
 *                 if proj_c == NULL:
 *                     raise ValueError("Unexpected Null spatial reference")             # <<<<<<<<<<<<<<
 *                 proj_b = proj_c
 *                 log.debug("Params: %s", proj_b)
 */
        __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 155, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_Raise(__pyx_t_2, 0, 0, 0);
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __PYX_ERR(0, 155, __pyx_L1_error)

        /* "rasterio/_base.pyx":154
 *             else:
 *                 _gdal.OSRExportToProj4(osr, &proj_c)
 *                 if proj_c == NULL:             # <<<<<<<<<<<<<<
 *                     raise ValueError("Unexpected Null spatial reference")
 *                 proj_b = proj_c
 */
      }

      /* "rasterio/_base.pyx":156
 *                 if proj_c == NULL:
 *                     raise ValueError("Unexpected Null spatial reference")
 *                 proj_b = proj_c             # <<<<<<<<<<<<<<
 *                 log.debug("Params: %s", proj_b)
 *                 value = proj_b.decode()
 */
      __pyx_v_proj_b = __pyx_v_proj_c;

      /* "rasterio/_base.pyx":157
 *                     raise ValueError("Unexpected Null spatial reference")
 *                 proj_b = proj_c
 *                 log.debug("Params: %s", proj_b)             # <<<<<<<<<<<<<<
 *                 value = proj_b.decode()
 *                 value = value.strip()
 */
      __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 157, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_debug); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 157, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_t_5 = __Pyx_PyBytes_FromString(__pyx_v_proj_b); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 157, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_4 = NULL;
      __pyx_t_7 = 0;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_8))) {
        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_8);
        if (likely(__pyx_t_4)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_8, function);
          __pyx_t_7 = 1;
        }
      }
      __pyx_t_6 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 157, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      if (__pyx_t_4) {
        __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL;
      }
      __Pyx_INCREF(__pyx_kp_s_Params_s);
      __Pyx_GIVEREF(__pyx_kp_s_Params_s);
      PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_7, __pyx_kp_s_Params_s);
      __Pyx_GIVEREF(__pyx_t_5);
      PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_7, __pyx_t_5);
      __pyx_t_5 = 0;
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 157, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

      /* "rasterio/_base.pyx":158
 *                 proj_b = proj_c
 *                 log.debug("Params: %s", proj_b)
 *                 value = proj_b.decode()             # <<<<<<<<<<<<<<
 *                 value = value.strip()
 *                 for param in value.split():
 */
      __pyx_t_2 = __Pyx_decode_c_string(__pyx_v_proj_b, 0, strlen(__pyx_v_proj_b), NULL, NULL, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 158, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_v_value = __pyx_t_2;
      __pyx_t_2 = 0;

      /* "rasterio/_base.pyx":159
 *                 log.debug("Params: %s", proj_b)
 *                 value = proj_b.decode()
 *                 value = value.strip()             # <<<<<<<<<<<<<<
 *                 for param in value.split():
 *                     kv = param.split("=")
 */
      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_value, __pyx_n_s_strip); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 159, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_6 = NULL;
      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_8))) {
        __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_8);
        if (likely(__pyx_t_6)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
          __Pyx_INCREF(__pyx_t_6);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_8, function);
        }
      }
      if (__pyx_t_6) {
        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 159, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      } else {
        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 159, __pyx_L1_error)
      }
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_DECREF_SET(__pyx_v_value, __pyx_t_2);
      __pyx_t_2 = 0;

      /* "rasterio/_base.pyx":160
 *                 value = proj_b.decode()
 *                 value = value.strip()
 *                 for param in value.split():             # <<<<<<<<<<<<<<
 *                     kv = param.split("=")
 *                     if len(kv) == 2:
 */
      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_value, __pyx_n_s_split); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 160, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_6 = NULL;
      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_8))) {
        __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_8);
        if (likely(__pyx_t_6)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
          __Pyx_INCREF(__pyx_t_6);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_8, function);
        }
      }
      if (__pyx_t_6) {
        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 160, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      } else {
        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 160, __pyx_L1_error)
      }
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      if (likely(PyList_CheckExact(__pyx_t_2)) || PyTuple_CheckExact(__pyx_t_2)) {
        __pyx_t_8 = __pyx_t_2; __Pyx_INCREF(__pyx_t_8); __pyx_t_7 = 0;
        __pyx_t_10 = NULL;
      } else {
        __pyx_t_7 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 160, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        __pyx_t_10 = Py_TYPE(__pyx_t_8)->tp_iternext; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 160, __pyx_L1_error)
      }
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      for (;;) {
        if (likely(!__pyx_t_10)) {
          if (likely(PyList_CheckExact(__pyx_t_8))) {
            if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_8)) break;
            #if CYTHON_COMPILING_IN_CPYTHON
            __pyx_t_2 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 160, __pyx_L1_error)
            #else
            __pyx_t_2 = PySequence_ITEM(__pyx_t_8, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 160, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_2);
            #endif
          } else {
            if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
            #if CYTHON_COMPILING_IN_CPYTHON
            __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 160, __pyx_L1_error)
            #else
            __pyx_t_2 = PySequence_ITEM(__pyx_t_8, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 160, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_2);
            #endif
          }
        } else {
          __pyx_t_2 = __pyx_t_10(__pyx_t_8);
          if (unlikely(!__pyx_t_2)) {
            PyObject* exc_type = PyErr_Occurred();
            if (exc_type) {
              if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
              else __PYX_ERR(0, 160, __pyx_L1_error)
            }
            break;
          }
          __Pyx_GOTREF(__pyx_t_2);
        }
        __Pyx_XDECREF_SET(__pyx_v_param, __pyx_t_2);
        __pyx_t_2 = 0;

        /* "rasterio/_base.pyx":161
 *                 value = value.strip()
 *                 for param in value.split():
 *                     kv = param.split("=")             # <<<<<<<<<<<<<<
 *                     if len(kv) == 2:
 *                         k, v = kv
 */
        __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_param, __pyx_n_s_split); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 161, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 161, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __Pyx_XDECREF_SET(__pyx_v_kv, __pyx_t_6);
        __pyx_t_6 = 0;

        /* "rasterio/_base.pyx":162
 *                 for param in value.split():
 *                     kv = param.split("=")
 *                     if len(kv) == 2:             # <<<<<<<<<<<<<<
 *                         k, v = kv
 *                         try:
 */
        __pyx_t_11 = PyObject_Length(__pyx_v_kv); if (unlikely(__pyx_t_11 == -1)) __PYX_ERR(0, 162, __pyx_L1_error)
        __pyx_t_1 = ((__pyx_t_11 == 2) != 0);
        if (__pyx_t_1) {

          /* "rasterio/_base.pyx":163
 *                     kv = param.split("=")
 *                     if len(kv) == 2:
 *                         k, v = kv             # <<<<<<<<<<<<<<
 *                         try:
 *                             v = float(v)
 */
          if ((likely(PyTuple_CheckExact(__pyx_v_kv))) || (PyList_CheckExact(__pyx_v_kv))) {
            PyObject* sequence = __pyx_v_kv;
            #if CYTHON_COMPILING_IN_CPYTHON
            Py_ssize_t size = Py_SIZE(sequence);
            #else
            Py_ssize_t size = PySequence_Size(sequence);
            #endif
            if (unlikely(size != 2)) {
              if (size > 2) __Pyx_RaiseTooManyValuesError(2);
              else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
              __PYX_ERR(0, 163, __pyx_L1_error)
            }
            #if CYTHON_COMPILING_IN_CPYTHON
            if (likely(PyTuple_CheckExact(sequence))) {
              __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); 
              __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
            } else {
              __pyx_t_6 = PyList_GET_ITEM(sequence, 0); 
              __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
            }
            __Pyx_INCREF(__pyx_t_6);
            __Pyx_INCREF(__pyx_t_2);
            #else
            __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 163, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_6);
            __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 163, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_2);
            #endif
          } else {
            Py_ssize_t index = -1;
            __pyx_t_5 = PyObject_GetIter(__pyx_v_kv); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 163, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_5);
            __pyx_t_12 = Py_TYPE(__pyx_t_5)->tp_iternext;
            index = 0; __pyx_t_6 = __pyx_t_12(__pyx_t_5); if (unlikely(!__pyx_t_6)) goto __pyx_L16_unpacking_failed;
            __Pyx_GOTREF(__pyx_t_6);
            index = 1; __pyx_t_2 = __pyx_t_12(__pyx_t_5); if (unlikely(!__pyx_t_2)) goto __pyx_L16_unpacking_failed;
            __Pyx_GOTREF(__pyx_t_2);
            if (__Pyx_IternextUnpackEndCheck(__pyx_t_12(__pyx_t_5), 2) < 0) __PYX_ERR(0, 163, __pyx_L1_error)
            __pyx_t_12 = NULL;
            __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
            goto __pyx_L17_unpacking_done;
            __pyx_L16_unpacking_failed:;
            __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
            __pyx_t_12 = NULL;
            if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
            __PYX_ERR(0, 163, __pyx_L1_error)
            __pyx_L17_unpacking_done:;
          }
          __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_6);
          __pyx_t_6 = 0;
          __Pyx_XDECREF_SET(__pyx_v_v, __pyx_t_2);
          __pyx_t_2 = 0;

          /* "rasterio/_base.pyx":164
 *                     if len(kv) == 2:
 *                         k, v = kv
 *                         try:             # <<<<<<<<<<<<<<
 *                             v = float(v)
 *                             if v % 1 == 0:
 */
          {
            __Pyx_PyThreadState_declare
            __Pyx_PyThreadState_assign
            __Pyx_ExceptionSave(&__pyx_t_13, &__pyx_t_14, &__pyx_t_15);
            __Pyx_XGOTREF(__pyx_t_13);
            __Pyx_XGOTREF(__pyx_t_14);
            __Pyx_XGOTREF(__pyx_t_15);
            /*try:*/ {

              /* "rasterio/_base.pyx":165
 *                         k, v = kv
 *                         try:
 *                             v = float(v)             # <<<<<<<<<<<<<<
 *                             if v % 1 == 0:
 *                                 v = int(v)
 */
              __pyx_t_2 = __Pyx_PyNumber_Float(__pyx_v_v); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 165, __pyx_L18_error)
              __Pyx_GOTREF(__pyx_t_2);
              __Pyx_DECREF_SET(__pyx_v_v, __pyx_t_2);
              __pyx_t_2 = 0;

              /* "rasterio/_base.pyx":166
 *                         try:
 *                             v = float(v)
 *                             if v % 1 == 0:             # <<<<<<<<<<<<<<
 *                                 v = int(v)
 *                         except ValueError:
 */
              __pyx_t_2 = __Pyx_PyInt_RemainderObjC(__pyx_v_v, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 166, __pyx_L18_error)
              __Pyx_GOTREF(__pyx_t_2);
              __pyx_t_6 = __Pyx_PyInt_EqObjC(__pyx_t_2, __pyx_int_0, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 166, __pyx_L18_error)
              __Pyx_GOTREF(__pyx_t_6);
              __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
              __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 166, __pyx_L18_error)
              __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
              if (__pyx_t_1) {

                /* "rasterio/_base.pyx":167
 *                             v = float(v)
 *                             if v % 1 == 0:
 *                                 v = int(v)             # <<<<<<<<<<<<<<
 *                         except ValueError:
 *                             # Leave v as a string
 */
                __pyx_t_6 = __Pyx_PyNumber_Int(__pyx_v_v); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 167, __pyx_L18_error)
                __Pyx_GOTREF(__pyx_t_6);
                __Pyx_DECREF_SET(__pyx_v_v, __pyx_t_6);
                __pyx_t_6 = 0;

                /* "rasterio/_base.pyx":166
 *                         try:
 *                             v = float(v)
 *                             if v % 1 == 0:             # <<<<<<<<<<<<<<
 *                                 v = int(v)
 *                         except ValueError:
 */
              }

              /* "rasterio/_base.pyx":164
 *                     if len(kv) == 2:
 *                         k, v = kv
 *                         try:             # <<<<<<<<<<<<<<
 *                             v = float(v)
 *                             if v % 1 == 0:
 */
            }
            __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
            __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
            __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
            goto __pyx_L25_try_end;
            __pyx_L18_error:;
            __Pyx_PyThreadState_assign
            __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
            __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
            __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
            __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;

            /* "rasterio/_base.pyx":168
 *                             if v % 1 == 0:
 *                                 v = int(v)
 *                         except ValueError:             # <<<<<<<<<<<<<<
 *                             # Leave v as a string
 *                             pass
 */
            __pyx_t_16 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_ValueError);
            if (__pyx_t_16) {
              __Pyx_ErrRestore(0,0,0);
              goto __pyx_L19_exception_handled;
            }
            goto __pyx_L20_except_error;
            __pyx_L20_except_error:;

            /* "rasterio/_base.pyx":164
 *                     if len(kv) == 2:
 *                         k, v = kv
 *                         try:             # <<<<<<<<<<<<<<
 *                             v = float(v)
 *                             if v % 1 == 0:
 */
            __Pyx_PyThreadState_assign
            __Pyx_XGIVEREF(__pyx_t_13);
            __Pyx_XGIVEREF(__pyx_t_14);
            __Pyx_XGIVEREF(__pyx_t_15);
            __Pyx_ExceptionReset(__pyx_t_13, __pyx_t_14, __pyx_t_15);
            goto __pyx_L1_error;
            __pyx_L19_exception_handled:;
            __Pyx_PyThreadState_assign
            __Pyx_XGIVEREF(__pyx_t_13);
            __Pyx_XGIVEREF(__pyx_t_14);
            __Pyx_XGIVEREF(__pyx_t_15);
            __Pyx_ExceptionReset(__pyx_t_13, __pyx_t_14, __pyx_t_15);
            __pyx_L25_try_end:;
          }

          /* "rasterio/_base.pyx":162
 *                 for param in value.split():
 *                     kv = param.split("=")
 *                     if len(kv) == 2:             # <<<<<<<<<<<<<<
 *                         k, v = kv
 *                         try:
 */
          goto __pyx_L15;
        }

        /* "rasterio/_base.pyx":171
 *                             # Leave v as a string
 *                             pass
 *                     elif len(kv) == 1:             # <<<<<<<<<<<<<<
 *                         k, v = kv[0], True
 *                     else:
 */
        __pyx_t_11 = PyObject_Length(__pyx_v_kv); if (unlikely(__pyx_t_11 == -1)) __PYX_ERR(0, 171, __pyx_L1_error)
        __pyx_t_1 = ((__pyx_t_11 == 1) != 0);
        if (__pyx_t_1) {

          /* "rasterio/_base.pyx":172
 *                             pass
 *                     elif len(kv) == 1:
 *                         k, v = kv[0], True             # <<<<<<<<<<<<<<
 *                     else:
 *                         raise ValueError(
 */
          __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_kv, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 172, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_2 = Py_True;
          __Pyx_INCREF(__pyx_t_2);
          __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_6);
          __pyx_t_6 = 0;
          __Pyx_XDECREF_SET(__pyx_v_v, __pyx_t_2);
          __pyx_t_2 = 0;

          /* "rasterio/_base.pyx":171
 *                             # Leave v as a string
 *                             pass
 *                     elif len(kv) == 1:             # <<<<<<<<<<<<<<
 *                         k, v = kv[0], True
 *                     else:
 */
          goto __pyx_L15;
        }

        /* "rasterio/_base.pyx":174
 *                         k, v = kv[0], True
 *                     else:
 *                         raise ValueError(             # <<<<<<<<<<<<<<
 *                             "Unexpected proj parameter %s" % param)
 *                     k = k.lstrip("+")
 */
        /*else*/ {

          /* "rasterio/_base.pyx":175
 *                     else:
 *                         raise ValueError(
 *                             "Unexpected proj parameter %s" % param)             # <<<<<<<<<<<<<<
 *                     k = k.lstrip("+")
 *                     crs[k] = v
 */
          __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_Unexpected_proj_parameter_s, __pyx_v_param); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 175, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_2);

          /* "rasterio/_base.pyx":174
 *                         k, v = kv[0], True
 *                     else:
 *                         raise ValueError(             # <<<<<<<<<<<<<<
 *                             "Unexpected proj parameter %s" % param)
 *                     k = k.lstrip("+")
 */
          __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 174, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __Pyx_GIVEREF(__pyx_t_2);
          PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2);
          __pyx_t_2 = 0;
          __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 174, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_2);
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __Pyx_Raise(__pyx_t_2, 0, 0, 0);
          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
          __PYX_ERR(0, 174, __pyx_L1_error)
        }
        __pyx_L15:;

        /* "rasterio/_base.pyx":176
 *                         raise ValueError(
 *                             "Unexpected proj parameter %s" % param)
 *                     k = k.lstrip("+")             # <<<<<<<<<<<<<<
 *                     crs[k] = v
 * 
 */
        __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_k, __pyx_n_s_lstrip); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 176, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 176, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __Pyx_DECREF_SET(__pyx_v_k, __pyx_t_6);
        __pyx_t_6 = 0;

        /* "rasterio/_base.pyx":177
 *                             "Unexpected proj parameter %s" % param)
 *                     k = k.lstrip("+")
 *                     crs[k] = v             # <<<<<<<<<<<<<<
 * 
 *             _gdal.CPLFree(proj_c)
 */
        if (unlikely(PyDict_SetItem(__pyx_v_crs, __pyx_v_k, __pyx_v_v) < 0)) __PYX_ERR(0, 177, __pyx_L1_error)

        /* "rasterio/_base.pyx":160
 *                 value = proj_b.decode()
 *                 value = value.strip()
 *                 for param in value.split():             # <<<<<<<<<<<<<<
 *                     kv = param.split("=")
 *                     if len(kv) == 2:
 */
      }
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    }
    __pyx_L8:;

    /* "rasterio/_base.pyx":179
 *                     crs[k] = v
 * 
 *             _gdal.CPLFree(proj_c)             # <<<<<<<<<<<<<<
 *             _gdal.OSRDestroySpatialReference(osr)
 *         else:
 */
    CPLFree(__pyx_v_proj_c);

    /* "rasterio/_base.pyx":180
 * 
 *             _gdal.CPLFree(proj_c)
 *             _gdal.OSRDestroySpatialReference(osr)             # <<<<<<<<<<<<<<
 *         else:
 *             log.debug("GDAL dataset has no projection.")
 */
    OSRDestroySpatialReference(__pyx_v_osr);

    /* "rasterio/_base.pyx":132
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:             # <<<<<<<<<<<<<<
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             if osr == NULL:
 */
    goto __pyx_L5;
  }

  /* "rasterio/_base.pyx":182
 *             _gdal.OSRDestroySpatialReference(osr)
 *         else:
 *             log.debug("GDAL dataset has no projection.")             # <<<<<<<<<<<<<<
 *         return crs
 * 
 */
  /*else*/ {
    __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 182, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_debug); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 182, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 182, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  }
  __pyx_L5:;

  /* "rasterio/_base.pyx":183
 *         else:
 *             log.debug("GDAL dataset has no projection.")
 *         return crs             # <<<<<<<<<<<<<<
 * 
 *     def read_crs_wkt(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_crs);
  __pyx_r = __pyx_v_crs;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":120
 *         return True
 * 
 *     def read_crs(self):             # <<<<<<<<<<<<<<
 *         cdef char *proj_c = NULL
 *         cdef const char * auth_key = NULL
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.read_crs", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_crs);
  __Pyx_XDECREF(__pyx_v_key);
  __Pyx_XDECREF(__pyx_v_val);
  __Pyx_XDECREF(__pyx_v_value);
  __Pyx_XDECREF(__pyx_v_param);
  __Pyx_XDECREF(__pyx_v_kv);
  __Pyx_XDECREF(__pyx_v_k);
  __Pyx_XDECREF(__pyx_v_v);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":185
 *         return crs
 * 
 *     def read_crs_wkt(self):             # <<<<<<<<<<<<<<
 *         cdef char *proj_c = NULL
 *         cdef char *key_c = NULL
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_11read_crs_wkt(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_11read_crs_wkt(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("read_crs_wkt (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_10read_crs_wkt(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_10read_crs_wkt(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  char *__pyx_v_proj_c;
  CYTHON_UNUSED char *__pyx_v_key_c;
  void *__pyx_v_osr;
  char const *__pyx_v_wkt;
  char const *__pyx_v_wkt_b;
  int __pyx_v_retval;
  char *__pyx_v_proj_b;
  PyObject *__pyx_v_crs_wkt = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  size_t __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  Py_ssize_t __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  __Pyx_RefNannySetupContext("read_crs_wkt", 0);

  /* "rasterio/_base.pyx":186
 * 
 *     def read_crs_wkt(self):
 *         cdef char *proj_c = NULL             # <<<<<<<<<<<<<<
 *         cdef char *key_c = NULL
 *         cdef void *osr = NULL
 */
  __pyx_v_proj_c = NULL;

  /* "rasterio/_base.pyx":187
 *     def read_crs_wkt(self):
 *         cdef char *proj_c = NULL
 *         cdef char *key_c = NULL             # <<<<<<<<<<<<<<
 *         cdef void *osr = NULL
 *         cdef const char * wkt = NULL
 */
  __pyx_v_key_c = NULL;

  /* "rasterio/_base.pyx":188
 *         cdef char *proj_c = NULL
 *         cdef char *key_c = NULL
 *         cdef void *osr = NULL             # <<<<<<<<<<<<<<
 *         cdef const char * wkt = NULL
 *         if self._hds == NULL:
 */
  __pyx_v_osr = NULL;

  /* "rasterio/_base.pyx":189
 *         cdef char *key_c = NULL
 *         cdef void *osr = NULL
 *         cdef const char * wkt = NULL             # <<<<<<<<<<<<<<
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")
 */
  __pyx_v_wkt = NULL;

  /* "rasterio/_base.pyx":190
 *         cdef void *osr = NULL
 *         cdef const char * wkt = NULL
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Null dataset")
 *         wkt = _gdal.GDALGetProjectionRef(self._hds)
 */
  __pyx_t_1 = ((__pyx_v_self->_hds == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":191
 *         cdef const char * wkt = NULL
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")             # <<<<<<<<<<<<<<
 *         wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 191, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 191, __pyx_L1_error)

    /* "rasterio/_base.pyx":190
 *         cdef void *osr = NULL
 *         cdef const char * wkt = NULL
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Null dataset")
 *         wkt = _gdal.GDALGetProjectionRef(self._hds)
 */
  }

  /* "rasterio/_base.pyx":192
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")
 *         wkt = _gdal.GDALGetProjectionRef(self._hds)             # <<<<<<<<<<<<<<
 *         if wkt is NULL:
 *             raise ValueError("Unexpected NULL spatial reference")
 */
  __pyx_v_wkt = GDALGetProjectionRef(__pyx_v_self->_hds);

  /* "rasterio/_base.pyx":193
 *             raise ValueError("Null dataset")
 *         wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt
 */
  __pyx_t_1 = ((__pyx_v_wkt == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":194
 *         wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:
 *             raise ValueError("Unexpected NULL spatial reference")             # <<<<<<<<<<<<<<
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 194, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 194, __pyx_L1_error)

    /* "rasterio/_base.pyx":193
 *             raise ValueError("Null dataset")
 *         wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt
 */
  }

  /* "rasterio/_base.pyx":195
 *         if wkt is NULL:
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt             # <<<<<<<<<<<<<<
 *         if len(wkt_b) > 0:
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 */
  __pyx_v_wkt_b = __pyx_v_wkt;

  /* "rasterio/_base.pyx":196
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:             # <<<<<<<<<<<<<<
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             log.debug("Got coordinate system")
 */
  __pyx_t_3 = strlen(__pyx_v_wkt_b); 
  __pyx_t_1 = ((__pyx_t_3 > 0) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":197
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:
 *             osr = _gdal.OSRNewSpatialReference(wkt)             # <<<<<<<<<<<<<<
 *             log.debug("Got coordinate system")
 *             if osr != NULL:
 */
    __pyx_v_osr = OSRNewSpatialReference(__pyx_v_wkt);

    /* "rasterio/_base.pyx":198
 *         if len(wkt_b) > 0:
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             log.debug("Got coordinate system")             # <<<<<<<<<<<<<<
 *             if osr != NULL:
 *                 retval = _gdal.OSRAutoIdentifyEPSG(osr)
 */
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 198, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_debug); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 198, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 198, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":199
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             log.debug("Got coordinate system")
 *             if osr != NULL:             # <<<<<<<<<<<<<<
 *                 retval = _gdal.OSRAutoIdentifyEPSG(osr)
 *                 if retval > 0:
 */
    __pyx_t_1 = ((__pyx_v_osr != NULL) != 0);
    if (__pyx_t_1) {

      /* "rasterio/_base.pyx":200
 *             log.debug("Got coordinate system")
 *             if osr != NULL:
 *                 retval = _gdal.OSRAutoIdentifyEPSG(osr)             # <<<<<<<<<<<<<<
 *                 if retval > 0:
 *                     log.info("Failed to auto identify EPSG: %d", retval)
 */
      __pyx_v_retval = OSRAutoIdentifyEPSG(__pyx_v_osr);

      /* "rasterio/_base.pyx":201
 *             if osr != NULL:
 *                 retval = _gdal.OSRAutoIdentifyEPSG(osr)
 *                 if retval > 0:             # <<<<<<<<<<<<<<
 *                     log.info("Failed to auto identify EPSG: %d", retval)
 *                 _gdal.OSRExportToWkt(osr, &proj_c)
 */
      __pyx_t_1 = ((__pyx_v_retval > 0) != 0);
      if (__pyx_t_1) {

        /* "rasterio/_base.pyx":202
 *                 retval = _gdal.OSRAutoIdentifyEPSG(osr)
 *                 if retval > 0:
 *                     log.info("Failed to auto identify EPSG: %d", retval)             # <<<<<<<<<<<<<<
 *                 _gdal.OSRExportToWkt(osr, &proj_c)
 *                 if proj_c == NULL:
 */
        __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 202, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_info); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 202, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_retval); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 202, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        __pyx_t_6 = NULL;
        __pyx_t_7 = 0;
        if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
          __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
          if (likely(__pyx_t_6)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
            __Pyx_INCREF(__pyx_t_6);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_5, function);
            __pyx_t_7 = 1;
          }
        }
        __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 202, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        if (__pyx_t_6) {
          __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_6); __pyx_t_6 = NULL;
        }
        __Pyx_INCREF(__pyx_kp_s_Failed_to_auto_identify_EPSG_d);
        __Pyx_GIVEREF(__pyx_kp_s_Failed_to_auto_identify_EPSG_d);
        PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_kp_s_Failed_to_auto_identify_EPSG_d);
        __Pyx_GIVEREF(__pyx_t_4);
        PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_t_4);
        __pyx_t_4 = 0;
        __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_8, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 202, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

        /* "rasterio/_base.pyx":201
 *             if osr != NULL:
 *                 retval = _gdal.OSRAutoIdentifyEPSG(osr)
 *                 if retval > 0:             # <<<<<<<<<<<<<<
 *                     log.info("Failed to auto identify EPSG: %d", retval)
 *                 _gdal.OSRExportToWkt(osr, &proj_c)
 */
      }

      /* "rasterio/_base.pyx":203
 *                 if retval > 0:
 *                     log.info("Failed to auto identify EPSG: %d", retval)
 *                 _gdal.OSRExportToWkt(osr, &proj_c)             # <<<<<<<<<<<<<<
 *                 if proj_c == NULL:
 *                     raise ValueError("Null projection")
 */
      OSRExportToWkt(__pyx_v_osr, (&__pyx_v_proj_c));

      /* "rasterio/_base.pyx":204
 *                     log.info("Failed to auto identify EPSG: %d", retval)
 *                 _gdal.OSRExportToWkt(osr, &proj_c)
 *                 if proj_c == NULL:             # <<<<<<<<<<<<<<
 *                     raise ValueError("Null projection")
 *                 proj_b = proj_c
 */
      __pyx_t_1 = ((__pyx_v_proj_c == NULL) != 0);
      if (__pyx_t_1) {

        /* "rasterio/_base.pyx":205
 *                 _gdal.OSRExportToWkt(osr, &proj_c)
 *                 if proj_c == NULL:
 *                     raise ValueError("Null projection")             # <<<<<<<<<<<<<<
 *                 proj_b = proj_c
 *                 crs_wkt = proj_b.decode('utf-8')
 */
        __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 205, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_Raise(__pyx_t_2, 0, 0, 0);
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __PYX_ERR(0, 205, __pyx_L1_error)

        /* "rasterio/_base.pyx":204
 *                     log.info("Failed to auto identify EPSG: %d", retval)
 *                 _gdal.OSRExportToWkt(osr, &proj_c)
 *                 if proj_c == NULL:             # <<<<<<<<<<<<<<
 *                     raise ValueError("Null projection")
 *                 proj_b = proj_c
 */
      }

      /* "rasterio/_base.pyx":206
 *                 if proj_c == NULL:
 *                     raise ValueError("Null projection")
 *                 proj_b = proj_c             # <<<<<<<<<<<<<<
 *                 crs_wkt = proj_b.decode('utf-8')
 *                 _gdal.CPLFree(proj_c)
 */
      __pyx_v_proj_b = __pyx_v_proj_c;

      /* "rasterio/_base.pyx":207
 *                     raise ValueError("Null projection")
 *                 proj_b = proj_c
 *                 crs_wkt = proj_b.decode('utf-8')             # <<<<<<<<<<<<<<
 *                 _gdal.CPLFree(proj_c)
 *                 _gdal.OSRDestroySpatialReference(osr)
 */
      __pyx_t_2 = __Pyx_decode_c_string(__pyx_v_proj_b, 0, strlen(__pyx_v_proj_b), NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 207, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_v_crs_wkt = __pyx_t_2;
      __pyx_t_2 = 0;

      /* "rasterio/_base.pyx":208
 *                 proj_b = proj_c
 *                 crs_wkt = proj_b.decode('utf-8')
 *                 _gdal.CPLFree(proj_c)             # <<<<<<<<<<<<<<
 *                 _gdal.OSRDestroySpatialReference(osr)
 *         else:
 */
      CPLFree(__pyx_v_proj_c);

      /* "rasterio/_base.pyx":209
 *                 crs_wkt = proj_b.decode('utf-8')
 *                 _gdal.CPLFree(proj_c)
 *                 _gdal.OSRDestroySpatialReference(osr)             # <<<<<<<<<<<<<<
 *         else:
 *             log.debug("GDAL dataset has no projection.")
 */
      OSRDestroySpatialReference(__pyx_v_osr);

      /* "rasterio/_base.pyx":199
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             log.debug("Got coordinate system")
 *             if osr != NULL:             # <<<<<<<<<<<<<<
 *                 retval = _gdal.OSRAutoIdentifyEPSG(osr)
 *                 if retval > 0:
 */
    }

    /* "rasterio/_base.pyx":196
 *             raise ValueError("Unexpected NULL spatial reference")
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:             # <<<<<<<<<<<<<<
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             log.debug("Got coordinate system")
 */
    goto __pyx_L5;
  }

  /* "rasterio/_base.pyx":211
 *                 _gdal.OSRDestroySpatialReference(osr)
 *         else:
 *             log.debug("GDAL dataset has no projection.")             # <<<<<<<<<<<<<<
 *             crs_wkt = None
 *         return crs_wkt
 */
  /*else*/ {
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 211, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_debug); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 211, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 211, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":212
 *         else:
 *             log.debug("GDAL dataset has no projection.")
 *             crs_wkt = None             # <<<<<<<<<<<<<<
 *         return crs_wkt
 * 
 */
    __Pyx_INCREF(Py_None);
    __pyx_v_crs_wkt = Py_None;
  }
  __pyx_L5:;

  /* "rasterio/_base.pyx":213
 *             log.debug("GDAL dataset has no projection.")
 *             crs_wkt = None
 *         return crs_wkt             # <<<<<<<<<<<<<<
 * 
 *     def read_transform(self):
 */
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(!__pyx_v_crs_wkt)) { __Pyx_RaiseUnboundLocalError("crs_wkt"); __PYX_ERR(0, 213, __pyx_L1_error) }
  __Pyx_INCREF(__pyx_v_crs_wkt);
  __pyx_r = __pyx_v_crs_wkt;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":185
 *         return crs
 * 
 *     def read_crs_wkt(self):             # <<<<<<<<<<<<<<
 *         cdef char *proj_c = NULL
 *         cdef char *key_c = NULL
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.read_crs_wkt", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_crs_wkt);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":215
 *         return crs_wkt
 * 
 *     def read_transform(self):             # <<<<<<<<<<<<<<
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_13read_transform(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_13read_transform(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("read_transform (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_12read_transform(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_12read_transform(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  double __pyx_v_gt[6];
  int __pyx_v_err;
  PyObject *__pyx_v_transform = NULL;
  long __pyx_v_i;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  Py_ssize_t __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  long __pyx_t_7;
  __Pyx_RefNannySetupContext("read_transform", 0);

  /* "rasterio/_base.pyx":216
 * 
 *     def read_transform(self):
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Null dataset")
 *         cdef double gt[6]
 */
  __pyx_t_1 = ((__pyx_v_self->_hds == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":217
 *     def read_transform(self):
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")             # <<<<<<<<<<<<<<
 *         cdef double gt[6]
 *         err = _gdal.GDALGetGeoTransform(self._hds, gt)
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 217, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 217, __pyx_L1_error)

    /* "rasterio/_base.pyx":216
 * 
 *     def read_transform(self):
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("Null dataset")
 *         cdef double gt[6]
 */
  }

  /* "rasterio/_base.pyx":219
 *             raise ValueError("Null dataset")
 *         cdef double gt[6]
 *         err = _gdal.GDALGetGeoTransform(self._hds, gt)             # <<<<<<<<<<<<<<
 * 
 *         if err == GDALError.failure:
 */
  __pyx_v_err = GDALGetGeoTransform(__pyx_v_self->_hds, __pyx_v_gt);

  /* "rasterio/_base.pyx":221
 *         err = _gdal.GDALGetGeoTransform(self._hds, gt)
 * 
 *         if err == GDALError.failure:             # <<<<<<<<<<<<<<
 *             warnings.warn(
 *                 "Dataset has no geotransform set.  Default transform "
 */
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_err); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 221, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_GDALError); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 221, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_failure); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 221, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 221, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 221, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":222
 * 
 *         if err == GDALError.failure:
 *             warnings.warn(             # <<<<<<<<<<<<<<
 *                 "Dataset has no geotransform set.  Default transform "
 *                 "will be applied (Affine.identity())",
 */
    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_warnings); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 222, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_warn); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 222, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;

    /* "rasterio/_base.pyx":226
 *                 "will be applied (Affine.identity())",
 *                 UserWarning
 *             )             # <<<<<<<<<<<<<<
 * 
 *         transform = [0]*6
 */
    __pyx_t_4 = NULL;
    __pyx_t_5 = 0;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_4)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
        __pyx_t_5 = 1;
      }
    }
    __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 222, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    if (__pyx_t_4) {
      __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL;
    }
    __Pyx_INCREF(__pyx_kp_s_Dataset_has_no_geotransform_set);
    __Pyx_GIVEREF(__pyx_kp_s_Dataset_has_no_geotransform_set);
    PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_kp_s_Dataset_has_no_geotransform_set);
    __Pyx_INCREF(__pyx_builtin_UserWarning);
    __Pyx_GIVEREF(__pyx_builtin_UserWarning);
    PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_builtin_UserWarning);
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 222, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

    /* "rasterio/_base.pyx":221
 *         err = _gdal.GDALGetGeoTransform(self._hds, gt)
 * 
 *         if err == GDALError.failure:             # <<<<<<<<<<<<<<
 *             warnings.warn(
 *                 "Dataset has no geotransform set.  Default transform "
 */
  }

  /* "rasterio/_base.pyx":228
 *             )
 * 
 *         transform = [0]*6             # <<<<<<<<<<<<<<
 *         for i in range(6):
 *             transform[i] = gt[i]
 */
  __pyx_t_3 = PyList_New(1 * 6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 228, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  { Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < 6; __pyx_temp++) {
      __Pyx_INCREF(__pyx_int_0);
      __Pyx_GIVEREF(__pyx_int_0);
      PyList_SET_ITEM(__pyx_t_3, __pyx_temp, __pyx_int_0);
    }
  }
  __pyx_v_transform = ((PyObject*)__pyx_t_3);
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":229
 * 
 *         transform = [0]*6
 *         for i in range(6):             # <<<<<<<<<<<<<<
 *             transform[i] = gt[i]
 *         return transform
 */
  for (__pyx_t_7 = 0; __pyx_t_7 < 6; __pyx_t_7+=1) {
    __pyx_v_i = __pyx_t_7;

    /* "rasterio/_base.pyx":230
 *         transform = [0]*6
 *         for i in range(6):
 *             transform[i] = gt[i]             # <<<<<<<<<<<<<<
 *         return transform
 * 
 */
    __pyx_t_3 = PyFloat_FromDouble((__pyx_v_gt[__pyx_v_i])); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 230, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    if (unlikely(__Pyx_SetItemInt(__pyx_v_transform, __pyx_v_i, __pyx_t_3, long, 1, __Pyx_PyInt_From_long, 1, 1, 0) < 0)) __PYX_ERR(0, 230, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  }

  /* "rasterio/_base.pyx":231
 *         for i in range(6):
 *             transform[i] = gt[i]
 *         return transform             # <<<<<<<<<<<<<<
 * 
 *     def stop(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_transform);
  __pyx_r = __pyx_v_transform;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":215
 *         return crs_wkt
 * 
 *     def read_transform(self):             # <<<<<<<<<<<<<<
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.read_transform", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_transform);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":233
 *         return transform
 * 
 *     def stop(self):             # <<<<<<<<<<<<<<
 *         if self._hds != NULL:
 *             _gdal.GDALFlushCache(self._hds)
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_15stop(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_15stop(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("stop (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_14stop(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_14stop(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  Py_ssize_t __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  __Pyx_RefNannySetupContext("stop", 0);

  /* "rasterio/_base.pyx":234
 * 
 *     def stop(self):
 *         if self._hds != NULL:             # <<<<<<<<<<<<<<
 *             _gdal.GDALFlushCache(self._hds)
 *             _gdal.GDALClose(self._hds)
 */
  __pyx_t_1 = ((__pyx_v_self->_hds != NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":235
 *     def stop(self):
 *         if self._hds != NULL:
 *             _gdal.GDALFlushCache(self._hds)             # <<<<<<<<<<<<<<
 *             _gdal.GDALClose(self._hds)
 *         self._hds = NULL
 */
    GDALFlushCache(__pyx_v_self->_hds);

    /* "rasterio/_base.pyx":236
 *         if self._hds != NULL:
 *             _gdal.GDALFlushCache(self._hds)
 *             _gdal.GDALClose(self._hds)             # <<<<<<<<<<<<<<
 *         self._hds = NULL
 *         log.debug("Dataset %r has been stopped.", self)
 */
    GDALClose(__pyx_v_self->_hds);

    /* "rasterio/_base.pyx":234
 * 
 *     def stop(self):
 *         if self._hds != NULL:             # <<<<<<<<<<<<<<
 *             _gdal.GDALFlushCache(self._hds)
 *             _gdal.GDALClose(self._hds)
 */
  }

  /* "rasterio/_base.pyx":237
 *             _gdal.GDALFlushCache(self._hds)
 *             _gdal.GDALClose(self._hds)
 *         self._hds = NULL             # <<<<<<<<<<<<<<
 *         log.debug("Dataset %r has been stopped.", self)
 * 
 */
  __pyx_v_self->_hds = NULL;

  /* "rasterio/_base.pyx":238
 *             _gdal.GDALClose(self._hds)
 *         self._hds = NULL
 *         log.debug("Dataset %r has been stopped.", self)             # <<<<<<<<<<<<<<
 * 
 *     def close(self):
 */
  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 238, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_debug); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 238, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = NULL;
  __pyx_t_5 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
      __pyx_t_5 = 1;
    }
  }
  __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 238, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  if (__pyx_t_3) {
    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3); __pyx_t_3 = NULL;
  }
  __Pyx_INCREF(__pyx_kp_s_Dataset_r_has_been_stopped);
  __Pyx_GIVEREF(__pyx_kp_s_Dataset_r_has_been_stopped);
  PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_kp_s_Dataset_r_has_been_stopped);
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
  PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, ((PyObject *)__pyx_v_self));
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 238, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":233
 *         return transform
 * 
 *     def stop(self):             # <<<<<<<<<<<<<<
 *         if self._hds != NULL:
 *             _gdal.GDALFlushCache(self._hds)
 */

  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.stop", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":240
 *         log.debug("Dataset %r has been stopped.", self)
 * 
 *     def close(self):             # <<<<<<<<<<<<<<
 *         self.stop()
 *         self._closed = True
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_17close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_17close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("close (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_16close(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_16close(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannySetupContext("close", 0);

  /* "rasterio/_base.pyx":241
 * 
 *     def close(self):
 *         self.stop()             # <<<<<<<<<<<<<<
 *         self._closed = True
 *         log.debug("Dataset %r has been closed.", self)
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_stop); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 241, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 241, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 241, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":242
 *     def close(self):
 *         self.stop()
 *         self._closed = True             # <<<<<<<<<<<<<<
 *         log.debug("Dataset %r has been closed.", self)
 * 
 */
  __Pyx_INCREF(Py_True);
  __Pyx_GIVEREF(Py_True);
  __Pyx_GOTREF(__pyx_v_self->_closed);
  __Pyx_DECREF(__pyx_v_self->_closed);
  __pyx_v_self->_closed = Py_True;

  /* "rasterio/_base.pyx":243
 *         self.stop()
 *         self._closed = True
 *         log.debug("Dataset %r has been closed.", self)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 243, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_debug); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 243, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
      __pyx_t_4 = 1;
    }
  }
  __pyx_t_5 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 243, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (__pyx_t_2) {
    __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2); __pyx_t_2 = NULL;
  }
  __Pyx_INCREF(__pyx_kp_s_Dataset_r_has_been_closed);
  __Pyx_GIVEREF(__pyx_kp_s_Dataset_r_has_been_closed);
  PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, __pyx_kp_s_Dataset_r_has_been_closed);
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
  PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, ((PyObject *)__pyx_v_self));
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 243, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":240
 *         log.debug("Dataset %r has been stopped.", self)
 * 
 *     def close(self):             # <<<<<<<<<<<<<<
 *         self.stop()
 *         self._closed = True
 */

  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.close", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":246
 * 
 * 
 *     def __enter__(self):             # <<<<<<<<<<<<<<
 *         log.debug("Entering Dataset %r context.", self)
 *         return self
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_19__enter__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_19__enter__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__enter__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_18__enter__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_18__enter__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannySetupContext("__enter__", 0);

  /* "rasterio/_base.pyx":247
 * 
 *     def __enter__(self):
 *         log.debug("Entering Dataset %r context.", self)             # <<<<<<<<<<<<<<
 *         return self
 * 
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 247, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_debug); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 247, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
      __pyx_t_4 = 1;
    }
  }
  __pyx_t_5 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 247, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (__pyx_t_2) {
    __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2); __pyx_t_2 = NULL;
  }
  __Pyx_INCREF(__pyx_kp_s_Entering_Dataset_r_context);
  __Pyx_GIVEREF(__pyx_kp_s_Entering_Dataset_r_context);
  PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, __pyx_kp_s_Entering_Dataset_r_context);
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
  PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, ((PyObject *)__pyx_v_self));
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 247, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":248
 *     def __enter__(self):
 *         log.debug("Entering Dataset %r context.", self)
 *         return self             # <<<<<<<<<<<<<<
 * 
 *     def __exit__(self, type, value, traceback):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __pyx_r = ((PyObject *)__pyx_v_self);
  goto __pyx_L0;

  /* "rasterio/_base.pyx":246
 * 
 * 
 *     def __enter__(self):             # <<<<<<<<<<<<<<
 *         log.debug("Entering Dataset %r context.", self)
 *         return self
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.__enter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":250
 *         return self
 * 
 *     def __exit__(self, type, value, traceback):             # <<<<<<<<<<<<<<
 *         self.close()
 *         log.debug("Exited Dataset %r context.", self)
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_21__exit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_21__exit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  CYTHON_UNUSED PyObject *__pyx_v_type = 0;
  CYTHON_UNUSED PyObject *__pyx_v_value = 0;
  CYTHON_UNUSED PyObject *__pyx_v_traceback = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__exit__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_type,&__pyx_n_s_value,&__pyx_n_s_traceback,0};
    PyObject* values[3] = {0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_type)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_value)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__exit__", 1, 3, 3, 1); __PYX_ERR(0, 250, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_traceback)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__exit__", 1, 3, 3, 2); __PYX_ERR(0, 250, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__exit__") < 0)) __PYX_ERR(0, 250, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
    }
    __pyx_v_type = values[0];
    __pyx_v_value = values[1];
    __pyx_v_traceback = values[2];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__exit__", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 250, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.__exit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_20__exit__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), __pyx_v_type, __pyx_v_value, __pyx_v_traceback);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_20__exit__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_type, CYTHON_UNUSED PyObject *__pyx_v_value, CYTHON_UNUSED PyObject *__pyx_v_traceback) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannySetupContext("__exit__", 0);

  /* "rasterio/_base.pyx":251
 * 
 *     def __exit__(self, type, value, traceback):
 *         self.close()             # <<<<<<<<<<<<<<
 *         log.debug("Exited Dataset %r context.", self)
 * 
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_close); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 251, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 251, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 251, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":252
 *     def __exit__(self, type, value, traceback):
 *         self.close()
 *         log.debug("Exited Dataset %r context.", self)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 252, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_debug); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 252, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
      __pyx_t_4 = 1;
    }
  }
  __pyx_t_5 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 252, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (__pyx_t_2) {
    __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2); __pyx_t_2 = NULL;
  }
  __Pyx_INCREF(__pyx_kp_s_Exited_Dataset_r_context);
  __Pyx_GIVEREF(__pyx_kp_s_Exited_Dataset_r_context);
  PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, __pyx_kp_s_Exited_Dataset_r_context);
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
  PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, ((PyObject *)__pyx_v_self));
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 252, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":250
 *         return self
 * 
 *     def __exit__(self, type, value, traceback):             # <<<<<<<<<<<<<<
 *         self.close()
 *         log.debug("Exited Dataset %r context.", self)
 */

  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.__exit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":255
 * 
 * 
 *     def __dealloc__(self):             # <<<<<<<<<<<<<<
 *         if self._hds != NULL:
 *             _gdal.GDALClose(self._hds)
 */

/* Python wrapper */
static void __pyx_pw_8rasterio_5_base_13DatasetReader_23__dealloc__(PyObject *__pyx_v_self); /*proto*/
static void __pyx_pw_8rasterio_5_base_13DatasetReader_23__dealloc__(PyObject *__pyx_v_self) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
  __pyx_pf_8rasterio_5_base_13DatasetReader_22__dealloc__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
}

static void __pyx_pf_8rasterio_5_base_13DatasetReader_22__dealloc__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  __Pyx_RefNannySetupContext("__dealloc__", 0);

  /* "rasterio/_base.pyx":256
 * 
 *     def __dealloc__(self):
 *         if self._hds != NULL:             # <<<<<<<<<<<<<<
 *             _gdal.GDALClose(self._hds)
 * 
 */
  __pyx_t_1 = ((__pyx_v_self->_hds != NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":257
 *     def __dealloc__(self):
 *         if self._hds != NULL:
 *             _gdal.GDALClose(self._hds)             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
    GDALClose(__pyx_v_self->_hds);

    /* "rasterio/_base.pyx":256
 * 
 *     def __dealloc__(self):
 *         if self._hds != NULL:             # <<<<<<<<<<<<<<
 *             _gdal.GDALClose(self._hds)
 * 
 */
  }

  /* "rasterio/_base.pyx":255
 * 
 * 
 *     def __dealloc__(self):             # <<<<<<<<<<<<<<
 *         if self._hds != NULL:
 *             _gdal.GDALClose(self._hds)
 */

  /* function exit code */
  __Pyx_RefNannyFinishContext();
}

/* "rasterio/_base.pyx":260
 * 
 *     @property
 *     def closed(self):             # <<<<<<<<<<<<<<
 *         return self._closed
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6closed_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6closed_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6closed___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6closed___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":261
 *     @property
 *     def closed(self):
 *         return self._closed             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_closed);
  __pyx_r = __pyx_v_self->_closed;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":260
 * 
 *     @property
 *     def closed(self):             # <<<<<<<<<<<<<<
 *         return self._closed
 * 
 */

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":264
 * 
 *     @property
 *     def count(self):             # <<<<<<<<<<<<<<
 *         if not self._count:
 *             if self._hds == NULL:
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_5count_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_5count_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_5count___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_5count___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":265
 *     @property
 *     def count(self):
 *         if not self._count:             # <<<<<<<<<<<<<<
 *             if self._hds == NULL:
 *                 raise ValueError("Can't read closed raster file")
 */
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_self->_count); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 265, __pyx_L1_error)
  __pyx_t_2 = ((!__pyx_t_1) != 0);
  if (__pyx_t_2) {

    /* "rasterio/_base.pyx":266
 *     def count(self):
 *         if not self._count:
 *             if self._hds == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("Can't read closed raster file")
 *             self._count = _gdal.GDALGetRasterCount(self._hds)
 */
    __pyx_t_2 = ((__pyx_v_self->_hds == NULL) != 0);
    if (__pyx_t_2) {

      /* "rasterio/_base.pyx":267
 *         if not self._count:
 *             if self._hds == NULL:
 *                 raise ValueError("Can't read closed raster file")             # <<<<<<<<<<<<<<
 *             self._count = _gdal.GDALGetRasterCount(self._hds)
 *         return self._count
 */
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 267, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __PYX_ERR(0, 267, __pyx_L1_error)

      /* "rasterio/_base.pyx":266
 *     def count(self):
 *         if not self._count:
 *             if self._hds == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("Can't read closed raster file")
 *             self._count = _gdal.GDALGetRasterCount(self._hds)
 */
    }

    /* "rasterio/_base.pyx":268
 *             if self._hds == NULL:
 *                 raise ValueError("Can't read closed raster file")
 *             self._count = _gdal.GDALGetRasterCount(self._hds)             # <<<<<<<<<<<<<<
 *         return self._count
 * 
 */
    __pyx_t_3 = __Pyx_PyInt_From_int(GDALGetRasterCount(__pyx_v_self->_hds)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 268, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_GIVEREF(__pyx_t_3);
    __Pyx_GOTREF(__pyx_v_self->_count);
    __Pyx_DECREF(__pyx_v_self->_count);
    __pyx_v_self->_count = __pyx_t_3;
    __pyx_t_3 = 0;

    /* "rasterio/_base.pyx":265
 *     @property
 *     def count(self):
 *         if not self._count:             # <<<<<<<<<<<<<<
 *             if self._hds == NULL:
 *                 raise ValueError("Can't read closed raster file")
 */
  }

  /* "rasterio/_base.pyx":269
 *                 raise ValueError("Can't read closed raster file")
 *             self._count = _gdal.GDALGetRasterCount(self._hds)
 *         return self._count             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_count);
  __pyx_r = __pyx_v_self->_count;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":264
 * 
 *     @property
 *     def count(self):             # <<<<<<<<<<<<<<
 *         if not self._count:
 *             if self._hds == NULL:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.count.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":272
 * 
 *     @property
 *     def indexes(self):             # <<<<<<<<<<<<<<
 *         return tuple(range(1, self.count+1))
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7indexes_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7indexes_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_7indexes___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7indexes___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":273
 *     @property
 *     def indexes(self):
 *         return tuple(range(1, self.count+1))             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_count); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 273, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_AddObjC(__pyx_t_1, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 273, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 273, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_int_1);
  __Pyx_GIVEREF(__pyx_int_1);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_int_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 273, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PySequence_Tuple(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 273, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":272
 * 
 *     @property
 *     def indexes(self):             # <<<<<<<<<<<<<<
 *         return tuple(range(1, self.count+1))
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.indexes.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":276
 * 
 *     @property
 *     def dtypes(self):             # <<<<<<<<<<<<<<
 *         """Returns an ordered tuple of all band data types."""
 *         cdef void *hband = NULL
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6dtypes_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6dtypes_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6dtypes___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6dtypes___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  void *__pyx_v_hband;
  PyObject *__pyx_v_i = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  Py_ssize_t __pyx_t_5;
  PyObject *(*__pyx_t_6)(PyObject *);
  int __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  int __pyx_t_9;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":278
 *     def dtypes(self):
 *         """Returns an ordered tuple of all band data types."""
 *         cdef void *hband = NULL             # <<<<<<<<<<<<<<
 *         if not self._dtypes:
 *             if self._hds == NULL:
 */
  __pyx_v_hband = NULL;

  /* "rasterio/_base.pyx":279
 *         """Returns an ordered tuple of all band data types."""
 *         cdef void *hband = NULL
 *         if not self._dtypes:             # <<<<<<<<<<<<<<
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 */
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_self->_dtypes); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 279, __pyx_L1_error)
  __pyx_t_2 = ((!__pyx_t_1) != 0);
  if (__pyx_t_2) {

    /* "rasterio/_base.pyx":280
 *         cdef void *hband = NULL
 *         if not self._dtypes:
 *             if self._hds == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):
 */
    __pyx_t_2 = ((__pyx_v_self->_hds == NULL) != 0);
    if (__pyx_t_2) {

      /* "rasterio/_base.pyx":281
 *         if not self._dtypes:
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 */
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__22, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 281, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __PYX_ERR(0, 281, __pyx_L1_error)

      /* "rasterio/_base.pyx":280
 *         cdef void *hband = NULL
 *         if not self._dtypes:
 *             if self._hds == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):
 */
    }

    /* "rasterio/_base.pyx":282
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 self._dtypes.append(
 */
    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 282, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_v_self->_count);
    __Pyx_GIVEREF(__pyx_v_self->_count);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_self->_count);
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 282, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (likely(PyList_CheckExact(__pyx_t_4)) || PyTuple_CheckExact(__pyx_t_4)) {
      __pyx_t_3 = __pyx_t_4; __Pyx_INCREF(__pyx_t_3); __pyx_t_5 = 0;
      __pyx_t_6 = NULL;
    } else {
      __pyx_t_5 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 282, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_6 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 282, __pyx_L1_error)
    }
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    for (;;) {
      if (likely(!__pyx_t_6)) {
        if (likely(PyList_CheckExact(__pyx_t_3))) {
          if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_3)) break;
          #if CYTHON_COMPILING_IN_CPYTHON
          __pyx_t_4 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(0, 282, __pyx_L1_error)
          #else
          __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 282, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_4);
          #endif
        } else {
          if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
          #if CYTHON_COMPILING_IN_CPYTHON
          __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(0, 282, __pyx_L1_error)
          #else
          __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 282, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_4);
          #endif
        }
      } else {
        __pyx_t_4 = __pyx_t_6(__pyx_t_3);
        if (unlikely(!__pyx_t_4)) {
          PyObject* exc_type = PyErr_Occurred();
          if (exc_type) {
            if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
            else __PYX_ERR(0, 282, __pyx_L1_error)
          }
          break;
        }
        __Pyx_GOTREF(__pyx_t_4);
      }
      __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_4);
      __pyx_t_4 = 0;

      /* "rasterio/_base.pyx":283
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)             # <<<<<<<<<<<<<<
 *                 self._dtypes.append(
 *                     dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)])
 */
      __pyx_t_4 = __Pyx_PyInt_AddObjC(__pyx_v_i, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 283, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 283, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_v_hband = GDALGetRasterBand(__pyx_v_self->_hds, __pyx_t_7);

      /* "rasterio/_base.pyx":285
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 self._dtypes.append(
 *                     dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)])             # <<<<<<<<<<<<<<
 *         return tuple(self._dtypes)
 * 
 */
      __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_dtypes); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 285, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_dtype_fwd); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 285, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_7 = GDALGetRasterDataType(__pyx_v_hband);
      __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_8, __pyx_t_7, int, 1, __Pyx_PyInt_From_int, 0, 1, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 285, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;

      /* "rasterio/_base.pyx":284
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 self._dtypes.append(             # <<<<<<<<<<<<<<
 *                     dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)])
 *         return tuple(self._dtypes)
 */
      __pyx_t_9 = __Pyx_PyObject_Append(__pyx_v_self->_dtypes, __pyx_t_4); if (unlikely(__pyx_t_9 == -1)) __PYX_ERR(0, 284, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;

      /* "rasterio/_base.pyx":282
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 self._dtypes.append(
 */
    }
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

    /* "rasterio/_base.pyx":279
 *         """Returns an ordered tuple of all band data types."""
 *         cdef void *hband = NULL
 *         if not self._dtypes:             # <<<<<<<<<<<<<<
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 */
  }

  /* "rasterio/_base.pyx":286
 *                 self._dtypes.append(
 *                     dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)])
 *         return tuple(self._dtypes)             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = PySequence_Tuple(__pyx_v_self->_dtypes); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 286, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":276
 * 
 *     @property
 *     def dtypes(self):             # <<<<<<<<<<<<<<
 *         """Returns an ordered tuple of all band data types."""
 *         cdef void *hband = NULL
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.dtypes.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_i);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":289
 * 
 *     @property
 *     def block_shapes(self):             # <<<<<<<<<<<<<<
 *         """Returns an ordered list of block shapes for all bands.
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_12block_shapes_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_12block_shapes_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_12block_shapes___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_12block_shapes___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  void *__pyx_v_hband;
  int __pyx_v_xsize;
  int __pyx_v_ysize;
  PyObject *__pyx_v_i = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  Py_ssize_t __pyx_t_5;
  PyObject *(*__pyx_t_6)(PyObject *);
  int __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  int __pyx_t_10;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":295
 *         shape: (count of image rows, count of image columns).
 *         """
 *         cdef void *hband = NULL             # <<<<<<<<<<<<<<
 *         cdef int xsize, ysize
 *         if self._block_shapes is None:
 */
  __pyx_v_hband = NULL;

  /* "rasterio/_base.pyx":297
 *         cdef void *hband = NULL
 *         cdef int xsize, ysize
 *         if self._block_shapes is None:             # <<<<<<<<<<<<<<
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 */
  __pyx_t_1 = (__pyx_v_self->_block_shapes == Py_None);
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "rasterio/_base.pyx":298
 *         cdef int xsize, ysize
 *         if self._block_shapes is None:
 *             if self._hds == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("can't read closed raster file")
 *             self._block_shapes = []
 */
    __pyx_t_2 = ((__pyx_v_self->_hds == NULL) != 0);
    if (__pyx_t_2) {

      /* "rasterio/_base.pyx":299
 *         if self._block_shapes is None:
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *             self._block_shapes = []
 *             for i in range(self._count):
 */
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 299, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __PYX_ERR(0, 299, __pyx_L1_error)

      /* "rasterio/_base.pyx":298
 *         cdef int xsize, ysize
 *         if self._block_shapes is None:
 *             if self._hds == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("can't read closed raster file")
 *             self._block_shapes = []
 */
    }

    /* "rasterio/_base.pyx":300
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 *             self._block_shapes = []             # <<<<<<<<<<<<<<
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 */
    __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 300, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_GIVEREF(__pyx_t_3);
    __Pyx_GOTREF(__pyx_v_self->_block_shapes);
    __Pyx_DECREF(__pyx_v_self->_block_shapes);
    __pyx_v_self->_block_shapes = __pyx_t_3;
    __pyx_t_3 = 0;

    /* "rasterio/_base.pyx":301
 *                 raise ValueError("can't read closed raster file")
 *             self._block_shapes = []
 *             for i in range(self._count):             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:
 */
    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 301, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_v_self->_count);
    __Pyx_GIVEREF(__pyx_v_self->_count);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_self->_count);
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 301, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (likely(PyList_CheckExact(__pyx_t_4)) || PyTuple_CheckExact(__pyx_t_4)) {
      __pyx_t_3 = __pyx_t_4; __Pyx_INCREF(__pyx_t_3); __pyx_t_5 = 0;
      __pyx_t_6 = NULL;
    } else {
      __pyx_t_5 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 301, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_6 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 301, __pyx_L1_error)
    }
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    for (;;) {
      if (likely(!__pyx_t_6)) {
        if (likely(PyList_CheckExact(__pyx_t_3))) {
          if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_3)) break;
          #if CYTHON_COMPILING_IN_CPYTHON
          __pyx_t_4 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(0, 301, __pyx_L1_error)
          #else
          __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 301, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_4);
          #endif
        } else {
          if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
          #if CYTHON_COMPILING_IN_CPYTHON
          __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(0, 301, __pyx_L1_error)
          #else
          __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 301, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_4);
          #endif
        }
      } else {
        __pyx_t_4 = __pyx_t_6(__pyx_t_3);
        if (unlikely(!__pyx_t_4)) {
          PyObject* exc_type = PyErr_Occurred();
          if (exc_type) {
            if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
            else __PYX_ERR(0, 301, __pyx_L1_error)
          }
          break;
        }
        __Pyx_GOTREF(__pyx_t_4);
      }
      __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_4);
      __pyx_t_4 = 0;

      /* "rasterio/_base.pyx":302
 *             self._block_shapes = []
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)             # <<<<<<<<<<<<<<
 *                 if hband == NULL:
 *                     raise ValueError("Null band")
 */
      __pyx_t_4 = __Pyx_PyInt_AddObjC(__pyx_v_i, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 302, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 302, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_v_hband = GDALGetRasterBand(__pyx_v_self->_hds, __pyx_t_7);

      /* "rasterio/_base.pyx":303
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:             # <<<<<<<<<<<<<<
 *                     raise ValueError("Null band")
 *                 _gdal.GDALGetBlockSize(hband, &xsize, &ysize)
 */
      __pyx_t_2 = ((__pyx_v_hband == NULL) != 0);
      if (__pyx_t_2) {

        /* "rasterio/_base.pyx":304
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:
 *                     raise ValueError("Null band")             # <<<<<<<<<<<<<<
 *                 _gdal.GDALGetBlockSize(hband, &xsize, &ysize)
 *                 self._block_shapes.append((ysize, xsize))
 */
        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 304, __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(0, 304, __pyx_L1_error)

        /* "rasterio/_base.pyx":303
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:             # <<<<<<<<<<<<<<
 *                     raise ValueError("Null band")
 *                 _gdal.GDALGetBlockSize(hband, &xsize, &ysize)
 */
      }

      /* "rasterio/_base.pyx":305
 *                 if hband == NULL:
 *                     raise ValueError("Null band")
 *                 _gdal.GDALGetBlockSize(hband, &xsize, &ysize)             # <<<<<<<<<<<<<<
 *                 self._block_shapes.append((ysize, xsize))
 *         return tuple(self._block_shapes)
 */
      GDALGetBlockSize(__pyx_v_hband, (&__pyx_v_xsize), (&__pyx_v_ysize));

      /* "rasterio/_base.pyx":306
 *                     raise ValueError("Null band")
 *                 _gdal.GDALGetBlockSize(hband, &xsize, &ysize)
 *                 self._block_shapes.append((ysize, xsize))             # <<<<<<<<<<<<<<
 *         return tuple(self._block_shapes)
 * 
 */
      __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_ysize); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 306, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_xsize); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 306, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 306, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_GIVEREF(__pyx_t_4);
      PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_4);
      __Pyx_GIVEREF(__pyx_t_8);
      PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8);
      __pyx_t_4 = 0;
      __pyx_t_8 = 0;
      __pyx_t_10 = __Pyx_PyObject_Append(__pyx_v_self->_block_shapes, __pyx_t_9); if (unlikely(__pyx_t_10 == -1)) __PYX_ERR(0, 306, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

      /* "rasterio/_base.pyx":301
 *                 raise ValueError("can't read closed raster file")
 *             self._block_shapes = []
 *             for i in range(self._count):             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:
 */
    }
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

    /* "rasterio/_base.pyx":297
 *         cdef void *hband = NULL
 *         cdef int xsize, ysize
 *         if self._block_shapes is None:             # <<<<<<<<<<<<<<
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 */
  }

  /* "rasterio/_base.pyx":307
 *                 _gdal.GDALGetBlockSize(hband, &xsize, &ysize)
 *                 self._block_shapes.append((ysize, xsize))
 *         return tuple(self._block_shapes)             # <<<<<<<<<<<<<<
 * 
 *     def get_nodatavals(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = PySequence_Tuple(__pyx_v_self->_block_shapes); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 307, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":289
 * 
 *     @property
 *     def block_shapes(self):             # <<<<<<<<<<<<<<
 *         """Returns an ordered list of block shapes for all bands.
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.block_shapes.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_i);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":309
 *         return tuple(self._block_shapes)
 * 
 *     def get_nodatavals(self):             # <<<<<<<<<<<<<<
 *         cdef void *hband = NULL
 *         cdef double nodataval
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_25get_nodatavals(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_25get_nodatavals(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("get_nodatavals (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_24get_nodatavals(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_24get_nodatavals(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  void *__pyx_v_hband;
  double __pyx_v_nodataval;
  int __pyx_v_success;
  PyObject *__pyx_v_i = NULL;
  PyObject *__pyx_v_dtype = NULL;
  PyObject *__pyx_v_val = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  Py_ssize_t __pyx_t_5;
  PyObject *(*__pyx_t_6)(PyObject *);
  int __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *__pyx_t_10 = NULL;
  PyObject *__pyx_t_11 = NULL;
  Py_ssize_t __pyx_t_12;
  PyObject *__pyx_t_13 = NULL;
  int __pyx_t_14;
  __Pyx_RefNannySetupContext("get_nodatavals", 0);

  /* "rasterio/_base.pyx":310
 * 
 *     def get_nodatavals(self):
 *         cdef void *hband = NULL             # <<<<<<<<<<<<<<
 *         cdef double nodataval
 *         cdef int success = 0
 */
  __pyx_v_hband = NULL;

  /* "rasterio/_base.pyx":312
 *         cdef void *hband = NULL
 *         cdef double nodataval
 *         cdef int success = 0             # <<<<<<<<<<<<<<
 * 
 *         if not self._nodatavals:
 */
  __pyx_v_success = 0;

  /* "rasterio/_base.pyx":314
 *         cdef int success = 0
 * 
 *         if not self._nodatavals:             # <<<<<<<<<<<<<<
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 */
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_self->_nodatavals); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 314, __pyx_L1_error)
  __pyx_t_2 = ((!__pyx_t_1) != 0);
  if (__pyx_t_2) {

    /* "rasterio/_base.pyx":315
 * 
 *         if not self._nodatavals:
 *             if self._hds == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):
 */
    __pyx_t_2 = ((__pyx_v_self->_hds == NULL) != 0);
    if (__pyx_t_2) {

      /* "rasterio/_base.pyx":316
 *         if not self._nodatavals:
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 */
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__25, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 316, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __PYX_ERR(0, 316, __pyx_L1_error)

      /* "rasterio/_base.pyx":315
 * 
 *         if not self._nodatavals:
 *             if self._hds == NULL:             # <<<<<<<<<<<<<<
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):
 */
    }

    /* "rasterio/_base.pyx":317
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:
 */
    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 317, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_v_self->_count);
    __Pyx_GIVEREF(__pyx_v_self->_count);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_self->_count);
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 317, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (likely(PyList_CheckExact(__pyx_t_4)) || PyTuple_CheckExact(__pyx_t_4)) {
      __pyx_t_3 = __pyx_t_4; __Pyx_INCREF(__pyx_t_3); __pyx_t_5 = 0;
      __pyx_t_6 = NULL;
    } else {
      __pyx_t_5 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 317, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_6 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 317, __pyx_L1_error)
    }
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    for (;;) {
      if (likely(!__pyx_t_6)) {
        if (likely(PyList_CheckExact(__pyx_t_3))) {
          if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_3)) break;
          #if CYTHON_COMPILING_IN_CPYTHON
          __pyx_t_4 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(0, 317, __pyx_L1_error)
          #else
          __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 317, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_4);
          #endif
        } else {
          if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
          #if CYTHON_COMPILING_IN_CPYTHON
          __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(0, 317, __pyx_L1_error)
          #else
          __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 317, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_4);
          #endif
        }
      } else {
        __pyx_t_4 = __pyx_t_6(__pyx_t_3);
        if (unlikely(!__pyx_t_4)) {
          PyObject* exc_type = PyErr_Occurred();
          if (exc_type) {
            if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
            else __PYX_ERR(0, 317, __pyx_L1_error)
          }
          break;
        }
        __Pyx_GOTREF(__pyx_t_4);
      }
      __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_4);
      __pyx_t_4 = 0;

      /* "rasterio/_base.pyx":318
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)             # <<<<<<<<<<<<<<
 *                 if hband == NULL:
 *                     raise ValueError("Null band")
 */
      __pyx_t_4 = __Pyx_PyInt_AddObjC(__pyx_v_i, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 318, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 318, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_v_hband = GDALGetRasterBand(__pyx_v_self->_hds, __pyx_t_7);

      /* "rasterio/_base.pyx":319
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:             # <<<<<<<<<<<<<<
 *                     raise ValueError("Null band")
 *                 dtype = dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)]
 */
      __pyx_t_2 = ((__pyx_v_hband == NULL) != 0);
      if (__pyx_t_2) {

        /* "rasterio/_base.pyx":320
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:
 *                     raise ValueError("Null band")             # <<<<<<<<<<<<<<
 *                 dtype = dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)]
 *                 nodataval = _gdal.GDALGetRasterNoDataValue(hband, &success)
 */
        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__26, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 320, __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(0, 320, __pyx_L1_error)

        /* "rasterio/_base.pyx":319
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:             # <<<<<<<<<<<<<<
 *                     raise ValueError("Null band")
 *                 dtype = dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)]
 */
      }

      /* "rasterio/_base.pyx":321
 *                 if hband == NULL:
 *                     raise ValueError("Null band")
 *                 dtype = dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)]             # <<<<<<<<<<<<<<
 *                 nodataval = _gdal.GDALGetRasterNoDataValue(hband, &success)
 *                 val = nodataval
 */
      __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_dtypes); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 321, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_dtype_fwd); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 321, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_7 = GDALGetRasterDataType(__pyx_v_hband);
      __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_8, __pyx_t_7, int, 1, __Pyx_PyInt_From_int, 0, 1, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 321, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_XDECREF_SET(__pyx_v_dtype, __pyx_t_4);
      __pyx_t_4 = 0;

      /* "rasterio/_base.pyx":322
 *                     raise ValueError("Null band")
 *                 dtype = dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)]
 *                 nodataval = _gdal.GDALGetRasterNoDataValue(hband, &success)             # <<<<<<<<<<<<<<
 *                 val = nodataval
 *                 # GDALGetRasterNoDataValue() has two ways of telling you that
 */
      __pyx_v_nodataval = GDALGetRasterNoDataValue(__pyx_v_hband, (&__pyx_v_success));

      /* "rasterio/_base.pyx":323
 *                 dtype = dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)]
 *                 nodataval = _gdal.GDALGetRasterNoDataValue(hband, &success)
 *                 val = nodataval             # <<<<<<<<<<<<<<
 *                 # GDALGetRasterNoDataValue() has two ways of telling you that
 *                 # there's no nodata value. The success flag might come back
 */
      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_nodataval); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 323, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_4);
      __pyx_t_4 = 0;

      /* "rasterio/_base.pyx":330
 *                 # data type. If so, the band has a nodata value. If not,
 *                 # there's no nodata value.
 *                 if (success == 0 or             # <<<<<<<<<<<<<<
 *                         val < dtypes.dtype_ranges[dtype][0] or
 *                         val > dtypes.dtype_ranges[dtype][1]):
 */
      __pyx_t_1 = ((__pyx_v_success == 0) != 0);
      if (!__pyx_t_1) {
      } else {
        __pyx_t_2 = __pyx_t_1;
        goto __pyx_L9_bool_binop_done;
      }

      /* "rasterio/_base.pyx":331
 *                 # there's no nodata value.
 *                 if (success == 0 or
 *                         val < dtypes.dtype_ranges[dtype][0] or             # <<<<<<<<<<<<<<
 *                         val > dtypes.dtype_ranges[dtype][1]):
 *                     val = None
 */
      __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_dtypes); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 331, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_dtype_ranges); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 331, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = PyObject_GetItem(__pyx_t_8, __pyx_v_dtype); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 331, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_4, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 331, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = PyObject_RichCompare(__pyx_v_val, __pyx_t_8, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 331, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 331, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      if (!__pyx_t_1) {
      } else {
        __pyx_t_2 = __pyx_t_1;
        goto __pyx_L9_bool_binop_done;
      }

      /* "rasterio/_base.pyx":332
 *                 if (success == 0 or
 *                         val < dtypes.dtype_ranges[dtype][0] or
 *                         val > dtypes.dtype_ranges[dtype][1]):             # <<<<<<<<<<<<<<
 *                     val = None
 *                 log.debug(
 */
      __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_dtypes); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 332, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_dtype_ranges); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 332, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = PyObject_GetItem(__pyx_t_8, __pyx_v_dtype); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 332, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_4, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 332, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = PyObject_RichCompare(__pyx_v_val, __pyx_t_8, Py_GT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 332, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 332, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_2 = __pyx_t_1;
      __pyx_L9_bool_binop_done:;

      /* "rasterio/_base.pyx":330
 *                 # data type. If so, the band has a nodata value. If not,
 *                 # there's no nodata value.
 *                 if (success == 0 or             # <<<<<<<<<<<<<<
 *                         val < dtypes.dtype_ranges[dtype][0] or
 *                         val > dtypes.dtype_ranges[dtype][1]):
 */
      if (__pyx_t_2) {

        /* "rasterio/_base.pyx":333
 *                         val < dtypes.dtype_ranges[dtype][0] or
 *                         val > dtypes.dtype_ranges[dtype][1]):
 *                     val = None             # <<<<<<<<<<<<<<
 *                 log.debug(
 *                     "Nodata success: %d, Nodata value: %f", success, nodataval)
 */
        __Pyx_INCREF(Py_None);
        __Pyx_DECREF_SET(__pyx_v_val, Py_None);

        /* "rasterio/_base.pyx":330
 *                 # data type. If so, the band has a nodata value. If not,
 *                 # there's no nodata value.
 *                 if (success == 0 or             # <<<<<<<<<<<<<<
 *                         val < dtypes.dtype_ranges[dtype][0] or
 *                         val > dtypes.dtype_ranges[dtype][1]):
 */
      }

      /* "rasterio/_base.pyx":334
 *                         val > dtypes.dtype_ranges[dtype][1]):
 *                     val = None
 *                 log.debug(             # <<<<<<<<<<<<<<
 *                     "Nodata success: %d, Nodata value: %f", success, nodataval)
 *                 self._nodatavals.append(val)
 */
      __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 334, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_debug); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 334, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;

      /* "rasterio/_base.pyx":335
 *                     val = None
 *                 log.debug(
 *                     "Nodata success: %d, Nodata value: %f", success, nodataval)             # <<<<<<<<<<<<<<
 *                 self._nodatavals.append(val)
 * 
 */
      __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_success); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 335, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_10 = PyFloat_FromDouble(__pyx_v_nodataval); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 335, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_10);
      __pyx_t_11 = NULL;
      __pyx_t_12 = 0;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_9))) {
        __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_9);
        if (likely(__pyx_t_11)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
          __Pyx_INCREF(__pyx_t_11);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_9, function);
          __pyx_t_12 = 1;
        }
      }
      __pyx_t_13 = PyTuple_New(3+__pyx_t_12); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 334, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_13);
      if (__pyx_t_11) {
        __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_11); __pyx_t_11 = NULL;
      }
      __Pyx_INCREF(__pyx_kp_s_Nodata_success_d_Nodata_value_f);
      __Pyx_GIVEREF(__pyx_kp_s_Nodata_success_d_Nodata_value_f);
      PyTuple_SET_ITEM(__pyx_t_13, 0+__pyx_t_12, __pyx_kp_s_Nodata_success_d_Nodata_value_f);
      __Pyx_GIVEREF(__pyx_t_8);
      PyTuple_SET_ITEM(__pyx_t_13, 1+__pyx_t_12, __pyx_t_8);
      __Pyx_GIVEREF(__pyx_t_10);
      PyTuple_SET_ITEM(__pyx_t_13, 2+__pyx_t_12, __pyx_t_10);
      __pyx_t_8 = 0;
      __pyx_t_10 = 0;
      __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_13, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 334, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;

      /* "rasterio/_base.pyx":336
 *                 log.debug(
 *                     "Nodata success: %d, Nodata value: %f", success, nodataval)
 *                 self._nodatavals.append(val)             # <<<<<<<<<<<<<<
 * 
 *         return tuple(self._nodatavals)
 */
      __pyx_t_14 = __Pyx_PyObject_Append(__pyx_v_self->_nodatavals, __pyx_v_val); if (unlikely(__pyx_t_14 == -1)) __PYX_ERR(0, 336, __pyx_L1_error)

      /* "rasterio/_base.pyx":317
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 *             for i in range(self._count):             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:
 */
    }
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

    /* "rasterio/_base.pyx":314
 *         cdef int success = 0
 * 
 *         if not self._nodatavals:             # <<<<<<<<<<<<<<
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")
 */
  }

  /* "rasterio/_base.pyx":338
 *                 self._nodatavals.append(val)
 * 
 *         return tuple(self._nodatavals)             # <<<<<<<<<<<<<<
 * 
 *     property nodatavals:
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = PySequence_Tuple(__pyx_v_self->_nodatavals); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 338, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":309
 *         return tuple(self._block_shapes)
 * 
 *     def get_nodatavals(self):             # <<<<<<<<<<<<<<
 *         cdef void *hband = NULL
 *         cdef double nodataval
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.get_nodatavals", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_i);
  __Pyx_XDECREF(__pyx_v_dtype);
  __Pyx_XDECREF(__pyx_v_val);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":343
 *         """Nodata values for each band."""
 * 
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             return self.get_nodatavals()
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_10nodatavals_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_10nodatavals_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_10nodatavals___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_10nodatavals___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":344
 * 
 *         def __get__(self):
 *             return self.get_nodatavals()             # <<<<<<<<<<<<<<
 * 
 *     property nodata:
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_nodatavals); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 344, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 344, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 344, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":343
 *         """Nodata values for each band."""
 * 
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             return self.get_nodatavals()
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.nodatavals.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":348
 *     property nodata:
 *         """The dataset's single nodata value."""
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             if self.count == 0:
 *                 return None
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6nodata_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6nodata_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6nodata___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6nodata___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":349
 *         """The dataset's single nodata value."""
 *         def __get__(self):
 *             if self.count == 0:             # <<<<<<<<<<<<<<
 *                 return None
 *             return self.nodatavals[0]
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_count); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 349, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_EqObjC(__pyx_t_1, __pyx_int_0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 349, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 349, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (__pyx_t_3) {

    /* "rasterio/_base.pyx":350
 *         def __get__(self):
 *             if self.count == 0:
 *                 return None             # <<<<<<<<<<<<<<
 *             return self.nodatavals[0]
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(Py_None);
    __pyx_r = Py_None;
    goto __pyx_L0;

    /* "rasterio/_base.pyx":349
 *         """The dataset's single nodata value."""
 *         def __get__(self):
 *             if self.count == 0:             # <<<<<<<<<<<<<<
 *                 return None
 *             return self.nodatavals[0]
 */
  }

  /* "rasterio/_base.pyx":351
 *             if self.count == 0:
 *                 return None
 *             return self.nodatavals[0]             # <<<<<<<<<<<<<<
 * 
 *     property mask_flags:
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_nodatavals); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 351, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 351, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":348
 *     property nodata:
 *         """The dataset's single nodata value."""
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             if self.count == 0:
 *                 return None
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.nodata.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":356
 *         """Mask flags for each band."""
 * 
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             flags = [0]*self.count
 *             for i, j in zip(range(self.count), self.indexes):
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_10mask_flags_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_10mask_flags_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_10mask_flags___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_10mask_flags___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_v_flags = NULL;
  PyObject *__pyx_v_i = NULL;
  PyObject *__pyx_v_j = NULL;
  void *__pyx_v_hband;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  PyObject *(*__pyx_t_5)(PyObject *);
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *(*__pyx_t_8)(PyObject *);
  int __pyx_t_9;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":357
 * 
 *         def __get__(self):
 *             flags = [0]*self.count             # <<<<<<<<<<<<<<
 *             for i, j in zip(range(self.count), self.indexes):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, j)
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_count); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 357, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 357, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_int_0);
  __Pyx_GIVEREF(__pyx_int_0);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_int_0);
  { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_temp)) __PYX_ERR(0, 357, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_temp);
    __Pyx_DECREF(__pyx_t_2);
    __pyx_t_2 = __pyx_temp;
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_flags = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":358
 *         def __get__(self):
 *             flags = [0]*self.count
 *             for i, j in zip(range(self.count), self.indexes):             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, j)
 *                 flags[i] = _gdal.GDALGetMaskFlags(hband)
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_count); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 358, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 358, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 358, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_indexes); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 358, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 358, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1);
  __pyx_t_2 = 0;
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_zip, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 358, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (likely(PyList_CheckExact(__pyx_t_1)) || PyTuple_CheckExact(__pyx_t_1)) {
    __pyx_t_3 = __pyx_t_1; __Pyx_INCREF(__pyx_t_3); __pyx_t_4 = 0;
    __pyx_t_5 = NULL;
  } else {
    __pyx_t_4 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 358, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_5 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 358, __pyx_L1_error)
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  for (;;) {
    if (likely(!__pyx_t_5)) {
      if (likely(PyList_CheckExact(__pyx_t_3))) {
        if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_3)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++; if (unlikely(0 < 0)) __PYX_ERR(0, 358, __pyx_L1_error)
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 358, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        #endif
      } else {
        if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++; if (unlikely(0 < 0)) __PYX_ERR(0, 358, __pyx_L1_error)
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 358, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        #endif
      }
    } else {
      __pyx_t_1 = __pyx_t_5(__pyx_t_3);
      if (unlikely(!__pyx_t_1)) {
        PyObject* exc_type = PyErr_Occurred();
        if (exc_type) {
          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
          else __PYX_ERR(0, 358, __pyx_L1_error)
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_1);
    }
    if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
      PyObject* sequence = __pyx_t_1;
      #if CYTHON_COMPILING_IN_CPYTHON
      Py_ssize_t size = Py_SIZE(sequence);
      #else
      Py_ssize_t size = PySequence_Size(sequence);
      #endif
      if (unlikely(size != 2)) {
        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
        __PYX_ERR(0, 358, __pyx_L1_error)
      }
      #if CYTHON_COMPILING_IN_CPYTHON
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
        __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
      }
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_6);
      #else
      __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 358, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 358, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      #endif
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    } else {
      Py_ssize_t index = -1;
      __pyx_t_7 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 358, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
      index = 0; __pyx_t_2 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_2)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_2);
      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_6);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) __PYX_ERR(0, 358, __pyx_L1_error)
      __pyx_t_8 = NULL;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      goto __pyx_L6_unpacking_done;
      __pyx_L5_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __pyx_t_8 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      __PYX_ERR(0, 358, __pyx_L1_error)
      __pyx_L6_unpacking_done:;
    }
    __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_2);
    __pyx_t_2 = 0;
    __Pyx_XDECREF_SET(__pyx_v_j, __pyx_t_6);
    __pyx_t_6 = 0;

    /* "rasterio/_base.pyx":359
 *             flags = [0]*self.count
 *             for i, j in zip(range(self.count), self.indexes):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, j)             # <<<<<<<<<<<<<<
 *                 flags[i] = _gdal.GDALGetMaskFlags(hband)
 *             return flags
 */
    __pyx_t_9 = __Pyx_PyInt_As_int(__pyx_v_j); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 359, __pyx_L1_error)
    __pyx_v_hband = GDALGetRasterBand(__pyx_v_self->_hds, __pyx_t_9);

    /* "rasterio/_base.pyx":360
 *             for i, j in zip(range(self.count), self.indexes):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, j)
 *                 flags[i] = _gdal.GDALGetMaskFlags(hband)             # <<<<<<<<<<<<<<
 *             return flags
 * 
 */
    __pyx_t_1 = __Pyx_PyInt_From_int(GDALGetMaskFlags(__pyx_v_hband)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 360, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    if (unlikely(PyObject_SetItem(__pyx_v_flags, __pyx_v_i, __pyx_t_1) < 0)) __PYX_ERR(0, 360, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

    /* "rasterio/_base.pyx":358
 *         def __get__(self):
 *             flags = [0]*self.count
 *             for i, j in zip(range(self.count), self.indexes):             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, j)
 *                 flags[i] = _gdal.GDALGetMaskFlags(hband)
 */
  }
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":361
 *                 hband = _gdal.GDALGetRasterBand(self._hds, j)
 *                 flags[i] = _gdal.GDALGetMaskFlags(hband)
 *             return flags             # <<<<<<<<<<<<<<
 * 
 *     def block_windows(self, bidx=0):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_flags);
  __pyx_r = __pyx_v_flags;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":356
 *         """Mask flags for each band."""
 * 
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             flags = [0]*self.count
 *             for i, j in zip(range(self.count), self.indexes):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.mask_flags.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_flags);
  __Pyx_XDECREF(__pyx_v_i);
  __Pyx_XDECREF(__pyx_v_j);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
static PyObject *__pyx_gb_8rasterio_5_base_13DatasetReader_28generator(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */

/* "rasterio/_base.pyx":363
 *             return flags
 * 
 *     def block_windows(self, bidx=0):             # <<<<<<<<<<<<<<
 *         """Returns an iterator over a band's block windows and their
 *         indexes.
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_27block_windows(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_26block_windows[] = "Returns an iterator over a band's block windows and their\n        indexes.\n\n        The positional parameter `bidx` takes the index (starting at 1)\n        of the desired band. Block windows are tuples\n\n            ((row_start, row_stop), (col_start, col_stop))\n\n        For example, ((0, 2), (0, 2)) defines a 2 x 2 block at the upper\n        left corner of the raster dataset.\n\n        This iterator yields blocks \"left to right\" and \"top to bottom\"\n        and is similar to Python's enumerate() in that it also returns\n        indexes.\n\n        The primary use of this function is to obtain windows to pass to\n        read() for highly efficient access to raster block data.\n        ";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_27block_windows(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_bidx = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("block_windows (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_bidx,0};
    PyObject* values[1] = {0};
    values[0] = ((PyObject *)__pyx_int_0);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_bidx);
          if (value) { values[0] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "block_windows") < 0)) __PYX_ERR(0, 363, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_bidx = values[0];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("block_windows", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 363, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.block_windows", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_26block_windows(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), __pyx_v_bidx);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_26block_windows(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx) {
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *__pyx_cur_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("block_windows", 0);
  __pyx_cur_scope = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *)__pyx_tp_new_8rasterio_5_base___pyx_scope_struct__block_windows(__pyx_ptype_8rasterio_5_base___pyx_scope_struct__block_windows, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
  __pyx_cur_scope->__pyx_v_bidx = __pyx_v_bidx;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_bidx);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_bidx);
  {
    __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_8rasterio_5_base_13DatasetReader_28generator, (PyObject *) __pyx_cur_scope, __pyx_n_s_block_windows, __pyx_n_s_DatasetReader_block_windows); if (unlikely(!gen)) __PYX_ERR(0, 363, __pyx_L1_error)
    __Pyx_DECREF(__pyx_cur_scope);
    __Pyx_RefNannyFinishContext();
    return (PyObject *) gen;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.block_windows", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_gb_8rasterio_5_base_13DatasetReader_28generator(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
{
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *__pyx_cur_scope = ((struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *)__pyx_generator->closure);
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  int __pyx_t_2;
  Py_ssize_t __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *(*__pyx_t_7)(PyObject *);
  long __pyx_t_8;
  int __pyx_t_9;
  long __pyx_t_10;
  int __pyx_t_11;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("None", 0);
  switch (__pyx_generator->resume_label) {
    case 0: goto __pyx_L3_first_run;
    case 1: goto __pyx_L16_resume_from_yield;
    default: /* CPython raises the right error here */
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __pyx_L3_first_run:;
  if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 363, __pyx_L1_error)

  /* "rasterio/_base.pyx":383
 *         """
 *         cdef int i, j
 *         block_shapes = self.block_shapes             # <<<<<<<<<<<<<<
 *         if bidx < 1:
 *             if len(set(block_shapes)) > 1:
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_block_shapes); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 383, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_cur_scope->__pyx_v_block_shapes = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":384
 *         cdef int i, j
 *         block_shapes = self.block_shapes
 *         if bidx < 1:             # <<<<<<<<<<<<<<
 *             if len(set(block_shapes)) > 1:
 *                 raise ValueError(
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_bidx, __pyx_int_1, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 384, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 384, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_2) {

    /* "rasterio/_base.pyx":385
 *         block_shapes = self.block_shapes
 *         if bidx < 1:
 *             if len(set(block_shapes)) > 1:             # <<<<<<<<<<<<<<
 *                 raise ValueError(
 *                     "A band index must be provided when band block shapes"
 */
    __pyx_t_1 = PySet_New(__pyx_cur_scope->__pyx_v_block_shapes); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 385, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_3 = PySet_GET_SIZE(__pyx_t_1); if (unlikely(__pyx_t_3 == -1)) __PYX_ERR(0, 385, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_2 = ((__pyx_t_3 > 1) != 0);
    if (__pyx_t_2) {

      /* "rasterio/_base.pyx":386
 *         if bidx < 1:
 *             if len(set(block_shapes)) > 1:
 *                 raise ValueError(             # <<<<<<<<<<<<<<
 *                     "A band index must be provided when band block shapes"
 *                     "are inhomogeneous")
 */
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__27, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 386, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_Raise(__pyx_t_1, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __PYX_ERR(0, 386, __pyx_L1_error)

      /* "rasterio/_base.pyx":385
 *         block_shapes = self.block_shapes
 *         if bidx < 1:
 *             if len(set(block_shapes)) > 1:             # <<<<<<<<<<<<<<
 *                 raise ValueError(
 *                     "A band index must be provided when band block shapes"
 */
    }

    /* "rasterio/_base.pyx":389
 *                     "A band index must be provided when band block shapes"
 *                     "are inhomogeneous")
 *             bidx = 1             # <<<<<<<<<<<<<<
 *         h, w = block_shapes[bidx-1]
 *         d, m = divmod(self.height, h)
 */
    __Pyx_INCREF(__pyx_int_1);
    __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_bidx);
    __Pyx_DECREF_SET(__pyx_cur_scope->__pyx_v_bidx, __pyx_int_1);
    __Pyx_GIVEREF(__pyx_int_1);

    /* "rasterio/_base.pyx":384
 *         cdef int i, j
 *         block_shapes = self.block_shapes
 *         if bidx < 1:             # <<<<<<<<<<<<<<
 *             if len(set(block_shapes)) > 1:
 *                 raise ValueError(
 */
  }

  /* "rasterio/_base.pyx":390
 *                     "are inhomogeneous")
 *             bidx = 1
 *         h, w = block_shapes[bidx-1]             # <<<<<<<<<<<<<<
 *         d, m = divmod(self.height, h)
 *         nrows = d + int(m>0)
 */
  __pyx_t_1 = __Pyx_PyInt_SubtractObjC(__pyx_cur_scope->__pyx_v_bidx, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 390, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_block_shapes, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 390, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
    PyObject* sequence = __pyx_t_4;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 390, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_5);
    #else
    __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 390, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 390, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    #endif
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 390, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_1 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_1)) goto __pyx_L6_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_1);
    index = 1; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L6_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) __PYX_ERR(0, 390, __pyx_L1_error)
    __pyx_t_7 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L7_unpacking_done;
    __pyx_L6_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_7 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 390, __pyx_L1_error)
    __pyx_L7_unpacking_done:;
  }
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_cur_scope->__pyx_v_h = __pyx_t_1;
  __pyx_t_1 = 0;
  __Pyx_GIVEREF(__pyx_t_5);
  __pyx_cur_scope->__pyx_v_w = __pyx_t_5;
  __pyx_t_5 = 0;

  /* "rasterio/_base.pyx":391
 *             bidx = 1
 *         h, w = block_shapes[bidx-1]
 *         d, m = divmod(self.height, h)             # <<<<<<<<<<<<<<
 *         nrows = d + int(m>0)
 *         d, m = divmod(self.width, w)
 */
  __pyx_t_4 = __pyx_cur_scope->__pyx_v_self->height;
  __Pyx_INCREF(__pyx_t_4);
  __pyx_t_5 = PyNumber_Divmod(__pyx_t_4, __pyx_cur_scope->__pyx_v_h); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 391, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_5))) || (PyList_CheckExact(__pyx_t_5))) {
    PyObject* sequence = __pyx_t_5;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 391, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_1 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_1 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_1);
    #else
    __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 391, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_1 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 391, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    #endif
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 391, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L8_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_4);
    index = 1; __pyx_t_1 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_1)) goto __pyx_L8_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_1);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) __PYX_ERR(0, 391, __pyx_L1_error)
    __pyx_t_7 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L9_unpacking_done;
    __pyx_L8_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_7 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 391, __pyx_L1_error)
    __pyx_L9_unpacking_done:;
  }
  __Pyx_GIVEREF(__pyx_t_4);
  __pyx_cur_scope->__pyx_v_d = __pyx_t_4;
  __pyx_t_4 = 0;
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_cur_scope->__pyx_v_m = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":392
 *         h, w = block_shapes[bidx-1]
 *         d, m = divmod(self.height, h)
 *         nrows = d + int(m>0)             # <<<<<<<<<<<<<<
 *         d, m = divmod(self.width, w)
 *         ncols = d + int(m>0)
 */
  __pyx_t_5 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_m, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 392, __pyx_L1_error)
  __pyx_t_1 = __Pyx_PyNumber_Int(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 392, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = PyNumber_Add(__pyx_cur_scope->__pyx_v_d, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 392, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_GIVEREF(__pyx_t_5);
  __pyx_cur_scope->__pyx_v_nrows = __pyx_t_5;
  __pyx_t_5 = 0;

  /* "rasterio/_base.pyx":393
 *         d, m = divmod(self.height, h)
 *         nrows = d + int(m>0)
 *         d, m = divmod(self.width, w)             # <<<<<<<<<<<<<<
 *         ncols = d + int(m>0)
 *         for j in range(nrows):
 */
  __pyx_t_5 = __pyx_cur_scope->__pyx_v_self->width;
  __Pyx_INCREF(__pyx_t_5);
  __pyx_t_1 = PyNumber_Divmod(__pyx_t_5, __pyx_cur_scope->__pyx_v_w); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 393, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 393, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_4 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_4);
    #else
    __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 393, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 393, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 393, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L10_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    index = 1; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L10_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_4);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) __PYX_ERR(0, 393, __pyx_L1_error)
    __pyx_t_7 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L11_unpacking_done;
    __pyx_L10_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_7 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 393, __pyx_L1_error)
    __pyx_L11_unpacking_done:;
  }
  __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_d);
  __Pyx_DECREF_SET(__pyx_cur_scope->__pyx_v_d, __pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_5);
  __pyx_t_5 = 0;
  __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_m);
  __Pyx_DECREF_SET(__pyx_cur_scope->__pyx_v_m, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_4);
  __pyx_t_4 = 0;

  /* "rasterio/_base.pyx":394
 *         nrows = d + int(m>0)
 *         d, m = divmod(self.width, w)
 *         ncols = d + int(m>0)             # <<<<<<<<<<<<<<
 *         for j in range(nrows):
 *             row = j * h
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_m, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 394, __pyx_L1_error)
  __pyx_t_4 = __Pyx_PyNumber_Int(__pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 394, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyNumber_Add(__pyx_cur_scope->__pyx_v_d, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 394, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_cur_scope->__pyx_v_ncols = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":395
 *         d, m = divmod(self.width, w)
 *         ncols = d + int(m>0)
 *         for j in range(nrows):             # <<<<<<<<<<<<<<
 *             row = j * h
 *             height = min(h, self.height - row)
 */
  __pyx_t_8 = __Pyx_PyInt_As_long(__pyx_cur_scope->__pyx_v_nrows); if (unlikely((__pyx_t_8 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 395, __pyx_L1_error)
  for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
    __pyx_cur_scope->__pyx_v_j = __pyx_t_9;

    /* "rasterio/_base.pyx":396
 *         ncols = d + int(m>0)
 *         for j in range(nrows):
 *             row = j * h             # <<<<<<<<<<<<<<
 *             height = min(h, self.height - row)
 *             for i in range(ncols):
 */
    __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_j); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 396, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_4 = PyNumber_Multiply(__pyx_t_1, __pyx_cur_scope->__pyx_v_h); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 396, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_row);
    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_row, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_4);
    __pyx_t_4 = 0;

    /* "rasterio/_base.pyx":397
 *         for j in range(nrows):
 *             row = j * h
 *             height = min(h, self.height - row)             # <<<<<<<<<<<<<<
 *             for i in range(ncols):
 *                 col = i * w
 */
    __pyx_t_4 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_self->height, __pyx_cur_scope->__pyx_v_row); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 397, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_h);
    __pyx_t_1 = __pyx_cur_scope->__pyx_v_h;
    __pyx_t_6 = PyObject_RichCompare(__pyx_t_4, __pyx_t_1, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 397, __pyx_L1_error)
    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 397, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    if (__pyx_t_2) {
      __Pyx_INCREF(__pyx_t_4);
      __pyx_t_5 = __pyx_t_4;
    } else {
      __Pyx_INCREF(__pyx_t_1);
      __pyx_t_5 = __pyx_t_1;
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = __pyx_t_5;
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_height);
    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_height, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_4);
    __pyx_t_4 = 0;

    /* "rasterio/_base.pyx":398
 *             row = j * h
 *             height = min(h, self.height - row)
 *             for i in range(ncols):             # <<<<<<<<<<<<<<
 *                 col = i * w
 *                 width = min(w, self.width - col)
 */
    __pyx_t_10 = __Pyx_PyInt_As_long(__pyx_cur_scope->__pyx_v_ncols); if (unlikely((__pyx_t_10 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 398, __pyx_L1_error)
    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
      __pyx_cur_scope->__pyx_v_i = __pyx_t_11;

      /* "rasterio/_base.pyx":399
 *             height = min(h, self.height - row)
 *             for i in range(ncols):
 *                 col = i * w             # <<<<<<<<<<<<<<
 *                 width = min(w, self.width - col)
 *                 yield (j, i), ((row, row+height), (col, col+width))
 */
      __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 399, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_5 = PyNumber_Multiply(__pyx_t_4, __pyx_cur_scope->__pyx_v_w); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 399, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_col);
      __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_col, __pyx_t_5);
      __Pyx_GIVEREF(__pyx_t_5);
      __pyx_t_5 = 0;

      /* "rasterio/_base.pyx":400
 *             for i in range(ncols):
 *                 col = i * w
 *                 width = min(w, self.width - col)             # <<<<<<<<<<<<<<
 *                 yield (j, i), ((row, row+height), (col, col+width))
 * 
 */
      __pyx_t_5 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_self->width, __pyx_cur_scope->__pyx_v_col); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 400, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_w);
      __pyx_t_4 = __pyx_cur_scope->__pyx_v_w;
      __pyx_t_6 = PyObject_RichCompare(__pyx_t_5, __pyx_t_4, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 400, __pyx_L1_error)
      __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 400, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      if (__pyx_t_2) {
        __Pyx_INCREF(__pyx_t_5);
        __pyx_t_1 = __pyx_t_5;
      } else {
        __Pyx_INCREF(__pyx_t_4);
        __pyx_t_1 = __pyx_t_4;
      }
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_t_5 = __pyx_t_1;
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_width);
      __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_width, __pyx_t_5);
      __Pyx_GIVEREF(__pyx_t_5);
      __pyx_t_5 = 0;

      /* "rasterio/_base.pyx":401
 *                 col = i * w
 *                 width = min(w, self.width - col)
 *                 yield (j, i), ((row, row+height), (col, col+width))             # <<<<<<<<<<<<<<
 * 
 *     property bounds:
 */
      __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_j); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 401, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 401, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 401, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_GIVEREF(__pyx_t_5);
      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
      __Pyx_GIVEREF(__pyx_t_1);
      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1);
      __pyx_t_5 = 0;
      __pyx_t_1 = 0;
      __pyx_t_1 = PyNumber_Add(__pyx_cur_scope->__pyx_v_row, __pyx_cur_scope->__pyx_v_height); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 401, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 401, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_row);
      __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_row);
      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_cur_scope->__pyx_v_row);
      __Pyx_GIVEREF(__pyx_t_1);
      PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1);
      __pyx_t_1 = 0;
      __pyx_t_1 = PyNumber_Add(__pyx_cur_scope->__pyx_v_col, __pyx_cur_scope->__pyx_v_width); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 401, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 401, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_col);
      __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_col);
      PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_cur_scope->__pyx_v_col);
      __Pyx_GIVEREF(__pyx_t_1);
      PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_1);
      __pyx_t_1 = 0;
      __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 401, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_GIVEREF(__pyx_t_5);
      PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5);
      __Pyx_GIVEREF(__pyx_t_6);
      PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_6);
      __pyx_t_5 = 0;
      __pyx_t_6 = 0;
      __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 401, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_GIVEREF(__pyx_t_4);
      PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
      __Pyx_GIVEREF(__pyx_t_1);
      PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_1);
      __pyx_t_4 = 0;
      __pyx_t_1 = 0;
      __pyx_r = __pyx_t_6;
      __pyx_t_6 = 0;
      __pyx_cur_scope->__pyx_t_0 = __pyx_t_8;
      __pyx_cur_scope->__pyx_t_1 = __pyx_t_9;
      __pyx_cur_scope->__pyx_t_2 = __pyx_t_10;
      __pyx_cur_scope->__pyx_t_3 = __pyx_t_11;
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_RefNannyFinishContext();
      /* return from generator, yielding value */
      __pyx_generator->resume_label = 1;
      return __pyx_r;
      __pyx_L16_resume_from_yield:;
      __pyx_t_8 = __pyx_cur_scope->__pyx_t_0;
      __pyx_t_9 = __pyx_cur_scope->__pyx_t_1;
      __pyx_t_10 = __pyx_cur_scope->__pyx_t_2;
      __pyx_t_11 = __pyx_cur_scope->__pyx_t_3;
      if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 401, __pyx_L1_error)
    }
  }

  /* "rasterio/_base.pyx":363
 *             return flags
 * 
 *     def block_windows(self, bidx=0):             # <<<<<<<<<<<<<<
 *         """Returns an iterator over a band's block windows and their
 *         indexes.
 */

  /* function exit code */
  PyErr_SetNone(PyExc_StopIteration);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("block_windows", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
  __pyx_generator->resume_label = -1;
  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":410
 *         (lower left x, lower left y, upper right x, upper right y)
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             a, b, c, d, e, f, _, _, _ = self.affine
 *             return BoundingBox(c, f+e*self.height, c+a*self.width, f)
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6bounds_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6bounds_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6bounds___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6bounds___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_v_a = NULL;
  CYTHON_UNUSED PyObject *__pyx_v_b = NULL;
  PyObject *__pyx_v_c = NULL;
  CYTHON_UNUSED PyObject *__pyx_v_d = NULL;
  PyObject *__pyx_v_e = NULL;
  PyObject *__pyx_v_f = NULL;
  CYTHON_UNUSED PyObject *__pyx_v__ = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *__pyx_t_10 = NULL;
  PyObject *__pyx_t_11 = NULL;
  PyObject *(*__pyx_t_12)(PyObject *);
  Py_ssize_t __pyx_t_13;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":411
 *         """
 *         def __get__(self):
 *             a, b, c, d, e, f, _, _, _ = self.affine             # <<<<<<<<<<<<<<
 *             return BoundingBox(c, f+e*self.height, c+a*self.width, f)
 * 
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 411, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 9)) {
      if (size > 9) __Pyx_RaiseTooManyValuesError(9);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 411, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 2); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 3); 
      __pyx_t_6 = PyTuple_GET_ITEM(sequence, 4); 
      __pyx_t_7 = PyTuple_GET_ITEM(sequence, 5); 
      __pyx_t_8 = PyTuple_GET_ITEM(sequence, 6); 
      __pyx_t_9 = PyTuple_GET_ITEM(sequence, 7); 
      __pyx_t_10 = PyTuple_GET_ITEM(sequence, 8); 
    } else {
      __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
      __pyx_t_4 = PyList_GET_ITEM(sequence, 2); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 3); 
      __pyx_t_6 = PyList_GET_ITEM(sequence, 4); 
      __pyx_t_7 = PyList_GET_ITEM(sequence, 5); 
      __pyx_t_8 = PyList_GET_ITEM(sequence, 6); 
      __pyx_t_9 = PyList_GET_ITEM(sequence, 7); 
      __pyx_t_10 = PyList_GET_ITEM(sequence, 8); 
    }
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_8);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_10);
    #else
    {
      Py_ssize_t i;
      PyObject** temps[9] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5,&__pyx_t_6,&__pyx_t_7,&__pyx_t_8,&__pyx_t_9,&__pyx_t_10};
      for (i=0; i < 9; i++) {
        PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) __PYX_ERR(0, 411, __pyx_L1_error)
        __Pyx_GOTREF(item);
        *(temps[i]) = item;
      }
    }
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    PyObject** temps[9] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5,&__pyx_t_6,&__pyx_t_7,&__pyx_t_8,&__pyx_t_9,&__pyx_t_10};
    __pyx_t_11 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 411, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_12 = Py_TYPE(__pyx_t_11)->tp_iternext;
    for (index=0; index < 9; index++) {
      PyObject* item = __pyx_t_12(__pyx_t_11); if (unlikely(!item)) goto __pyx_L3_unpacking_failed;
      __Pyx_GOTREF(item);
      *(temps[index]) = item;
    }
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_12(__pyx_t_11), 9) < 0) __PYX_ERR(0, 411, __pyx_L1_error)
    __pyx_t_12 = NULL;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __pyx_t_12 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 411, __pyx_L1_error)
    __pyx_L4_unpacking_done:;
  }
  __pyx_v_a = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_b = __pyx_t_3;
  __pyx_t_3 = 0;
  __pyx_v_c = __pyx_t_4;
  __pyx_t_4 = 0;
  __pyx_v_d = __pyx_t_5;
  __pyx_t_5 = 0;
  __pyx_v_e = __pyx_t_6;
  __pyx_t_6 = 0;
  __pyx_v_f = __pyx_t_7;
  __pyx_t_7 = 0;
  __pyx_v__ = __pyx_t_8;
  __pyx_t_8 = 0;
  __Pyx_DECREF_SET(__pyx_v__, __pyx_t_9);
  __pyx_t_9 = 0;
  __Pyx_DECREF_SET(__pyx_v__, __pyx_t_10);
  __pyx_t_10 = 0;

  /* "rasterio/_base.pyx":412
 *         def __get__(self):
 *             a, b, c, d, e, f, _, _, _ = self.affine
 *             return BoundingBox(c, f+e*self.height, c+a*self.width, f)             # <<<<<<<<<<<<<<
 * 
 *     property res:
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_10 = __Pyx_GetModuleGlobalName(__pyx_n_s_BoundingBox); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __pyx_t_9 = PyNumber_Multiply(__pyx_v_e, __pyx_v_self->height); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_8 = PyNumber_Add(__pyx_v_f, __pyx_t_9); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_9 = PyNumber_Multiply(__pyx_v_a, __pyx_v_self->width); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_7 = PyNumber_Add(__pyx_v_c, __pyx_t_9); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_9 = NULL;
  __pyx_t_13 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_10))) {
    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_10);
    if (likely(__pyx_t_9)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
      __Pyx_INCREF(__pyx_t_9);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_10, function);
      __pyx_t_13 = 1;
    }
  }
  __pyx_t_6 = PyTuple_New(4+__pyx_t_13); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  if (__pyx_t_9) {
    __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_9); __pyx_t_9 = NULL;
  }
  __Pyx_INCREF(__pyx_v_c);
  __Pyx_GIVEREF(__pyx_v_c);
  PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_13, __pyx_v_c);
  __Pyx_GIVEREF(__pyx_t_8);
  PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_13, __pyx_t_8);
  __Pyx_GIVEREF(__pyx_t_7);
  PyTuple_SET_ITEM(__pyx_t_6, 2+__pyx_t_13, __pyx_t_7);
  __Pyx_INCREF(__pyx_v_f);
  __Pyx_GIVEREF(__pyx_v_f);
  PyTuple_SET_ITEM(__pyx_t_6, 3+__pyx_t_13, __pyx_v_f);
  __pyx_t_8 = 0;
  __pyx_t_7 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 412, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":410
 *         (lower left x, lower left y, upper right x, upper right y)
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             a, b, c, d, e, f, _, _, _ = self.affine
 *             return BoundingBox(c, f+e*self.height, c+a*self.width, f)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.bounds.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_a);
  __Pyx_XDECREF(__pyx_v_b);
  __Pyx_XDECREF(__pyx_v_c);
  __Pyx_XDECREF(__pyx_v_d);
  __Pyx_XDECREF(__pyx_v_e);
  __Pyx_XDECREF(__pyx_v_f);
  __Pyx_XDECREF(__pyx_v__);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":417
 *         """Returns the (width, height) of pixels in the units of its
 *         coordinate reference system."""
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             a, b, c, d, e, f, _, _, _ = self.affine
 *             if b == d == 0:
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_3res_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_3res_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_3res___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_3res___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_v_a = NULL;
  PyObject *__pyx_v_b = NULL;
  CYTHON_UNUSED PyObject *__pyx_v_c = NULL;
  PyObject *__pyx_v_d = NULL;
  PyObject *__pyx_v_e = NULL;
  CYTHON_UNUSED PyObject *__pyx_v_f = NULL;
  CYTHON_UNUSED PyObject *__pyx_v__ = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *__pyx_t_10 = NULL;
  PyObject *__pyx_t_11 = NULL;
  PyObject *(*__pyx_t_12)(PyObject *);
  int __pyx_t_13;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":418
 *         coordinate reference system."""
 *         def __get__(self):
 *             a, b, c, d, e, f, _, _, _ = self.affine             # <<<<<<<<<<<<<<
 *             if b == d == 0:
 *                 return a, -e
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 418, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 9)) {
      if (size > 9) __Pyx_RaiseTooManyValuesError(9);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 418, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 2); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 3); 
      __pyx_t_6 = PyTuple_GET_ITEM(sequence, 4); 
      __pyx_t_7 = PyTuple_GET_ITEM(sequence, 5); 
      __pyx_t_8 = PyTuple_GET_ITEM(sequence, 6); 
      __pyx_t_9 = PyTuple_GET_ITEM(sequence, 7); 
      __pyx_t_10 = PyTuple_GET_ITEM(sequence, 8); 
    } else {
      __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
      __pyx_t_4 = PyList_GET_ITEM(sequence, 2); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 3); 
      __pyx_t_6 = PyList_GET_ITEM(sequence, 4); 
      __pyx_t_7 = PyList_GET_ITEM(sequence, 5); 
      __pyx_t_8 = PyList_GET_ITEM(sequence, 6); 
      __pyx_t_9 = PyList_GET_ITEM(sequence, 7); 
      __pyx_t_10 = PyList_GET_ITEM(sequence, 8); 
    }
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_8);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_10);
    #else
    {
      Py_ssize_t i;
      PyObject** temps[9] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5,&__pyx_t_6,&__pyx_t_7,&__pyx_t_8,&__pyx_t_9,&__pyx_t_10};
      for (i=0; i < 9; i++) {
        PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) __PYX_ERR(0, 418, __pyx_L1_error)
        __Pyx_GOTREF(item);
        *(temps[i]) = item;
      }
    }
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    PyObject** temps[9] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5,&__pyx_t_6,&__pyx_t_7,&__pyx_t_8,&__pyx_t_9,&__pyx_t_10};
    __pyx_t_11 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 418, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_12 = Py_TYPE(__pyx_t_11)->tp_iternext;
    for (index=0; index < 9; index++) {
      PyObject* item = __pyx_t_12(__pyx_t_11); if (unlikely(!item)) goto __pyx_L3_unpacking_failed;
      __Pyx_GOTREF(item);
      *(temps[index]) = item;
    }
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_12(__pyx_t_11), 9) < 0) __PYX_ERR(0, 418, __pyx_L1_error)
    __pyx_t_12 = NULL;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __pyx_t_12 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 418, __pyx_L1_error)
    __pyx_L4_unpacking_done:;
  }
  __pyx_v_a = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_b = __pyx_t_3;
  __pyx_t_3 = 0;
  __pyx_v_c = __pyx_t_4;
  __pyx_t_4 = 0;
  __pyx_v_d = __pyx_t_5;
  __pyx_t_5 = 0;
  __pyx_v_e = __pyx_t_6;
  __pyx_t_6 = 0;
  __pyx_v_f = __pyx_t_7;
  __pyx_t_7 = 0;
  __pyx_v__ = __pyx_t_8;
  __pyx_t_8 = 0;
  __Pyx_DECREF_SET(__pyx_v__, __pyx_t_9);
  __pyx_t_9 = 0;
  __Pyx_DECREF_SET(__pyx_v__, __pyx_t_10);
  __pyx_t_10 = 0;

  /* "rasterio/_base.pyx":419
 *         def __get__(self):
 *             a, b, c, d, e, f, _, _, _ = self.affine
 *             if b == d == 0:             # <<<<<<<<<<<<<<
 *                 return a, -e
 *             else:
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_b, __pyx_v_d, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 419, __pyx_L1_error)
  if (__Pyx_PyObject_IsTrue(__pyx_t_1)) {
    __Pyx_DECREF(__pyx_t_1);
    __pyx_t_1 = PyObject_RichCompare(__pyx_v_d, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 419, __pyx_L1_error)
  }
  __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_13 < 0)) __PYX_ERR(0, 419, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_13) {

    /* "rasterio/_base.pyx":420
 *             a, b, c, d, e, f, _, _, _ = self.affine
 *             if b == d == 0:
 *                 return a, -e             # <<<<<<<<<<<<<<
 *             else:
 *                 return math.sqrt(a*a+d*d), math.sqrt(b*b+e*e)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_1 = PyNumber_Negative(__pyx_v_e); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 420, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 420, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_10);
    __Pyx_INCREF(__pyx_v_a);
    __Pyx_GIVEREF(__pyx_v_a);
    PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_a);
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_r = __pyx_t_10;
    __pyx_t_10 = 0;
    goto __pyx_L0;

    /* "rasterio/_base.pyx":419
 *         def __get__(self):
 *             a, b, c, d, e, f, _, _, _ = self.affine
 *             if b == d == 0:             # <<<<<<<<<<<<<<
 *                 return a, -e
 *             else:
 */
  }

  /* "rasterio/_base.pyx":422
 *                 return a, -e
 *             else:
 *                 return math.sqrt(a*a+d*d), math.sqrt(b*b+e*e)             # <<<<<<<<<<<<<<
 * 
 *     def ul(self, row, col):
 */
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_math); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 422, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_sqrt); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 422, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = PyNumber_Multiply(__pyx_v_a, __pyx_v_a); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 422, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_8 = PyNumber_Multiply(__pyx_v_d, __pyx_v_d); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 422, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_7 = PyNumber_Add(__pyx_t_1, __pyx_t_8); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 422, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_t_8 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_9))) {
      __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_9);
      if (likely(__pyx_t_8)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
        __Pyx_INCREF(__pyx_t_8);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_9, function);
      }
    }
    if (!__pyx_t_8) {
      __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_t_9, __pyx_t_7); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 422, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_GOTREF(__pyx_t_10);
    } else {
      __pyx_t_1 = PyTuple_New(1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 422, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_8); __pyx_t_8 = NULL;
      __Pyx_GIVEREF(__pyx_t_7);
      PyTuple_SET_ITEM(__pyx_t_1, 0+1, __pyx_t_7);
      __pyx_t_7 = 0;
      __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_1, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 422, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_10);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    }
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_math); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 422, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_sqrt); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 422, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = PyNumber_Multiply(__pyx_v_b, __pyx_v_b); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 422, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_8 = PyNumber_Multiply(__pyx_v_e, __pyx_v_e); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 422, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_6 = PyNumber_Add(__pyx_t_1, __pyx_t_8); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 422, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_t_8 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_7))) {
      __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7);
      if (likely(__pyx_t_8)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
        __Pyx_INCREF(__pyx_t_8);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_7, function);
      }
    }
    if (!__pyx_t_8) {
      __pyx_t_9 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 422, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_GOTREF(__pyx_t_9);
    } else {
      __pyx_t_1 = PyTuple_New(1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 422, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_8); __pyx_t_8 = NULL;
      __Pyx_GIVEREF(__pyx_t_6);
      PyTuple_SET_ITEM(__pyx_t_1, 0+1, __pyx_t_6);
      __pyx_t_6 = 0;
      __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_1, NULL); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 422, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    }
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 422, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_GIVEREF(__pyx_t_10);
    PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_10);
    __Pyx_GIVEREF(__pyx_t_9);
    PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_9);
    __pyx_t_10 = 0;
    __pyx_t_9 = 0;
    __pyx_r = __pyx_t_7;
    __pyx_t_7 = 0;
    goto __pyx_L0;
  }

  /* "rasterio/_base.pyx":417
 *         """Returns the (width, height) of pixels in the units of its
 *         coordinate reference system."""
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             a, b, c, d, e, f, _, _, _ = self.affine
 *             if b == d == 0:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.res.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_a);
  __Pyx_XDECREF(__pyx_v_b);
  __Pyx_XDECREF(__pyx_v_c);
  __Pyx_XDECREF(__pyx_v_d);
  __Pyx_XDECREF(__pyx_v_e);
  __Pyx_XDECREF(__pyx_v_f);
  __Pyx_XDECREF(__pyx_v__);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":424
 *                 return math.sqrt(a*a+d*d), math.sqrt(b*b+e*e)
 * 
 *     def ul(self, row, col):             # <<<<<<<<<<<<<<
 *         """Returns the coordinates (x, y) of the upper left corner of a
 *         pixel at `row` and `col` in the units of the dataset's
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_30ul(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_29ul[] = "Returns the coordinates (x, y) of the upper left corner of a \n        pixel at `row` and `col` in the units of the dataset's\n        coordinate reference system.\n        ";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_30ul(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_row = 0;
  PyObject *__pyx_v_col = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("ul (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_row,&__pyx_n_s_col,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_row)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_col)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("ul", 1, 2, 2, 1); __PYX_ERR(0, 424, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "ul") < 0)) __PYX_ERR(0, 424, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_row = values[0];
    __pyx_v_col = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("ul", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 424, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.ul", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_29ul(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), __pyx_v_row, __pyx_v_col);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_29ul(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_row, PyObject *__pyx_v_col) {
  PyObject *__pyx_v_a = NULL;
  CYTHON_UNUSED PyObject *__pyx_v_b = NULL;
  PyObject *__pyx_v_c = NULL;
  CYTHON_UNUSED PyObject *__pyx_v_d = NULL;
  PyObject *__pyx_v_e = NULL;
  PyObject *__pyx_v_f = NULL;
  CYTHON_UNUSED PyObject *__pyx_v__ = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *__pyx_t_10 = NULL;
  PyObject *__pyx_t_11 = NULL;
  PyObject *(*__pyx_t_12)(PyObject *);
  int __pyx_t_13;
  __Pyx_RefNannySetupContext("ul", 0);
  __Pyx_INCREF(__pyx_v_row);
  __Pyx_INCREF(__pyx_v_col);

  /* "rasterio/_base.pyx":429
 *         coordinate reference system.
 *         """
 *         a, b, c, d, e, f, _, _, _ = self.affine             # <<<<<<<<<<<<<<
 *         if col < 0:
 *             col += self.width
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 429, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 9)) {
      if (size > 9) __Pyx_RaiseTooManyValuesError(9);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 429, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 2); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 3); 
      __pyx_t_6 = PyTuple_GET_ITEM(sequence, 4); 
      __pyx_t_7 = PyTuple_GET_ITEM(sequence, 5); 
      __pyx_t_8 = PyTuple_GET_ITEM(sequence, 6); 
      __pyx_t_9 = PyTuple_GET_ITEM(sequence, 7); 
      __pyx_t_10 = PyTuple_GET_ITEM(sequence, 8); 
    } else {
      __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
      __pyx_t_4 = PyList_GET_ITEM(sequence, 2); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 3); 
      __pyx_t_6 = PyList_GET_ITEM(sequence, 4); 
      __pyx_t_7 = PyList_GET_ITEM(sequence, 5); 
      __pyx_t_8 = PyList_GET_ITEM(sequence, 6); 
      __pyx_t_9 = PyList_GET_ITEM(sequence, 7); 
      __pyx_t_10 = PyList_GET_ITEM(sequence, 8); 
    }
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_8);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_10);
    #else
    {
      Py_ssize_t i;
      PyObject** temps[9] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5,&__pyx_t_6,&__pyx_t_7,&__pyx_t_8,&__pyx_t_9,&__pyx_t_10};
      for (i=0; i < 9; i++) {
        PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) __PYX_ERR(0, 429, __pyx_L1_error)
        __Pyx_GOTREF(item);
        *(temps[i]) = item;
      }
    }
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    PyObject** temps[9] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5,&__pyx_t_6,&__pyx_t_7,&__pyx_t_8,&__pyx_t_9,&__pyx_t_10};
    __pyx_t_11 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 429, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_12 = Py_TYPE(__pyx_t_11)->tp_iternext;
    for (index=0; index < 9; index++) {
      PyObject* item = __pyx_t_12(__pyx_t_11); if (unlikely(!item)) goto __pyx_L3_unpacking_failed;
      __Pyx_GOTREF(item);
      *(temps[index]) = item;
    }
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_12(__pyx_t_11), 9) < 0) __PYX_ERR(0, 429, __pyx_L1_error)
    __pyx_t_12 = NULL;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __pyx_t_12 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 429, __pyx_L1_error)
    __pyx_L4_unpacking_done:;
  }
  __pyx_v_a = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_b = __pyx_t_3;
  __pyx_t_3 = 0;
  __pyx_v_c = __pyx_t_4;
  __pyx_t_4 = 0;
  __pyx_v_d = __pyx_t_5;
  __pyx_t_5 = 0;
  __pyx_v_e = __pyx_t_6;
  __pyx_t_6 = 0;
  __pyx_v_f = __pyx_t_7;
  __pyx_t_7 = 0;
  __pyx_v__ = __pyx_t_8;
  __pyx_t_8 = 0;
  __Pyx_DECREF_SET(__pyx_v__, __pyx_t_9);
  __pyx_t_9 = 0;
  __Pyx_DECREF_SET(__pyx_v__, __pyx_t_10);
  __pyx_t_10 = 0;

  /* "rasterio/_base.pyx":430
 *         """
 *         a, b, c, d, e, f, _, _, _ = self.affine
 *         if col < 0:             # <<<<<<<<<<<<<<
 *             col += self.width
 *         if row < 0:
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_col, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 430, __pyx_L1_error)
  __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_13 < 0)) __PYX_ERR(0, 430, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_13) {

    /* "rasterio/_base.pyx":431
 *         a, b, c, d, e, f, _, _, _ = self.affine
 *         if col < 0:
 *             col += self.width             # <<<<<<<<<<<<<<
 *         if row < 0:
 *             row += self.height
 */
    __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_col, __pyx_v_self->width); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 431, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF_SET(__pyx_v_col, __pyx_t_1);
    __pyx_t_1 = 0;

    /* "rasterio/_base.pyx":430
 *         """
 *         a, b, c, d, e, f, _, _, _ = self.affine
 *         if col < 0:             # <<<<<<<<<<<<<<
 *             col += self.width
 *         if row < 0:
 */
  }

  /* "rasterio/_base.pyx":432
 *         if col < 0:
 *             col += self.width
 *         if row < 0:             # <<<<<<<<<<<<<<
 *             row += self.height
 *         return c+a*col, f+e*row
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_row, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 432, __pyx_L1_error)
  __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_13 < 0)) __PYX_ERR(0, 432, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_13) {

    /* "rasterio/_base.pyx":433
 *             col += self.width
 *         if row < 0:
 *             row += self.height             # <<<<<<<<<<<<<<
 *         return c+a*col, f+e*row
 * 
 */
    __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_row, __pyx_v_self->height); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 433, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF_SET(__pyx_v_row, __pyx_t_1);
    __pyx_t_1 = 0;

    /* "rasterio/_base.pyx":432
 *         if col < 0:
 *             col += self.width
 *         if row < 0:             # <<<<<<<<<<<<<<
 *             row += self.height
 *         return c+a*col, f+e*row
 */
  }

  /* "rasterio/_base.pyx":434
 *         if row < 0:
 *             row += self.height
 *         return c+a*col, f+e*row             # <<<<<<<<<<<<<<
 * 
 *     def index(self, x, y, op=math.floor, precision=6):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyNumber_Multiply(__pyx_v_a, __pyx_v_col); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 434, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_10 = PyNumber_Add(__pyx_v_c, __pyx_t_1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 434, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyNumber_Multiply(__pyx_v_e, __pyx_v_row); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 434, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_9 = PyNumber_Add(__pyx_v_f, __pyx_t_1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 434, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 434, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_10);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_10);
  __Pyx_GIVEREF(__pyx_t_9);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_9);
  __pyx_t_10 = 0;
  __pyx_t_9 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":424
 *                 return math.sqrt(a*a+d*d), math.sqrt(b*b+e*e)
 * 
 *     def ul(self, row, col):             # <<<<<<<<<<<<<<
 *         """Returns the coordinates (x, y) of the upper left corner of a
 *         pixel at `row` and `col` in the units of the dataset's
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.ul", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_a);
  __Pyx_XDECREF(__pyx_v_b);
  __Pyx_XDECREF(__pyx_v_c);
  __Pyx_XDECREF(__pyx_v_d);
  __Pyx_XDECREF(__pyx_v_e);
  __Pyx_XDECREF(__pyx_v_f);
  __Pyx_XDECREF(__pyx_v__);
  __Pyx_XDECREF(__pyx_v_row);
  __Pyx_XDECREF(__pyx_v_col);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":436
 *         return c+a*col, f+e*row
 * 
 *     def index(self, x, y, op=math.floor, precision=6):             # <<<<<<<<<<<<<<
 *         """Returns the (row, col) index of the pixel containing (x, y)."""
 *         return get_index(x, y, self.affine, op=op, precision=precision)
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_32index(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_31index[] = "Returns the (row, col) index of the pixel containing (x, y).";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_32index(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_x = 0;
  PyObject *__pyx_v_y = 0;
  PyObject *__pyx_v_op = 0;
  PyObject *__pyx_v_precision = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("index (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_y,&__pyx_n_s_op,&__pyx_n_s_precision,0};
    PyObject* values[4] = {0,0,0,0};
    values[2] = __pyx_k__28;
    values[3] = ((PyObject *)__pyx_int_6);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("index", 0, 2, 4, 1); __PYX_ERR(0, 436, __pyx_L3_error)
        }
        case  2:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_op);
          if (value) { values[2] = value; kw_args--; }
        }
        case  3:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_precision);
          if (value) { values[3] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "index") < 0)) __PYX_ERR(0, 436, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_x = values[0];
    __pyx_v_y = values[1];
    __pyx_v_op = values[2];
    __pyx_v_precision = values[3];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("index", 0, 2, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 436, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.index", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_31index(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), __pyx_v_x, __pyx_v_y, __pyx_v_op, __pyx_v_precision);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_31index(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_x, PyObject *__pyx_v_y, PyObject *__pyx_v_op, PyObject *__pyx_v_precision) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  __Pyx_RefNannySetupContext("index", 0);

  /* "rasterio/_base.pyx":438
 *     def index(self, x, y, op=math.floor, precision=6):
 *         """Returns the (row, col) index of the pixel containing (x, y)."""
 *         return get_index(x, y, self.affine, op=op, precision=precision)             # <<<<<<<<<<<<<<
 * 
 *     def window(self, left, bottom, right, top, boundless=False):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_get_index); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 438, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 438, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 438, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_v_x);
  __Pyx_GIVEREF(__pyx_v_x);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_x);
  __Pyx_INCREF(__pyx_v_y);
  __Pyx_GIVEREF(__pyx_v_y);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_y);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 438, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_op, __pyx_v_op) < 0) __PYX_ERR(0, 438, __pyx_L1_error)
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_precision, __pyx_v_precision) < 0) __PYX_ERR(0, 438, __pyx_L1_error)
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 438, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":436
 *         return c+a*col, f+e*row
 * 
 *     def index(self, x, y, op=math.floor, precision=6):             # <<<<<<<<<<<<<<
 *         """Returns the (row, col) index of the pixel containing (x, y)."""
 *         return get_index(x, y, self.affine, op=op, precision=precision)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.index", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":440
 *         return get_index(x, y, self.affine, op=op, precision=precision)
 * 
 *     def window(self, left, bottom, right, top, boundless=False):             # <<<<<<<<<<<<<<
 *         """Returns the window corresponding to the world bounding box.
 *         If boundless is False, window is limited to extent of this dataset."""
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_34window(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_33window[] = "Returns the window corresponding to the world bounding box.\n        If boundless is False, window is limited to extent of this dataset.";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_34window(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_left = 0;
  PyObject *__pyx_v_bottom = 0;
  PyObject *__pyx_v_right = 0;
  PyObject *__pyx_v_top = 0;
  PyObject *__pyx_v_boundless = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("window (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_left,&__pyx_n_s_bottom,&__pyx_n_s_right,&__pyx_n_s_top,&__pyx_n_s_boundless,0};
    PyObject* values[5] = {0,0,0,0,0};
    values[4] = ((PyObject *)Py_False);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_left)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_bottom)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("window", 0, 4, 5, 1); __PYX_ERR(0, 440, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_right)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("window", 0, 4, 5, 2); __PYX_ERR(0, 440, __pyx_L3_error)
        }
        case  3:
        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_top)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("window", 0, 4, 5, 3); __PYX_ERR(0, 440, __pyx_L3_error)
        }
        case  4:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_boundless);
          if (value) { values[4] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "window") < 0)) __PYX_ERR(0, 440, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_left = values[0];
    __pyx_v_bottom = values[1];
    __pyx_v_right = values[2];
    __pyx_v_top = values[3];
    __pyx_v_boundless = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("window", 0, 4, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 440, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_33window(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), __pyx_v_left, __pyx_v_bottom, __pyx_v_right, __pyx_v_top, __pyx_v_boundless);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_33window(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_left, PyObject *__pyx_v_bottom, PyObject *__pyx_v_right, PyObject *__pyx_v_top, PyObject *__pyx_v_boundless) {
  PyObject *__pyx_v_window = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  Py_ssize_t __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_t_7;
  int __pyx_t_8;
  int __pyx_t_9;
  __Pyx_RefNannySetupContext("window", 0);

  /* "rasterio/_base.pyx":444
 *         If boundless is False, window is limited to extent of this dataset."""
 * 
 *         window = get_window(left, bottom, right, top, self.affine)             # <<<<<<<<<<<<<<
 *         if boundless:
 *             return window
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_get_window); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 444, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 444, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = NULL;
  __pyx_t_5 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_5 = 1;
    }
  }
  __pyx_t_6 = PyTuple_New(5+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 444, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  if (__pyx_t_4) {
    __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL;
  }
  __Pyx_INCREF(__pyx_v_left);
  __Pyx_GIVEREF(__pyx_v_left);
  PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_v_left);
  __Pyx_INCREF(__pyx_v_bottom);
  __Pyx_GIVEREF(__pyx_v_bottom);
  PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_bottom);
  __Pyx_INCREF(__pyx_v_right);
  __Pyx_GIVEREF(__pyx_v_right);
  PyTuple_SET_ITEM(__pyx_t_6, 2+__pyx_t_5, __pyx_v_right);
  __Pyx_INCREF(__pyx_v_top);
  __Pyx_GIVEREF(__pyx_v_top);
  PyTuple_SET_ITEM(__pyx_t_6, 3+__pyx_t_5, __pyx_v_top);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_6, 4+__pyx_t_5, __pyx_t_3);
  __pyx_t_3 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 444, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_window = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":445
 * 
 *         window = get_window(left, bottom, right, top, self.affine)
 *         if boundless:             # <<<<<<<<<<<<<<
 *             return window
 *         else:
 */
  __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_boundless); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 445, __pyx_L1_error)
  if (__pyx_t_7) {

    /* "rasterio/_base.pyx":446
 *         window = get_window(left, bottom, right, top, self.affine)
 *         if boundless:
 *             return window             # <<<<<<<<<<<<<<
 *         else:
 *             return crop_window(window, self.height, self.width)
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_v_window);
    __pyx_r = __pyx_v_window;
    goto __pyx_L0;

    /* "rasterio/_base.pyx":445
 * 
 *         window = get_window(left, bottom, right, top, self.affine)
 *         if boundless:             # <<<<<<<<<<<<<<
 *             return window
 *         else:
 */
  }

  /* "rasterio/_base.pyx":448
 *             return window
 *         else:
 *             return crop_window(window, self.height, self.width)             # <<<<<<<<<<<<<<
 * 
 *     def window_transform(self, window):
 */
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_8 = __Pyx_PyInt_As_int(__pyx_v_self->height); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 448, __pyx_L1_error)
    __pyx_t_9 = __Pyx_PyInt_As_int(__pyx_v_self->width); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 448, __pyx_L1_error)
    __pyx_t_1 = __pyx_f_8rasterio_5_base_crop_window(__pyx_v_window, __pyx_t_8, __pyx_t_9, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 448, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }

  /* "rasterio/_base.pyx":440
 *         return get_index(x, y, self.affine, op=op, precision=precision)
 * 
 *     def window(self, left, bottom, right, top, boundless=False):             # <<<<<<<<<<<<<<
 *         """Returns the window corresponding to the world bounding box.
 *         If boundless is False, window is limited to extent of this dataset."""
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_window);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":450
 *             return crop_window(window, self.height, self.width)
 * 
 *     def window_transform(self, window):             # <<<<<<<<<<<<<<
 *         """Returns the affine transform for a dataset window."""
 *         (r, _), (c, _) = window
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_36window_transform(PyObject *__pyx_v_self, PyObject *__pyx_v_window); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_35window_transform[] = "Returns the affine transform for a dataset window.";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_36window_transform(PyObject *__pyx_v_self, PyObject *__pyx_v_window) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("window_transform (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_35window_transform(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_window));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_35window_transform(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_window) {
  PyObject *__pyx_v_r = NULL;
  CYTHON_UNUSED PyObject *__pyx_v__ = NULL;
  PyObject *__pyx_v_c = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *(*__pyx_t_4)(PyObject *);
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  Py_ssize_t __pyx_t_9;
  PyObject *__pyx_t_10 = NULL;
  __Pyx_RefNannySetupContext("window_transform", 0);

  /* "rasterio/_base.pyx":452
 *     def window_transform(self, window):
 *         """Returns the affine transform for a dataset window."""
 *         (r, _), (c, _) = window             # <<<<<<<<<<<<<<
 *         return self.affine * Affine.translation(c or 0, r or 0)
 * 
 */
  if ((likely(PyTuple_CheckExact(__pyx_v_window))) || (PyList_CheckExact(__pyx_v_window))) {
    PyObject* sequence = __pyx_v_window;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 452, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_2);
    #else
    __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 452, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 452, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    #endif
  } else {
    Py_ssize_t index = -1;
    __pyx_t_3 = PyObject_GetIter(__pyx_v_window); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 452, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
    index = 0; __pyx_t_1 = __pyx_t_4(__pyx_t_3); if (unlikely(!__pyx_t_1)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_1);
    index = 1; __pyx_t_2 = __pyx_t_4(__pyx_t_3); if (unlikely(!__pyx_t_2)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_2);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_3), 2) < 0) __PYX_ERR(0, 452, __pyx_L1_error)
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 452, __pyx_L1_error)
    __pyx_L4_unpacking_done:;
  }
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 452, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_5);
    #else
    __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 452, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 452, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 452, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_4 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_3 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_3)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_3);
    index = 1; __pyx_t_5 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_6), 2) < 0) __PYX_ERR(0, 452, __pyx_L1_error)
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L6_unpacking_done;
    __pyx_L5_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 452, __pyx_L1_error)
    __pyx_L6_unpacking_done:;
  }
  __pyx_v_r = __pyx_t_3;
  __pyx_t_3 = 0;
  __pyx_v__ = __pyx_t_5;
  __pyx_t_5 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
    PyObject* sequence = __pyx_t_2;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 452, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_3);
    #else
    __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 452, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 452, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    #endif
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 452, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_4 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_5 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L7_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    index = 1; __pyx_t_3 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_3)) goto __pyx_L7_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_3);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_6), 2) < 0) __PYX_ERR(0, 452, __pyx_L1_error)
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L8_unpacking_done;
    __pyx_L7_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 452, __pyx_L1_error)
    __pyx_L8_unpacking_done:;
  }
  __pyx_v_c = __pyx_t_5;
  __pyx_t_5 = 0;
  __Pyx_DECREF_SET(__pyx_v__, __pyx_t_3);
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":453
 *         """Returns the affine transform for a dataset window."""
 *         (r, _), (c, _) = window
 *         return self.affine * Affine.translation(c or 0, r or 0)             # <<<<<<<<<<<<<<
 * 
 *     def window_bounds(self, window):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 453, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_Affine); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 453, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_translation); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 453, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_c); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 453, __pyx_L1_error)
  if (!__pyx_t_7) {
  } else {
    __Pyx_INCREF(__pyx_v_c);
    __pyx_t_3 = __pyx_v_c;
    goto __pyx_L9_bool_binop_done;
  }
  __pyx_t_6 = __Pyx_PyInt_From_long(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 453, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_3 = __pyx_t_6;
  __pyx_t_6 = 0;
  __pyx_L9_bool_binop_done:;
  __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_r); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 453, __pyx_L1_error)
  if (!__pyx_t_7) {
  } else {
    __Pyx_INCREF(__pyx_v_r);
    __pyx_t_6 = __pyx_v_r;
    goto __pyx_L11_bool_binop_done;
  }
  __pyx_t_8 = __Pyx_PyInt_From_long(0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 453, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_t_6 = __pyx_t_8;
  __pyx_t_8 = 0;
  __pyx_L11_bool_binop_done:;
  __pyx_t_8 = NULL;
  __pyx_t_9 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_8)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_8);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
      __pyx_t_9 = 1;
    }
  }
  __pyx_t_10 = PyTuple_New(2+__pyx_t_9); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 453, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  if (__pyx_t_8) {
    __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_8); __pyx_t_8 = NULL;
  }
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_10, 0+__pyx_t_9, __pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_6);
  PyTuple_SET_ITEM(__pyx_t_10, 1+__pyx_t_9, __pyx_t_6);
  __pyx_t_3 = 0;
  __pyx_t_6 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_10, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 453, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = PyNumber_Multiply(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 453, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_5;
  __pyx_t_5 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":450
 *             return crop_window(window, self.height, self.width)
 * 
 *     def window_transform(self, window):             # <<<<<<<<<<<<<<
 *         """Returns the affine transform for a dataset window."""
 *         (r, _), (c, _) = window
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.window_transform", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_r);
  __Pyx_XDECREF(__pyx_v__);
  __Pyx_XDECREF(__pyx_v_c);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":455
 *         return self.affine * Affine.translation(c or 0, r or 0)
 * 
 *     def window_bounds(self, window):             # <<<<<<<<<<<<<<
 *         """Returns the bounds of a window as x_min, y_min, x_max, y_max."""
 *         ((row_min, row_max), (col_min, col_max)) = window
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_38window_bounds(PyObject *__pyx_v_self, PyObject *__pyx_v_window); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_37window_bounds[] = "Returns the bounds of a window as x_min, y_min, x_max, y_max.";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_38window_bounds(PyObject *__pyx_v_self, PyObject *__pyx_v_window) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("window_bounds (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_37window_bounds(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_window));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_37window_bounds(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_window) {
  PyObject *__pyx_v_row_min = NULL;
  PyObject *__pyx_v_row_max = NULL;
  PyObject *__pyx_v_col_min = NULL;
  PyObject *__pyx_v_col_max = NULL;
  PyObject *__pyx_v_x_min = NULL;
  PyObject *__pyx_v_y_min = NULL;
  PyObject *__pyx_v_x_max = NULL;
  PyObject *__pyx_v_y_max = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *(*__pyx_t_4)(PyObject *);
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  __Pyx_RefNannySetupContext("window_bounds", 0);

  /* "rasterio/_base.pyx":457
 *     def window_bounds(self, window):
 *         """Returns the bounds of a window as x_min, y_min, x_max, y_max."""
 *         ((row_min, row_max), (col_min, col_max)) = window             # <<<<<<<<<<<<<<
 *         x_min, y_min = (col_min, row_max) * self.affine
 *         x_max, y_max = (col_max, row_min) * self.affine
 */
  if ((likely(PyTuple_CheckExact(__pyx_v_window))) || (PyList_CheckExact(__pyx_v_window))) {
    PyObject* sequence = __pyx_v_window;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 457, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_2);
    #else
    __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 457, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 457, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    #endif
  } else {
    Py_ssize_t index = -1;
    __pyx_t_3 = PyObject_GetIter(__pyx_v_window); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 457, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
    index = 0; __pyx_t_1 = __pyx_t_4(__pyx_t_3); if (unlikely(!__pyx_t_1)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_1);
    index = 1; __pyx_t_2 = __pyx_t_4(__pyx_t_3); if (unlikely(!__pyx_t_2)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_2);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_3), 2) < 0) __PYX_ERR(0, 457, __pyx_L1_error)
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 457, __pyx_L1_error)
    __pyx_L4_unpacking_done:;
  }
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 457, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_5);
    #else
    __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 457, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 457, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 457, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_4 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_3 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_3)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_3);
    index = 1; __pyx_t_5 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_6), 2) < 0) __PYX_ERR(0, 457, __pyx_L1_error)
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L6_unpacking_done;
    __pyx_L5_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 457, __pyx_L1_error)
    __pyx_L6_unpacking_done:;
  }
  __pyx_v_row_min = __pyx_t_3;
  __pyx_t_3 = 0;
  __pyx_v_row_max = __pyx_t_5;
  __pyx_t_5 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
    PyObject* sequence = __pyx_t_2;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 457, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_3);
    #else
    __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 457, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 457, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    #endif
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 457, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_4 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_5 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L7_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    index = 1; __pyx_t_3 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_3)) goto __pyx_L7_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_3);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_6), 2) < 0) __PYX_ERR(0, 457, __pyx_L1_error)
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L8_unpacking_done;
    __pyx_L7_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 457, __pyx_L1_error)
    __pyx_L8_unpacking_done:;
  }
  __pyx_v_col_min = __pyx_t_5;
  __pyx_t_5 = 0;
  __pyx_v_col_max = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":458
 *         """Returns the bounds of a window as x_min, y_min, x_max, y_max."""
 *         ((row_min, row_max), (col_min, col_max)) = window
 *         x_min, y_min = (col_min, row_max) * self.affine             # <<<<<<<<<<<<<<
 *         x_max, y_max = (col_max, row_min) * self.affine
 *         return x_min, y_min, x_max, y_max
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 458, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 458, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_col_min);
  __Pyx_GIVEREF(__pyx_v_col_min);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_col_min);
  __Pyx_INCREF(__pyx_v_row_max);
  __Pyx_GIVEREF(__pyx_v_row_max);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_row_max);
  { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_temp)) __PYX_ERR(0, 458, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_temp);
    __Pyx_DECREF(__pyx_t_1);
    __pyx_t_1 = __pyx_temp;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (1) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 458, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
    __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_3);
    #else
    __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 458, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 458, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }
  __pyx_v_x_min = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_y_min = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":459
 *         ((row_min, row_max), (col_min, col_max)) = window
 *         x_min, y_min = (col_min, row_max) * self.affine
 *         x_max, y_max = (col_max, row_min) * self.affine             # <<<<<<<<<<<<<<
 *         return x_min, y_min, x_max, y_max
 * 
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 459, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 459, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_v_col_max);
  __Pyx_GIVEREF(__pyx_v_col_max);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_col_max);
  __Pyx_INCREF(__pyx_v_row_min);
  __Pyx_GIVEREF(__pyx_v_row_min);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_row_min);
  { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_temp)) __PYX_ERR(0, 459, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_temp);
    __Pyx_DECREF(__pyx_t_3);
    __pyx_t_3 = __pyx_temp;
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (1) {
    PyObject* sequence = __pyx_t_3;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 459, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
    __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_2);
    #else
    __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 459, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 459, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    #endif
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  }
  __pyx_v_x_max = __pyx_t_1;
  __pyx_t_1 = 0;
  __pyx_v_y_max = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":460
 *         x_min, y_min = (col_min, row_max) * self.affine
 *         x_max, y_max = (col_max, row_min) * self.affine
 *         return x_min, y_min, x_max, y_max             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = PyTuple_New(4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 460, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_v_x_min);
  __Pyx_GIVEREF(__pyx_v_x_min);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_x_min);
  __Pyx_INCREF(__pyx_v_y_min);
  __Pyx_GIVEREF(__pyx_v_y_min);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_y_min);
  __Pyx_INCREF(__pyx_v_x_max);
  __Pyx_GIVEREF(__pyx_v_x_max);
  PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_x_max);
  __Pyx_INCREF(__pyx_v_y_max);
  __Pyx_GIVEREF(__pyx_v_y_max);
  PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_v_y_max);
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":455
 *         return self.affine * Affine.translation(c or 0, r or 0)
 * 
 *     def window_bounds(self, window):             # <<<<<<<<<<<<<<
 *         """Returns the bounds of a window as x_min, y_min, x_max, y_max."""
 *         ((row_min, row_max), (col_min, col_max)) = window
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.window_bounds", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_row_min);
  __Pyx_XDECREF(__pyx_v_row_max);
  __Pyx_XDECREF(__pyx_v_col_min);
  __Pyx_XDECREF(__pyx_v_col_max);
  __Pyx_XDECREF(__pyx_v_x_min);
  __Pyx_XDECREF(__pyx_v_y_min);
  __Pyx_XDECREF(__pyx_v_x_max);
  __Pyx_XDECREF(__pyx_v_y_max);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":463
 * 
 *     @property
 *     def meta(self):             # <<<<<<<<<<<<<<
 *         """The basic metadata of this dataset."""
 *         if self.count == 0:
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_4meta_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_4meta_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_4meta___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4meta___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_v_dtype = NULL;
  PyObject *__pyx_v_m = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":465
 *     def meta(self):
 *         """The basic metadata of this dataset."""
 *         if self.count == 0:             # <<<<<<<<<<<<<<
 *             dtype = 'float_'
 *         else:
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_count); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 465, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_EqObjC(__pyx_t_1, __pyx_int_0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 465, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 465, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (__pyx_t_3) {

    /* "rasterio/_base.pyx":466
 *         """The basic metadata of this dataset."""
 *         if self.count == 0:
 *             dtype = 'float_'             # <<<<<<<<<<<<<<
 *         else:
 *             dtype = self.dtypes[0]
 */
    __Pyx_INCREF(__pyx_n_s_float);
    __pyx_v_dtype = __pyx_n_s_float;

    /* "rasterio/_base.pyx":465
 *     def meta(self):
 *         """The basic metadata of this dataset."""
 *         if self.count == 0:             # <<<<<<<<<<<<<<
 *             dtype = 'float_'
 *         else:
 */
    goto __pyx_L3;
  }

  /* "rasterio/_base.pyx":468
 *             dtype = 'float_'
 *         else:
 *             dtype = self.dtypes[0]             # <<<<<<<<<<<<<<
 *         m = {
 *             'driver': self.driver,
 */
  /*else*/ {
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_dtypes); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 468, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 468, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_v_dtype = __pyx_t_1;
    __pyx_t_1 = 0;
  }
  __pyx_L3:;

  /* "rasterio/_base.pyx":470
 *             dtype = self.dtypes[0]
 *         m = {
 *             'driver': self.driver,             # <<<<<<<<<<<<<<
 *             'dtype': dtype,
 *             'nodata': self.nodata,
 */
  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 470, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_driver, __pyx_v_self->driver) < 0) __PYX_ERR(0, 470, __pyx_L1_error)

  /* "rasterio/_base.pyx":471
 *         m = {
 *             'driver': self.driver,
 *             'dtype': dtype,             # <<<<<<<<<<<<<<
 *             'nodata': self.nodata,
 *             'width': self.width,
 */
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_v_dtype) < 0) __PYX_ERR(0, 470, __pyx_L1_error)

  /* "rasterio/_base.pyx":472
 *             'driver': self.driver,
 *             'dtype': dtype,
 *             'nodata': self.nodata,             # <<<<<<<<<<<<<<
 *             'width': self.width,
 *             'height': self.height,
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_nodata); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 472, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_nodata, __pyx_t_2) < 0) __PYX_ERR(0, 470, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":473
 *             'dtype': dtype,
 *             'nodata': self.nodata,
 *             'width': self.width,             # <<<<<<<<<<<<<<
 *             'height': self.height,
 *             'count': self.count,
 */
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_width, __pyx_v_self->width) < 0) __PYX_ERR(0, 470, __pyx_L1_error)

  /* "rasterio/_base.pyx":474
 *             'nodata': self.nodata,
 *             'width': self.width,
 *             'height': self.height,             # <<<<<<<<<<<<<<
 *             'count': self.count,
 *             'crs': self.crs,
 */
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_height, __pyx_v_self->height) < 0) __PYX_ERR(0, 470, __pyx_L1_error)

  /* "rasterio/_base.pyx":475
 *             'width': self.width,
 *             'height': self.height,
 *             'count': self.count,             # <<<<<<<<<<<<<<
 *             'crs': self.crs,
 *             'transform': self.affine.to_gdal(),
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_count); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 475, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_count, __pyx_t_2) < 0) __PYX_ERR(0, 470, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":476
 *             'height': self.height,
 *             'count': self.count,
 *             'crs': self.crs,             # <<<<<<<<<<<<<<
 *             'transform': self.affine.to_gdal(),
 *             'affine': self.affine,
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_crs); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 476, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_crs, __pyx_t_2) < 0) __PYX_ERR(0, 470, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":477
 *             'count': self.count,
 *             'crs': self.crs,
 *             'transform': self.affine.to_gdal(),             # <<<<<<<<<<<<<<
 *             'affine': self.affine,
 *         }
 */
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 477, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_to_gdal); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 477, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
    }
  }
  if (__pyx_t_4) {
    __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 477, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 477, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_transform, __pyx_t_2) < 0) __PYX_ERR(0, 470, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":478
 *             'crs': self.crs,
 *             'transform': self.affine.to_gdal(),
 *             'affine': self.affine,             # <<<<<<<<<<<<<<
 *         }
 *         self._read = True
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_affine); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 478, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_affine, __pyx_t_2) < 0) __PYX_ERR(0, 470, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_m = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":480
 *             'affine': self.affine,
 *         }
 *         self._read = True             # <<<<<<<<<<<<<<
 *         return m
 * 
 */
  __Pyx_INCREF(Py_True);
  __Pyx_GIVEREF(Py_True);
  __Pyx_GOTREF(__pyx_v_self->_read);
  __Pyx_DECREF(__pyx_v_self->_read);
  __pyx_v_self->_read = Py_True;

  /* "rasterio/_base.pyx":481
 *         }
 *         self._read = True
 *         return m             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_m);
  __pyx_r = __pyx_v_m;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":463
 * 
 *     @property
 *     def meta(self):             # <<<<<<<<<<<<<<
 *         """The basic metadata of this dataset."""
 *         if self.count == 0:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.meta.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_dtype);
  __Pyx_XDECREF(__pyx_v_m);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":484
 * 
 *     @property
 *     def compression(self):             # <<<<<<<<<<<<<<
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('COMPRESSION')
 *         if val:
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_11compression_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_11compression_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_11compression___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_11compression___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_v_val = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":485
 *     @property
 *     def compression(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('COMPRESSION')             # <<<<<<<<<<<<<<
 *         if val:
 *             # 'YCbCr JPEG' will be normalized to 'JPEG'
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_tags); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 485, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 485, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_ns, __pyx_n_s_IMAGE_STRUCTURE) < 0) __PYX_ERR(0, 485, __pyx_L1_error)
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 485, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_get); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 485, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__29, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 485, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_val = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":486
 *     def compression(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('COMPRESSION')
 *         if val:             # <<<<<<<<<<<<<<
 *             # 'YCbCr JPEG' will be normalized to 'JPEG'
 *             val = val.split(' ')[-1]
 */
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_val); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 486, __pyx_L1_error)
  if (__pyx_t_4) {

    /* "rasterio/_base.pyx":488
 *         if val:
 *             # 'YCbCr JPEG' will be normalized to 'JPEG'
 *             val = val.split(' ')[-1]             # <<<<<<<<<<<<<<
 *             return Compression(val)
 *         else:
 */
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_val, __pyx_n_s_split); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 488, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__31, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 488, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_2, -1L, long, 1, __Pyx_PyInt_From_long, 0, 1, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 488, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF_SET(__pyx_v_val, __pyx_t_3);
    __pyx_t_3 = 0;

    /* "rasterio/_base.pyx":489
 *             # 'YCbCr JPEG' will be normalized to 'JPEG'
 *             val = val.split(' ')[-1]
 *             return Compression(val)             # <<<<<<<<<<<<<<
 *         else:
 *             return None
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_Compression); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 489, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_1)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_1);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
      }
    }
    if (!__pyx_t_1) {
      __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_val); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 489, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
    } else {
      __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 489, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1); __pyx_t_1 = NULL;
      __Pyx_INCREF(__pyx_v_val);
      __Pyx_GIVEREF(__pyx_v_val);
      PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_v_val);
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 489, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    }
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;

    /* "rasterio/_base.pyx":486
 *     def compression(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('COMPRESSION')
 *         if val:             # <<<<<<<<<<<<<<
 *             # 'YCbCr JPEG' will be normalized to 'JPEG'
 *             val = val.split(' ')[-1]
 */
  }

  /* "rasterio/_base.pyx":491
 *             return Compression(val)
 *         else:
 *             return None             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(Py_None);
    __pyx_r = Py_None;
    goto __pyx_L0;
  }

  /* "rasterio/_base.pyx":484
 * 
 *     @property
 *     def compression(self):             # <<<<<<<<<<<<<<
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('COMPRESSION')
 *         if val:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.compression.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_val);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":494
 * 
 *     @property
 *     def interleaving(self):             # <<<<<<<<<<<<<<
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('INTERLEAVE')
 *         if val:
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_12interleaving_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_12interleaving_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_12interleaving___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_12interleaving___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_v_val = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":495
 *     @property
 *     def interleaving(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('INTERLEAVE')             # <<<<<<<<<<<<<<
 *         if val:
 *             return Interleaving(val)
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_tags); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_ns, __pyx_n_s_IMAGE_STRUCTURE) < 0) __PYX_ERR(0, 495, __pyx_L1_error)
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_get); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__32, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_val = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":496
 *     def interleaving(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('INTERLEAVE')
 *         if val:             # <<<<<<<<<<<<<<
 *             return Interleaving(val)
 *         else:
 */
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_val); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 496, __pyx_L1_error)
  if (__pyx_t_4) {

    /* "rasterio/_base.pyx":497
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('INTERLEAVE')
 *         if val:
 *             return Interleaving(val)             # <<<<<<<<<<<<<<
 *         else:
 *             return None
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_Interleaving); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 497, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_1)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_1);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
      }
    }
    if (!__pyx_t_1) {
      __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_val); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 497, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
    } else {
      __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 497, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1); __pyx_t_1 = NULL;
      __Pyx_INCREF(__pyx_v_val);
      __Pyx_GIVEREF(__pyx_v_val);
      PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_v_val);
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 497, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    }
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;

    /* "rasterio/_base.pyx":496
 *     def interleaving(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('INTERLEAVE')
 *         if val:             # <<<<<<<<<<<<<<
 *             return Interleaving(val)
 *         else:
 */
  }

  /* "rasterio/_base.pyx":499
 *             return Interleaving(val)
 *         else:
 *             return None             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(Py_None);
    __pyx_r = Py_None;
    goto __pyx_L0;
  }

  /* "rasterio/_base.pyx":494
 * 
 *     @property
 *     def interleaving(self):             # <<<<<<<<<<<<<<
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('INTERLEAVE')
 *         if val:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.interleaving.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_val);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":502
 * 
 *     @property
 *     def photometric(self):             # <<<<<<<<<<<<<<
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('SOURCE_COLOR_SPACE')
 *         if val:
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_11photometric_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_11photometric_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_11photometric___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_11photometric___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_v_val = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":503
 *     @property
 *     def photometric(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('SOURCE_COLOR_SPACE')             # <<<<<<<<<<<<<<
 *         if val:
 *             return PhotometricInterp(val)
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_tags); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 503, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 503, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_ns, __pyx_n_s_IMAGE_STRUCTURE) < 0) __PYX_ERR(0, 503, __pyx_L1_error)
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 503, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_get); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 503, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__33, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 503, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_val = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":504
 *     def photometric(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('SOURCE_COLOR_SPACE')
 *         if val:             # <<<<<<<<<<<<<<
 *             return PhotometricInterp(val)
 *         else:
 */
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_val); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 504, __pyx_L1_error)
  if (__pyx_t_4) {

    /* "rasterio/_base.pyx":505
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('SOURCE_COLOR_SPACE')
 *         if val:
 *             return PhotometricInterp(val)             # <<<<<<<<<<<<<<
 *         else:
 *             return None
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_PhotometricInterp); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 505, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_1)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_1);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
      }
    }
    if (!__pyx_t_1) {
      __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_val); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 505, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
    } else {
      __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 505, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1); __pyx_t_1 = NULL;
      __Pyx_INCREF(__pyx_v_val);
      __Pyx_GIVEREF(__pyx_v_val);
      PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_v_val);
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 505, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    }
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;

    /* "rasterio/_base.pyx":504
 *     def photometric(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('SOURCE_COLOR_SPACE')
 *         if val:             # <<<<<<<<<<<<<<
 *             return PhotometricInterp(val)
 *         else:
 */
  }

  /* "rasterio/_base.pyx":507
 *             return PhotometricInterp(val)
 *         else:
 *             return None             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(Py_None);
    __pyx_r = Py_None;
    goto __pyx_L0;
  }

  /* "rasterio/_base.pyx":502
 * 
 *     @property
 *     def photometric(self):             # <<<<<<<<<<<<<<
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('SOURCE_COLOR_SPACE')
 *         if val:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.photometric.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_val);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":510
 * 
 *     @property
 *     def is_tiled(self):             # <<<<<<<<<<<<<<
 *         if len(self.block_shapes) == 0:
 *             return False
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_8is_tiled_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_8is_tiled_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_8is_tiled___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_8is_tiled___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  Py_ssize_t __pyx_t_2;
  int __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":511
 *     @property
 *     def is_tiled(self):
 *         if len(self.block_shapes) == 0:             # <<<<<<<<<<<<<<
 *             return False
 *         return self.block_shapes[0][1] != self.width
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_block_shapes); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 511, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 511, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = ((__pyx_t_2 == 0) != 0);
  if (__pyx_t_3) {

    /* "rasterio/_base.pyx":512
 *     def is_tiled(self):
 *         if len(self.block_shapes) == 0:
 *             return False             # <<<<<<<<<<<<<<
 *         return self.block_shapes[0][1] != self.width
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(Py_False);
    __pyx_r = Py_False;
    goto __pyx_L0;

    /* "rasterio/_base.pyx":511
 *     @property
 *     def is_tiled(self):
 *         if len(self.block_shapes) == 0:             # <<<<<<<<<<<<<<
 *             return False
 *         return self.block_shapes[0][1] != self.width
 */
  }

  /* "rasterio/_base.pyx":513
 *         if len(self.block_shapes) == 0:
 *             return False
 *         return self.block_shapes[0][1] != self.width             # <<<<<<<<<<<<<<
 * 
 *     property profile:
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_block_shapes); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 513, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 513, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_4, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 513, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = PyObject_RichCompare(__pyx_t_1, __pyx_v_self->width, Py_NE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 513, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":510
 * 
 *     @property
 *     def is_tiled(self):             # <<<<<<<<<<<<<<
 *         if len(self.block_shapes) == 0:
 *             return False
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.is_tiled.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":521
 *         create a clone of this dataset.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             m = self.meta
 *             m.update((k, v.lower()) for k, v in self.tags(
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7profile_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7profile_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_7profile___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
static PyObject *__pyx_gb_8rasterio_5_base_13DatasetReader_7profile_7__get___2generator1(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */

/* "rasterio/_base.pyx":523
 *         def __get__(self):
 *             m = self.meta
 *             m.update((k, v.lower()) for k, v in self.tags(             # <<<<<<<<<<<<<<
 *                 ns='rio_creation_kwds').items())
 *             if self.is_tiled:
 */

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7profile_7__get___genexpr(PyObject *__pyx_self) {
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *__pyx_cur_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("genexpr", 0);
  __pyx_cur_scope = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *)__pyx_tp_new_8rasterio_5_base___pyx_scope_struct_2_genexpr(__pyx_ptype_8rasterio_5_base___pyx_scope_struct_2_genexpr, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__ *) __pyx_self;
  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
  {
    __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_8rasterio_5_base_13DatasetReader_7profile_7__get___2generator1, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_DatasetReader___get___locals_gen); if (unlikely(!gen)) __PYX_ERR(0, 523, __pyx_L1_error)
    __Pyx_DECREF(__pyx_cur_scope);
    __Pyx_RefNannyFinishContext();
    return (PyObject *) gen;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.profile.__get__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_gb_8rasterio_5_base_13DatasetReader_7profile_7__get___2generator1(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
{
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *__pyx_cur_scope = ((struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *)__pyx_generator->closure);
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  Py_ssize_t __pyx_t_5;
  PyObject *(*__pyx_t_6)(PyObject *);
  PyObject *__pyx_t_7 = NULL;
  PyObject *(*__pyx_t_8)(PyObject *);
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("None", 0);
  switch (__pyx_generator->resume_label) {
    case 0: goto __pyx_L3_first_run;
    case 1: goto __pyx_L8_resume_from_yield;
    default: /* CPython raises the right error here */
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __pyx_L3_first_run:;
  if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 523, __pyx_L1_error)

  /* "rasterio/_base.pyx":524
 *             m = self.meta
 *             m.update((k, v.lower()) for k, v in self.tags(
 *                 ns='rio_creation_kwds').items())             # <<<<<<<<<<<<<<
 *             if self.is_tiled:
 *                 m.update(
 */
  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); __PYX_ERR(0, 523, __pyx_L1_error) }

  /* "rasterio/_base.pyx":523
 *         def __get__(self):
 *             m = self.meta
 *             m.update((k, v.lower()) for k, v in self.tags(             # <<<<<<<<<<<<<<
 *                 ns='rio_creation_kwds').items())
 *             if self.is_tiled:
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self), __pyx_n_s_tags); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 523, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);

  /* "rasterio/_base.pyx":524
 *             m = self.meta
 *             m.update((k, v.lower()) for k, v in self.tags(
 *                 ns='rio_creation_kwds').items())             # <<<<<<<<<<<<<<
 *             if self.is_tiled:
 *                 m.update(
 */
  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 524, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_ns, __pyx_n_s_rio_creation_kwds) < 0) __PYX_ERR(0, 524, __pyx_L1_error)

  /* "rasterio/_base.pyx":523
 *         def __get__(self):
 *             m = self.meta
 *             m.update((k, v.lower()) for k, v in self.tags(             # <<<<<<<<<<<<<<
 *                 ns='rio_creation_kwds').items())
 *             if self.is_tiled:
 */
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_empty_tuple, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 523, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":524
 *             m = self.meta
 *             m.update((k, v.lower()) for k, v in self.tags(
 *                 ns='rio_creation_kwds').items())             # <<<<<<<<<<<<<<
 *             if self.is_tiled:
 *                 m.update(
 */
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_items); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 524, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  if (__pyx_t_4) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 524, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 524, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":523
 *         def __get__(self):
 *             m = self.meta
 *             m.update((k, v.lower()) for k, v in self.tags(             # <<<<<<<<<<<<<<
 *                 ns='rio_creation_kwds').items())
 *             if self.is_tiled:
 */
  if (likely(PyList_CheckExact(__pyx_t_1)) || PyTuple_CheckExact(__pyx_t_1)) {
    __pyx_t_3 = __pyx_t_1; __Pyx_INCREF(__pyx_t_3); __pyx_t_5 = 0;
    __pyx_t_6 = NULL;
  } else {
    __pyx_t_5 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 523, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_6 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 523, __pyx_L1_error)
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  for (;;) {
    if (likely(!__pyx_t_6)) {
      if (likely(PyList_CheckExact(__pyx_t_3))) {
        if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_3)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(0, 523, __pyx_L1_error)
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 523, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        #endif
      } else {
        if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(0, 523, __pyx_L1_error)
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 523, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        #endif
      }
    } else {
      __pyx_t_1 = __pyx_t_6(__pyx_t_3);
      if (unlikely(!__pyx_t_1)) {
        PyObject* exc_type = PyErr_Occurred();
        if (exc_type) {
          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
          else __PYX_ERR(0, 523, __pyx_L1_error)
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_1);
    }
    if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
      PyObject* sequence = __pyx_t_1;
      #if CYTHON_COMPILING_IN_CPYTHON
      Py_ssize_t size = Py_SIZE(sequence);
      #else
      Py_ssize_t size = PySequence_Size(sequence);
      #endif
      if (unlikely(size != 2)) {
        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
        __PYX_ERR(0, 523, __pyx_L1_error)
      }
      #if CYTHON_COMPILING_IN_CPYTHON
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
        __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
      }
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_2);
      #else
      __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 523, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 523, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      #endif
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    } else {
      Py_ssize_t index = -1;
      __pyx_t_7 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 523, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
      index = 0; __pyx_t_4 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_4)) goto __pyx_L6_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_4);
      index = 1; __pyx_t_2 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_2)) goto __pyx_L6_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_2);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) __PYX_ERR(0, 523, __pyx_L1_error)
      __pyx_t_8 = NULL;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      goto __pyx_L7_unpacking_done;
      __pyx_L6_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __pyx_t_8 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      __PYX_ERR(0, 523, __pyx_L1_error)
      __pyx_L7_unpacking_done:;
    }
    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_k);
    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_k, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_4);
    __pyx_t_4 = 0;
    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_v);
    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_v, __pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_2);
    __pyx_t_2 = 0;
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_v, __pyx_n_s_lower); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 523, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_4)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
      }
    }
    if (__pyx_t_4) {
      __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 523, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    } else {
      __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 523, __pyx_L1_error)
    }
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 523, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_k);
    __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_k);
    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_k);
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_r = __pyx_t_2;
    __pyx_t_2 = 0;
    __Pyx_XGIVEREF(__pyx_t_3);
    __pyx_cur_scope->__pyx_t_0 = __pyx_t_3;
    __pyx_cur_scope->__pyx_t_1 = __pyx_t_5;
    __pyx_cur_scope->__pyx_t_2 = __pyx_t_6;
    __Pyx_XGIVEREF(__pyx_r);
    __Pyx_RefNannyFinishContext();
    /* return from generator, yielding value */
    __pyx_generator->resume_label = 1;
    return __pyx_r;
    __pyx_L8_resume_from_yield:;
    __pyx_t_3 = __pyx_cur_scope->__pyx_t_0;
    __pyx_cur_scope->__pyx_t_0 = 0;
    __Pyx_XGOTREF(__pyx_t_3);
    __pyx_t_5 = __pyx_cur_scope->__pyx_t_1;
    __pyx_t_6 = __pyx_cur_scope->__pyx_t_2;
    if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 523, __pyx_L1_error)
  }
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* function exit code */
  PyErr_SetNone(PyExc_StopIteration);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
  __pyx_generator->resume_label = -1;
  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":521
 *         create a clone of this dataset.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             m = self.meta
 *             m.update((k, v.lower()) for k, v in self.tags(
 */

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7profile___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__ *__pyx_cur_scope;
  PyObject *__pyx_v_m = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  int __pyx_t_6;
  __Pyx_RefNannySetupContext("__get__", 0);
  __pyx_cur_scope = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__ *)__pyx_tp_new_8rasterio_5_base___pyx_scope_struct_1___get__(__pyx_ptype_8rasterio_5_base___pyx_scope_struct_1___get__, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);

  /* "rasterio/_base.pyx":522
 *         """
 *         def __get__(self):
 *             m = self.meta             # <<<<<<<<<<<<<<
 *             m.update((k, v.lower()) for k, v in self.tags(
 *                 ns='rio_creation_kwds').items())
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_meta); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 522, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_m = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":523
 *         def __get__(self):
 *             m = self.meta
 *             m.update((k, v.lower()) for k, v in self.tags(             # <<<<<<<<<<<<<<
 *                 ns='rio_creation_kwds').items())
 *             if self.is_tiled:
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_m, __pyx_n_s_update); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 523, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __pyx_pf_8rasterio_5_base_13DatasetReader_7profile_7__get___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 523, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (!__pyx_t_4) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 523, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 523, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL;
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_3);
    __pyx_t_3 = 0;
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 523, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":525
 *             m.update((k, v.lower()) for k, v in self.tags(
 *                 ns='rio_creation_kwds').items())
 *             if self.is_tiled:             # <<<<<<<<<<<<<<
 *                 m.update(
 *                     blockxsize=self.block_shapes[0][1],
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_is_tiled); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 525, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 525, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_6) {

    /* "rasterio/_base.pyx":526
 *                 ns='rio_creation_kwds').items())
 *             if self.is_tiled:
 *                 m.update(             # <<<<<<<<<<<<<<
 *                     blockxsize=self.block_shapes[0][1],
 *                     blockysize=self.block_shapes[0][0],
 */
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_m, __pyx_n_s_update); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 526, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);

    /* "rasterio/_base.pyx":527
 *             if self.is_tiled:
 *                 m.update(
 *                     blockxsize=self.block_shapes[0][1],             # <<<<<<<<<<<<<<
 *                     blockysize=self.block_shapes[0][0],
 *                     tiled=True)
 */
    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 527, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_block_shapes); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 527, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 527, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_3, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 527, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_blockxsize, __pyx_t_5) < 0) __PYX_ERR(0, 527, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;

    /* "rasterio/_base.pyx":528
 *                 m.update(
 *                     blockxsize=self.block_shapes[0][1],
 *                     blockysize=self.block_shapes[0][0],             # <<<<<<<<<<<<<<
 *                     tiled=True)
 *             else:
 */
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_block_shapes); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 528, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 528, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 528, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_blockysize, __pyx_t_5) < 0) __PYX_ERR(0, 527, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;

    /* "rasterio/_base.pyx":529
 *                     blockxsize=self.block_shapes[0][1],
 *                     blockysize=self.block_shapes[0][0],
 *                     tiled=True)             # <<<<<<<<<<<<<<
 *             else:
 *                 m.update(tiled=False)
 */
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_tiled, Py_True) < 0) __PYX_ERR(0, 527, __pyx_L1_error)

    /* "rasterio/_base.pyx":526
 *                 ns='rio_creation_kwds').items())
 *             if self.is_tiled:
 *                 m.update(             # <<<<<<<<<<<<<<
 *                     blockxsize=self.block_shapes[0][1],
 *                     blockysize=self.block_shapes[0][0],
 */
    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 526, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;

    /* "rasterio/_base.pyx":525
 *             m.update((k, v.lower()) for k, v in self.tags(
 *                 ns='rio_creation_kwds').items())
 *             if self.is_tiled:             # <<<<<<<<<<<<<<
 *                 m.update(
 *                     blockxsize=self.block_shapes[0][1],
 */
    goto __pyx_L3;
  }

  /* "rasterio/_base.pyx":531
 *                     tiled=True)
 *             else:
 *                 m.update(tiled=False)             # <<<<<<<<<<<<<<
 *             if self.compression:
 *                 m['compress'] = self.compression.name
 */
  /*else*/ {
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_m, __pyx_n_s_update); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 531, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 531, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_tiled, Py_False) < 0) __PYX_ERR(0, 531, __pyx_L1_error)
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 531, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }
  __pyx_L3:;

  /* "rasterio/_base.pyx":532
 *             else:
 *                 m.update(tiled=False)
 *             if self.compression:             # <<<<<<<<<<<<<<
 *                 m['compress'] = self.compression.name
 *             if self.interleaving:
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_compression); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 532, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 532, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_6) {

    /* "rasterio/_base.pyx":533
 *                 m.update(tiled=False)
 *             if self.compression:
 *                 m['compress'] = self.compression.name             # <<<<<<<<<<<<<<
 *             if self.interleaving:
 *                 m['interleave'] = self.interleaving.name
 */
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_compression); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 533, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_name); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 533, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(PyObject_SetItem(__pyx_v_m, __pyx_n_s_compress, __pyx_t_2) < 0)) __PYX_ERR(0, 533, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":532
 *             else:
 *                 m.update(tiled=False)
 *             if self.compression:             # <<<<<<<<<<<<<<
 *                 m['compress'] = self.compression.name
 *             if self.interleaving:
 */
  }

  /* "rasterio/_base.pyx":534
 *             if self.compression:
 *                 m['compress'] = self.compression.name
 *             if self.interleaving:             # <<<<<<<<<<<<<<
 *                 m['interleave'] = self.interleaving.name
 *             if self.photometric:
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_interleaving); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 534, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 534, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (__pyx_t_6) {

    /* "rasterio/_base.pyx":535
 *                 m['compress'] = self.compression.name
 *             if self.interleaving:
 *                 m['interleave'] = self.interleaving.name             # <<<<<<<<<<<<<<
 *             if self.photometric:
 *                 m['photometric'] = self.photometric.name
 */
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_interleaving); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 535, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 535, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(PyObject_SetItem(__pyx_v_m, __pyx_n_s_interleave, __pyx_t_1) < 0)) __PYX_ERR(0, 535, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

    /* "rasterio/_base.pyx":534
 *             if self.compression:
 *                 m['compress'] = self.compression.name
 *             if self.interleaving:             # <<<<<<<<<<<<<<
 *                 m['interleave'] = self.interleaving.name
 *             if self.photometric:
 */
  }

  /* "rasterio/_base.pyx":536
 *             if self.interleaving:
 *                 m['interleave'] = self.interleaving.name
 *             if self.photometric:             # <<<<<<<<<<<<<<
 *                 m['photometric'] = self.photometric.name
 *             return m
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_photometric); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 536, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 536, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_6) {

    /* "rasterio/_base.pyx":537
 *                 m['interleave'] = self.interleaving.name
 *             if self.photometric:
 *                 m['photometric'] = self.photometric.name             # <<<<<<<<<<<<<<
 *             return m
 * 
 */
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_photometric); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 537, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_name); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 537, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(PyObject_SetItem(__pyx_v_m, __pyx_n_s_photometric, __pyx_t_2) < 0)) __PYX_ERR(0, 537, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":536
 *             if self.interleaving:
 *                 m['interleave'] = self.interleaving.name
 *             if self.photometric:             # <<<<<<<<<<<<<<
 *                 m['photometric'] = self.photometric.name
 *             return m
 */
  }

  /* "rasterio/_base.pyx":538
 *             if self.photometric:
 *                 m['photometric'] = self.photometric.name
 *             return m             # <<<<<<<<<<<<<<
 * 
 *     def lnglat(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_m);
  __pyx_r = __pyx_v_m;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":521
 *         create a clone of this dataset.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             m = self.meta
 *             m.update((k, v.lower()) for k, v in self.tags(
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.profile.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_m);
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":540
 *             return m
 * 
 *     def lnglat(self):             # <<<<<<<<<<<<<<
 *         w, s, e, n = self.bounds
 *         cx = (w + e)/2.0
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_40lnglat(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_40lnglat(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("lnglat (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_39lnglat(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_39lnglat(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_v_w = NULL;
  PyObject *__pyx_v_s = NULL;
  PyObject *__pyx_v_e = NULL;
  PyObject *__pyx_v_n = NULL;
  PyObject *__pyx_v_cx = NULL;
  PyObject *__pyx_v_cy = NULL;
  PyObject *__pyx_v_lng = NULL;
  PyObject *__pyx_v_lat = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *(*__pyx_t_7)(PyObject *);
  PyObject *__pyx_t_8 = NULL;
  Py_ssize_t __pyx_t_9;
  PyObject *__pyx_t_10 = NULL;
  __Pyx_RefNannySetupContext("lnglat", 0);

  /* "rasterio/_base.pyx":541
 * 
 *     def lnglat(self):
 *         w, s, e, n = self.bounds             # <<<<<<<<<<<<<<
 *         cx = (w + e)/2.0
 *         cy = (s + n)/2.0
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_bounds); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 541, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 4)) {
      if (size > 4) __Pyx_RaiseTooManyValuesError(4);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 541, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 2); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 3); 
    } else {
      __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
      __pyx_t_4 = PyList_GET_ITEM(sequence, 2); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 3); 
    }
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_5);
    #else
    {
      Py_ssize_t i;
      PyObject** temps[4] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5};
      for (i=0; i < 4; i++) {
        PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) __PYX_ERR(0, 541, __pyx_L1_error)
        __Pyx_GOTREF(item);
        *(temps[i]) = item;
      }
    }
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    PyObject** temps[4] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5};
    __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 541, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext;
    for (index=0; index < 4; index++) {
      PyObject* item = __pyx_t_7(__pyx_t_6); if (unlikely(!item)) goto __pyx_L3_unpacking_failed;
      __Pyx_GOTREF(item);
      *(temps[index]) = item;
    }
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 4) < 0) __PYX_ERR(0, 541, __pyx_L1_error)
    __pyx_t_7 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_7 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 541, __pyx_L1_error)
    __pyx_L4_unpacking_done:;
  }
  __pyx_v_w = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_s = __pyx_t_3;
  __pyx_t_3 = 0;
  __pyx_v_e = __pyx_t_4;
  __pyx_t_4 = 0;
  __pyx_v_n = __pyx_t_5;
  __pyx_t_5 = 0;

  /* "rasterio/_base.pyx":542
 *     def lnglat(self):
 *         w, s, e, n = self.bounds
 *         cx = (w + e)/2.0             # <<<<<<<<<<<<<<
 *         cy = (s + n)/2.0
 *         lng, lat = _transform(
 */
  __pyx_t_1 = PyNumber_Add(__pyx_v_w, __pyx_v_e); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 542, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_5 = __Pyx_PyFloat_DivideObjC(__pyx_t_1, __pyx_float_2_0, 2.0, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 542, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_cx = __pyx_t_5;
  __pyx_t_5 = 0;

  /* "rasterio/_base.pyx":543
 *         w, s, e, n = self.bounds
 *         cx = (w + e)/2.0
 *         cy = (s + n)/2.0             # <<<<<<<<<<<<<<
 *         lng, lat = _transform(
 *                 self.crs, {'init': 'epsg:4326'}, [cx], [cy], None)
 */
  __pyx_t_5 = PyNumber_Add(__pyx_v_s, __pyx_v_n); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 543, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_1 = __Pyx_PyFloat_DivideObjC(__pyx_t_5, __pyx_float_2_0, 2.0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 543, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_cy = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":544
 *         cx = (w + e)/2.0
 *         cy = (s + n)/2.0
 *         lng, lat = _transform(             # <<<<<<<<<<<<<<
 *                 self.crs, {'init': 'epsg:4326'}, [cx], [cy], None)
 *         return lng.pop(), lat.pop()
 */
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_transform_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 544, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);

  /* "rasterio/_base.pyx":545
 *         cy = (s + n)/2.0
 *         lng, lat = _transform(
 *                 self.crs, {'init': 'epsg:4326'}, [cx], [cy], None)             # <<<<<<<<<<<<<<
 *         return lng.pop(), lat.pop()
 * 
 */
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_crs); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 545, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 545, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_init, __pyx_kp_s_epsg_4326) < 0) __PYX_ERR(0, 545, __pyx_L1_error)
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 545, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_cx);
  __Pyx_GIVEREF(__pyx_v_cx);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_v_cx);
  __pyx_t_6 = PyList_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 545, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_INCREF(__pyx_v_cy);
  __Pyx_GIVEREF(__pyx_v_cy);
  PyList_SET_ITEM(__pyx_t_6, 0, __pyx_v_cy);
  __pyx_t_8 = NULL;
  __pyx_t_9 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_8)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_8);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
      __pyx_t_9 = 1;
    }
  }
  __pyx_t_10 = PyTuple_New(5+__pyx_t_9); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 544, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  if (__pyx_t_8) {
    __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_8); __pyx_t_8 = NULL;
  }
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_10, 0+__pyx_t_9, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_10, 1+__pyx_t_9, __pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_10, 2+__pyx_t_9, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_6);
  PyTuple_SET_ITEM(__pyx_t_10, 3+__pyx_t_9, __pyx_t_6);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_10, 4+__pyx_t_9, Py_None);
  __pyx_t_4 = 0;
  __pyx_t_3 = 0;
  __pyx_t_2 = 0;
  __pyx_t_6 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_10, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 544, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 544, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_10 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_10 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_10);
    #else
    __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 544, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_10 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 544, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_10);
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 544, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    index = 1; __pyx_t_10 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_10)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_10);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) __PYX_ERR(0, 544, __pyx_L1_error)
    __pyx_t_7 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L6_unpacking_done;
    __pyx_L5_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_7 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 544, __pyx_L1_error)
    __pyx_L6_unpacking_done:;
  }

  /* "rasterio/_base.pyx":544
 *         cx = (w + e)/2.0
 *         cy = (s + n)/2.0
 *         lng, lat = _transform(             # <<<<<<<<<<<<<<
 *                 self.crs, {'init': 'epsg:4326'}, [cx], [cy], None)
 *         return lng.pop(), lat.pop()
 */
  __pyx_v_lng = __pyx_t_5;
  __pyx_t_5 = 0;
  __pyx_v_lat = __pyx_t_10;
  __pyx_t_10 = 0;

  /* "rasterio/_base.pyx":546
 *         lng, lat = _transform(
 *                 self.crs, {'init': 'epsg:4326'}, [cx], [cy], None)
 *         return lng.pop(), lat.pop()             # <<<<<<<<<<<<<<
 * 
 *     def get_crs(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_Pop(__pyx_v_lng); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 546, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_10 = __Pyx_PyObject_Pop(__pyx_v_lat); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 546, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 546, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_10);
  PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_10);
  __pyx_t_1 = 0;
  __pyx_t_10 = 0;
  __pyx_r = __pyx_t_5;
  __pyx_t_5 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":540
 *             return m
 * 
 *     def lnglat(self):             # <<<<<<<<<<<<<<
 *         w, s, e, n = self.bounds
 *         cx = (w + e)/2.0
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.lnglat", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_w);
  __Pyx_XDECREF(__pyx_v_s);
  __Pyx_XDECREF(__pyx_v_e);
  __Pyx_XDECREF(__pyx_v_n);
  __Pyx_XDECREF(__pyx_v_cx);
  __Pyx_XDECREF(__pyx_v_cy);
  __Pyx_XDECREF(__pyx_v_lng);
  __Pyx_XDECREF(__pyx_v_lat);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":548
 *         return lng.pop(), lat.pop()
 * 
 *     def get_crs(self):             # <<<<<<<<<<<<<<
 *         # _read tells us that the CRS was read before and really is
 *         # None.
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_42get_crs(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_42get_crs(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("get_crs (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_41get_crs(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_41get_crs(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  int __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  __Pyx_RefNannySetupContext("get_crs", 0);

  /* "rasterio/_base.pyx":551
 *         # _read tells us that the CRS was read before and really is
 *         # None.
 *         if not self._read and self._crs is None:             # <<<<<<<<<<<<<<
 *             self._crs = self.read_crs()
 *         return self._crs
 */
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_self->_read); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 551, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_2) != 0);
  if (__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_3 = (__pyx_v_self->_crs == Py_None);
  __pyx_t_2 = (__pyx_t_3 != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":552
 *         # None.
 *         if not self._read and self._crs is None:
 *             self._crs = self.read_crs()             # <<<<<<<<<<<<<<
 *         return self._crs
 * 
 */
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_read_crs); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 552, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
      if (likely(__pyx_t_6)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
        __Pyx_INCREF(__pyx_t_6);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_5, function);
      }
    }
    if (__pyx_t_6) {
      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 552, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    } else {
      __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 552, __pyx_L1_error)
    }
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_GIVEREF(__pyx_t_4);
    __Pyx_GOTREF(__pyx_v_self->_crs);
    __Pyx_DECREF(__pyx_v_self->_crs);
    __pyx_v_self->_crs = __pyx_t_4;
    __pyx_t_4 = 0;

    /* "rasterio/_base.pyx":551
 *         # _read tells us that the CRS was read before and really is
 *         # None.
 *         if not self._read and self._crs is None:             # <<<<<<<<<<<<<<
 *             self._crs = self.read_crs()
 *         return self._crs
 */
  }

  /* "rasterio/_base.pyx":553
 *         if not self._read and self._crs is None:
 *             self._crs = self.read_crs()
 *         return self._crs             # <<<<<<<<<<<<<<
 * 
 *     property crs:
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_crs);
  __pyx_r = __pyx_v_self->_crs;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":548
 *         return lng.pop(), lat.pop()
 * 
 *     def get_crs(self):             # <<<<<<<<<<<<<<
 *         # _read tells us that the CRS was read before and really is
 *         # None.
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.get_crs", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":558
 *         """A mapping of PROJ.4 coordinate reference system params.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             return self.get_crs()
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_3crs_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_3crs_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_3crs___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_3crs___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":559
 *         """
 *         def __get__(self):
 *             return self.get_crs()             # <<<<<<<<<<<<<<
 * 
 *     property crs_wkt:
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_crs); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 559, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 559, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 559, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":558
 *         """A mapping of PROJ.4 coordinate reference system params.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             return self.get_crs()
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.crs.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":565
 *         system.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             if not self._read and self._crs_wkt is None:
 *                 self._crs = self.read_crs_wkt()
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7crs_wkt_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7crs_wkt_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_7crs_wkt___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7crs_wkt___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  int __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":566
 *         """
 *         def __get__(self):
 *             if not self._read and self._crs_wkt is None:             # <<<<<<<<<<<<<<
 *                 self._crs = self.read_crs_wkt()
 *             return self._crs_wkt
 */
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_self->_read); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 566, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_2) != 0);
  if (__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_3 = (__pyx_v_self->_crs_wkt == Py_None);
  __pyx_t_2 = (__pyx_t_3 != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":567
 *         def __get__(self):
 *             if not self._read and self._crs_wkt is None:
 *                 self._crs = self.read_crs_wkt()             # <<<<<<<<<<<<<<
 *             return self._crs_wkt
 * 
 */
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_read_crs_wkt); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 567, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
      if (likely(__pyx_t_6)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
        __Pyx_INCREF(__pyx_t_6);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_5, function);
      }
    }
    if (__pyx_t_6) {
      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 567, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    } else {
      __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 567, __pyx_L1_error)
    }
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_GIVEREF(__pyx_t_4);
    __Pyx_GOTREF(__pyx_v_self->_crs);
    __Pyx_DECREF(__pyx_v_self->_crs);
    __pyx_v_self->_crs = __pyx_t_4;
    __pyx_t_4 = 0;

    /* "rasterio/_base.pyx":566
 *         """
 *         def __get__(self):
 *             if not self._read and self._crs_wkt is None:             # <<<<<<<<<<<<<<
 *                 self._crs = self.read_crs_wkt()
 *             return self._crs_wkt
 */
  }

  /* "rasterio/_base.pyx":568
 *             if not self._read and self._crs_wkt is None:
 *                 self._crs = self.read_crs_wkt()
 *             return self._crs_wkt             # <<<<<<<<<<<<<<
 * 
 *     def get_transform(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_crs_wkt);
  __pyx_r = __pyx_v_self->_crs_wkt;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":565
 *         system.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             if not self._read and self._crs_wkt is None:
 *                 self._crs = self.read_crs_wkt()
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.crs_wkt.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":570
 *             return self._crs_wkt
 * 
 *     def get_transform(self):             # <<<<<<<<<<<<<<
 *         """Returns a GDAL geotransform in its native form."""
 *         if not self._read and self._transform is None:
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_44get_transform(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_43get_transform[] = "Returns a GDAL geotransform in its native form.";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_44get_transform(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("get_transform (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_43get_transform(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_43get_transform(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  int __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  __Pyx_RefNannySetupContext("get_transform", 0);

  /* "rasterio/_base.pyx":572
 *     def get_transform(self):
 *         """Returns a GDAL geotransform in its native form."""
 *         if not self._read and self._transform is None:             # <<<<<<<<<<<<<<
 *             self._transform = self.read_transform()
 *         return self._transform
 */
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_self->_read); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 572, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_2) != 0);
  if (__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_3 = (__pyx_v_self->_transform == Py_None);
  __pyx_t_2 = (__pyx_t_3 != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":573
 *         """Returns a GDAL geotransform in its native form."""
 *         if not self._read and self._transform is None:
 *             self._transform = self.read_transform()             # <<<<<<<<<<<<<<
 *         return self._transform
 * 
 */
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_read_transform); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 573, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
      if (likely(__pyx_t_6)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
        __Pyx_INCREF(__pyx_t_6);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_5, function);
      }
    }
    if (__pyx_t_6) {
      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 573, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    } else {
      __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 573, __pyx_L1_error)
    }
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_GIVEREF(__pyx_t_4);
    __Pyx_GOTREF(__pyx_v_self->_transform);
    __Pyx_DECREF(__pyx_v_self->_transform);
    __pyx_v_self->_transform = __pyx_t_4;
    __pyx_t_4 = 0;

    /* "rasterio/_base.pyx":572
 *     def get_transform(self):
 *         """Returns a GDAL geotransform in its native form."""
 *         if not self._read and self._transform is None:             # <<<<<<<<<<<<<<
 *             self._transform = self.read_transform()
 *         return self._transform
 */
  }

  /* "rasterio/_base.pyx":574
 *         if not self._read and self._transform is None:
 *             self._transform = self.read_transform()
 *         return self._transform             # <<<<<<<<<<<<<<
 * 
 *     property transform:
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_transform);
  __pyx_r = __pyx_v_self->_transform;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":570
 *             return self._crs_wkt
 * 
 *     def get_transform(self):             # <<<<<<<<<<<<<<
 *         """Returns a GDAL geotransform in its native form."""
 *         if not self._read and self._transform is None:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.get_transform", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":595
 *         for more details.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             warnings.warn(
 *                     "The value of this property will change in version 1.0. "
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_9transform_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_9transform_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_9transform___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_9transform___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":596
 *         """
 *         def __get__(self):
 *             warnings.warn(             # <<<<<<<<<<<<<<
 *                     "The value of this property will change in version 1.0. "
 *                     "Please see https://github.com/mapbox/rasterio/issues/86 "
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_warnings); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 596, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_warn); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 596, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":600
 *                     "Please see https://github.com/mapbox/rasterio/issues/86 "
 *                     "for details.",
 *                     FutureWarning,             # <<<<<<<<<<<<<<
 *                     stacklevel=2)
 *             return self.get_transform()
 */
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 596, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_kp_s_The_value_of_this_property_will);
  __Pyx_GIVEREF(__pyx_kp_s_The_value_of_this_property_will);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_kp_s_The_value_of_this_property_will);
  __Pyx_INCREF(__pyx_builtin_FutureWarning);
  __Pyx_GIVEREF(__pyx_builtin_FutureWarning);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_builtin_FutureWarning);

  /* "rasterio/_base.pyx":601
 *                     "for details.",
 *                     FutureWarning,
 *                     stacklevel=2)             # <<<<<<<<<<<<<<
 *             return self.get_transform()
 * 
 */
  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 601, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_stacklevel, __pyx_int_2) < 0) __PYX_ERR(0, 601, __pyx_L1_error)

  /* "rasterio/_base.pyx":596
 *         """
 *         def __get__(self):
 *             warnings.warn(             # <<<<<<<<<<<<<<
 *                     "The value of this property will change in version 1.0. "
 *                     "Please see https://github.com/mapbox/rasterio/issues/86 "
 */
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 596, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;

  /* "rasterio/_base.pyx":602
 *                     FutureWarning,
 *                     stacklevel=2)
 *             return self.get_transform()             # <<<<<<<<<<<<<<
 * 
 *     property affine:
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_transform); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 602, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_1)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_1);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  if (__pyx_t_1) {
    __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 602, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 602, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":595
 *         for more details.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             warnings.warn(
 *                     "The value of this property will change in version 1.0. "
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.transform.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":609
 *         (above) for more details.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             return Affine.from_gdal(*self.get_transform())
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6affine_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6affine_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6affine___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6affine___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":610
 *         """
 *         def __get__(self):
 *             return Affine.from_gdal(*self.get_transform())             # <<<<<<<<<<<<<<
 * 
 *     def tags(self, bidx=0, ns=None):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_Affine); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 610, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_from_gdal); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 610, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_get_transform); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 610, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  if (__pyx_t_4) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 610, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 610, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PySequence_Tuple(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 610, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 610, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":609
 *         (above) for more details.
 *         """
 *         def __get__(self):             # <<<<<<<<<<<<<<
 *             return Affine.from_gdal(*self.get_transform())
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.affine.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":612
 *             return Affine.from_gdal(*self.get_transform())
 * 
 *     def tags(self, bidx=0, ns=None):             # <<<<<<<<<<<<<<
 *         """Returns a dict containing copies of the dataset or band's
 *         tags.
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_46tags(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_45tags[] = "Returns a dict containing copies of the dataset or band's\n        tags.\n\n        Tags are pairs of key and value strings. Tags belong to\n        namespaces.  The standard namespaces are: default (None) and\n        'IMAGE_STRUCTURE'.  Applications can create their own additional\n        namespaces.\n\n        The optional bidx argument can be used to select the tags of\n        a specific band. The optional ns argument can be used to select\n        a namespace other than the default.\n        ";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_46tags(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_bidx = 0;
  PyObject *__pyx_v_ns = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("tags (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_bidx,&__pyx_n_s_ns,0};
    PyObject* values[2] = {0,0};
    values[0] = ((PyObject *)__pyx_int_0);
    values[1] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_bidx);
          if (value) { values[0] = value; kw_args--; }
        }
        case  1:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_ns);
          if (value) { values[1] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "tags") < 0)) __PYX_ERR(0, 612, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_bidx = values[0];
    __pyx_v_ns = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("tags", 0, 0, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 612, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.tags", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_45tags(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), __pyx_v_bidx, __pyx_v_ns);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_45tags(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx, PyObject *__pyx_v_ns) {
  char *__pyx_v_item_c;
  void *__pyx_v_hobj;
  char const *__pyx_v_domain_c;
  char **__pyx_v_papszStrList;
  PyObject *__pyx_v_domain_b = NULL;
  int __pyx_v_num_items;
  PyObject *__pyx_v_retval = NULL;
  int __pyx_v_i;
  char *__pyx_v_item_b;
  PyObject *__pyx_v_item = NULL;
  PyObject *__pyx_v_key = NULL;
  PyObject *__pyx_v_value = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_t_2;
  int __pyx_t_3;
  void *__pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  char const *__pyx_t_6;
  int __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *(*__pyx_t_10)(PyObject *);
  __Pyx_RefNannySetupContext("tags", 0);

  /* "rasterio/_base.pyx":630
 *         cdef char **papszStrList
 * 
 *         if bidx > 0:             # <<<<<<<<<<<<<<
 *             hobj = self.band(bidx)
 *         else:
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_bidx, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 630, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 630, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_2) {

    /* "rasterio/_base.pyx":631
 * 
 *         if bidx > 0:
 *             hobj = self.band(bidx)             # <<<<<<<<<<<<<<
 *         else:
 *             hobj = self._hds
 */
    __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_v_bidx); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 631, __pyx_L1_error)
    __pyx_t_4 = ((struct __pyx_vtabstruct_8rasterio_5_base_DatasetReader *)__pyx_v_self->__pyx_vtab)->band(__pyx_v_self, __pyx_t_3); if (unlikely(__pyx_t_4 == NULL)) __PYX_ERR(0, 631, __pyx_L1_error)
    __pyx_v_hobj = __pyx_t_4;

    /* "rasterio/_base.pyx":630
 *         cdef char **papszStrList
 * 
 *         if bidx > 0:             # <<<<<<<<<<<<<<
 *             hobj = self.band(bidx)
 *         else:
 */
    goto __pyx_L3;
  }

  /* "rasterio/_base.pyx":633
 *             hobj = self.band(bidx)
 *         else:
 *             hobj = self._hds             # <<<<<<<<<<<<<<
 *         if ns:
 *             domain_b = ns.encode('utf-8')
 */
  /*else*/ {
    __pyx_t_4 = __pyx_v_self->_hds;
    __pyx_v_hobj = __pyx_t_4;
  }
  __pyx_L3:;

  /* "rasterio/_base.pyx":634
 *         else:
 *             hobj = self._hds
 *         if ns:             # <<<<<<<<<<<<<<
 *             domain_b = ns.encode('utf-8')
 *             domain_c = domain_b
 */
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_ns); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 634, __pyx_L1_error)
  if (__pyx_t_2) {

    /* "rasterio/_base.pyx":635
 *             hobj = self._hds
 *         if ns:
 *             domain_b = ns.encode('utf-8')             # <<<<<<<<<<<<<<
 *             domain_c = domain_b
 *         else:
 */
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_ns, __pyx_n_s_encode); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 635, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__34, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 635, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_v_domain_b = __pyx_t_5;
    __pyx_t_5 = 0;

    /* "rasterio/_base.pyx":636
 *         if ns:
 *             domain_b = ns.encode('utf-8')
 *             domain_c = domain_b             # <<<<<<<<<<<<<<
 *         else:
 *             domain_c = NULL
 */
    __pyx_t_6 = __Pyx_PyObject_AsString(__pyx_v_domain_b); if (unlikely((!__pyx_t_6) && PyErr_Occurred())) __PYX_ERR(0, 636, __pyx_L1_error)
    __pyx_v_domain_c = __pyx_t_6;

    /* "rasterio/_base.pyx":634
 *         else:
 *             hobj = self._hds
 *         if ns:             # <<<<<<<<<<<<<<
 *             domain_b = ns.encode('utf-8')
 *             domain_c = domain_b
 */
    goto __pyx_L4;
  }

  /* "rasterio/_base.pyx":638
 *             domain_c = domain_b
 *         else:
 *             domain_c = NULL             # <<<<<<<<<<<<<<
 *         papszStrList = _gdal.GDALGetMetadata(hobj, domain_c)
 *         num_items = _gdal.CSLCount(papszStrList)
 */
  /*else*/ {
    __pyx_v_domain_c = NULL;
  }
  __pyx_L4:;

  /* "rasterio/_base.pyx":639
 *         else:
 *             domain_c = NULL
 *         papszStrList = _gdal.GDALGetMetadata(hobj, domain_c)             # <<<<<<<<<<<<<<
 *         num_items = _gdal.CSLCount(papszStrList)
 *         retval = {}
 */
  __pyx_v_papszStrList = GDALGetMetadata(__pyx_v_hobj, __pyx_v_domain_c);

  /* "rasterio/_base.pyx":640
 *             domain_c = NULL
 *         papszStrList = _gdal.GDALGetMetadata(hobj, domain_c)
 *         num_items = _gdal.CSLCount(papszStrList)             # <<<<<<<<<<<<<<
 *         retval = {}
 *         for i in range(num_items):
 */
  __pyx_v_num_items = CSLCount(__pyx_v_papszStrList);

  /* "rasterio/_base.pyx":641
 *         papszStrList = _gdal.GDALGetMetadata(hobj, domain_c)
 *         num_items = _gdal.CSLCount(papszStrList)
 *         retval = {}             # <<<<<<<<<<<<<<
 *         for i in range(num_items):
 *             item_c = papszStrList[i]
 */
  __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 641, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_v_retval = ((PyObject*)__pyx_t_5);
  __pyx_t_5 = 0;

  /* "rasterio/_base.pyx":642
 *         num_items = _gdal.CSLCount(papszStrList)
 *         retval = {}
 *         for i in range(num_items):             # <<<<<<<<<<<<<<
 *             item_c = papszStrList[i]
 *             item_b = item_c
 */
  __pyx_t_3 = __pyx_v_num_items;
  for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_3; __pyx_t_7+=1) {
    __pyx_v_i = __pyx_t_7;

    /* "rasterio/_base.pyx":643
 *         retval = {}
 *         for i in range(num_items):
 *             item_c = papszStrList[i]             # <<<<<<<<<<<<<<
 *             item_b = item_c
 *             item = item_b.decode('utf-8')
 */
    __pyx_v_item_c = (__pyx_v_papszStrList[__pyx_v_i]);

    /* "rasterio/_base.pyx":644
 *         for i in range(num_items):
 *             item_c = papszStrList[i]
 *             item_b = item_c             # <<<<<<<<<<<<<<
 *             item = item_b.decode('utf-8')
 *             key, value = item.split('=', 1)
 */
    __pyx_v_item_b = __pyx_v_item_c;

    /* "rasterio/_base.pyx":645
 *             item_c = papszStrList[i]
 *             item_b = item_c
 *             item = item_b.decode('utf-8')             # <<<<<<<<<<<<<<
 *             key, value = item.split('=', 1)
 *             retval[key] = value
 */
    __pyx_t_5 = __Pyx_decode_c_string(__pyx_v_item_b, 0, strlen(__pyx_v_item_b), NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 645, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_5);
    __pyx_t_5 = 0;

    /* "rasterio/_base.pyx":646
 *             item_b = item_c
 *             item = item_b.decode('utf-8')
 *             key, value = item.split('=', 1)             # <<<<<<<<<<<<<<
 *             retval[key] = value
 *         return retval
 */
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_item, __pyx_n_s_split); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 646, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple__35, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 646, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
      PyObject* sequence = __pyx_t_1;
      #if CYTHON_COMPILING_IN_CPYTHON
      Py_ssize_t size = Py_SIZE(sequence);
      #else
      Py_ssize_t size = PySequence_Size(sequence);
      #endif
      if (unlikely(size != 2)) {
        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
        __PYX_ERR(0, 646, __pyx_L1_error)
      }
      #if CYTHON_COMPILING_IN_CPYTHON
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_8 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
        __pyx_t_8 = PyList_GET_ITEM(sequence, 1); 
      }
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_8);
      #else
      __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 646, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_8 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 646, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      #endif
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    } else {
      Py_ssize_t index = -1;
      __pyx_t_9 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 646, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_10 = Py_TYPE(__pyx_t_9)->tp_iternext;
      index = 0; __pyx_t_5 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_5)) goto __pyx_L7_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_5);
      index = 1; __pyx_t_8 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L7_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_8);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_10(__pyx_t_9), 2) < 0) __PYX_ERR(0, 646, __pyx_L1_error)
      __pyx_t_10 = NULL;
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      goto __pyx_L8_unpacking_done;
      __pyx_L7_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __pyx_t_10 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      __PYX_ERR(0, 646, __pyx_L1_error)
      __pyx_L8_unpacking_done:;
    }
    __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_5);
    __pyx_t_5 = 0;
    __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_8);
    __pyx_t_8 = 0;

    /* "rasterio/_base.pyx":647
 *             item = item_b.decode('utf-8')
 *             key, value = item.split('=', 1)
 *             retval[key] = value             # <<<<<<<<<<<<<<
 *         return retval
 * 
 */
    if (unlikely(PyDict_SetItem(__pyx_v_retval, __pyx_v_key, __pyx_v_value) < 0)) __PYX_ERR(0, 647, __pyx_L1_error)
  }

  /* "rasterio/_base.pyx":648
 *             key, value = item.split('=', 1)
 *             retval[key] = value
 *         return retval             # <<<<<<<<<<<<<<
 * 
 *     def colorinterp(self, bidx):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_retval);
  __pyx_r = __pyx_v_retval;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":612
 *             return Affine.from_gdal(*self.get_transform())
 * 
 *     def tags(self, bidx=0, ns=None):             # <<<<<<<<<<<<<<
 *         """Returns a dict containing copies of the dataset or band's
 *         tags.
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.tags", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_domain_b);
  __Pyx_XDECREF(__pyx_v_retval);
  __Pyx_XDECREF(__pyx_v_item);
  __Pyx_XDECREF(__pyx_v_key);
  __Pyx_XDECREF(__pyx_v_value);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":650
 *         return retval
 * 
 *     def colorinterp(self, bidx):             # <<<<<<<<<<<<<<
 *         """Returns the color interpretation for a band or None."""
 *         cdef void *hBand
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_48colorinterp(PyObject *__pyx_v_self, PyObject *__pyx_v_bidx); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_47colorinterp[] = "Returns the color interpretation for a band or None.";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_48colorinterp(PyObject *__pyx_v_self, PyObject *__pyx_v_bidx) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("colorinterp (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_47colorinterp(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_bidx));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_47colorinterp(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx) {
  void *__pyx_v_hBand;
  int __pyx_v_value;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  __Pyx_RefNannySetupContext("colorinterp", 0);

  /* "rasterio/_base.pyx":654
 *         cdef void *hBand
 * 
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *           raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:
 */
  __pyx_t_1 = ((__pyx_v_self->_hds == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":655
 * 
 *         if self._hds == NULL:
 *           raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__36, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 655, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 655, __pyx_L1_error)

    /* "rasterio/_base.pyx":654
 *         cdef void *hBand
 * 
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *           raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:
 */
  }

  /* "rasterio/_base.pyx":656
 *         if self._hds == NULL:
 *           raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:             # <<<<<<<<<<<<<<
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_indexes); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 656, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = (__Pyx_PySequence_ContainsTF(__pyx_v_bidx, __pyx_t_2, Py_NE)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 656, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_3 = (__pyx_t_1 != 0);
  if (__pyx_t_3) {

    /* "rasterio/_base.pyx":657
 *           raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")             # <<<<<<<<<<<<<<
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__37, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 657, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 657, __pyx_L1_error)

    /* "rasterio/_base.pyx":656
 *         if self._hds == NULL:
 *           raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:             # <<<<<<<<<<<<<<
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
  }

  /* "rasterio/_base.pyx":658
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)             # <<<<<<<<<<<<<<
 *         if hBand == NULL:
 *             raise ValueError("NULL band")
 */
  __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_bidx); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 658, __pyx_L1_error)
  __pyx_v_hBand = GDALGetRasterBand(__pyx_v_self->_hds, __pyx_t_4);

  /* "rasterio/_base.pyx":659
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("NULL band")
 *         value = _gdal.GDALGetRasterColorInterpretation(hBand)
 */
  __pyx_t_3 = ((__pyx_v_hBand == NULL) != 0);
  if (__pyx_t_3) {

    /* "rasterio/_base.pyx":660
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:
 *             raise ValueError("NULL band")             # <<<<<<<<<<<<<<
 *         value = _gdal.GDALGetRasterColorInterpretation(hBand)
 *         return ColorInterp(value)
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__38, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 660, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 660, __pyx_L1_error)

    /* "rasterio/_base.pyx":659
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("NULL band")
 *         value = _gdal.GDALGetRasterColorInterpretation(hBand)
 */
  }

  /* "rasterio/_base.pyx":661
 *         if hBand == NULL:
 *             raise ValueError("NULL band")
 *         value = _gdal.GDALGetRasterColorInterpretation(hBand)             # <<<<<<<<<<<<<<
 *         return ColorInterp(value)
 * 
 */
  __pyx_v_value = GDALGetRasterColorInterpretation(__pyx_v_hBand);

  /* "rasterio/_base.pyx":662
 *             raise ValueError("NULL band")
 *         value = _gdal.GDALGetRasterColorInterpretation(hBand)
 *         return ColorInterp(value)             # <<<<<<<<<<<<<<
 * 
 *     def colormap(self, bidx):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_ColorInterp); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 662, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_value); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 662, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_7 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_7)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_7);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
    }
  }
  if (!__pyx_t_7) {
    __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 662, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_GOTREF(__pyx_t_2);
  } else {
    __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 662, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_7); __pyx_t_7 = NULL;
    __Pyx_GIVEREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_8, 0+1, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_8, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 662, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  }
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":650
 *         return retval
 * 
 *     def colorinterp(self, bidx):             # <<<<<<<<<<<<<<
 *         """Returns the color interpretation for a band or None."""
 *         cdef void *hBand
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.colorinterp", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":664
 *         return ColorInterp(value)
 * 
 *     def colormap(self, bidx):             # <<<<<<<<<<<<<<
 *         """Returns a dict containing the colormap for a band or None."""
 *         cdef void *hBand
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_50colormap(PyObject *__pyx_v_self, PyObject *__pyx_v_bidx); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_49colormap[] = "Returns a dict containing the colormap for a band or None.";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_50colormap(PyObject *__pyx_v_self, PyObject *__pyx_v_bidx) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("colormap (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_49colormap(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_bidx));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_49colormap(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx) {
  void *__pyx_v_hBand;
  void *__pyx_v_hTable;
  int __pyx_v_i;
  GDALColorEntry const *__pyx_v_color;
  PyObject *__pyx_v_retval = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  Py_ssize_t __pyx_t_9;
  PyObject *__pyx_t_10 = NULL;
  PyObject *__pyx_t_11 = NULL;
  PyObject *__pyx_t_12 = NULL;
  PyObject *__pyx_t_13 = NULL;
  __Pyx_RefNannySetupContext("colormap", 0);

  /* "rasterio/_base.pyx":670
 *         cdef int i
 *         cdef const _gdal.GDALColorEntry * color
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:
 */
  __pyx_t_1 = ((__pyx_v_self->_hds == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":671
 *         cdef const _gdal.GDALColorEntry * color
 *         if self._hds == NULL:
 *             raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__39, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 671, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 671, __pyx_L1_error)

    /* "rasterio/_base.pyx":670
 *         cdef int i
 *         cdef const _gdal.GDALColorEntry * color
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:
 */
  }

  /* "rasterio/_base.pyx":672
 *         if self._hds == NULL:
 *             raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:             # <<<<<<<<<<<<<<
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_indexes); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 672, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = (__Pyx_PySequence_ContainsTF(__pyx_v_bidx, __pyx_t_2, Py_NE)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 672, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_3 = (__pyx_t_1 != 0);
  if (__pyx_t_3) {

    /* "rasterio/_base.pyx":673
 *             raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")             # <<<<<<<<<<<<<<
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__40, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 673, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 673, __pyx_L1_error)

    /* "rasterio/_base.pyx":672
 *         if self._hds == NULL:
 *             raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:             # <<<<<<<<<<<<<<
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
  }

  /* "rasterio/_base.pyx":674
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)             # <<<<<<<<<<<<<<
 *         if hBand == NULL:
 *             raise ValueError("NULL band")
 */
  __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_bidx); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 674, __pyx_L1_error)
  __pyx_v_hBand = GDALGetRasterBand(__pyx_v_self->_hds, __pyx_t_4);

  /* "rasterio/_base.pyx":675
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("NULL band")
 *         hTable = _gdal.GDALGetRasterColorTable(hBand)
 */
  __pyx_t_3 = ((__pyx_v_hBand == NULL) != 0);
  if (__pyx_t_3) {

    /* "rasterio/_base.pyx":676
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:
 *             raise ValueError("NULL band")             # <<<<<<<<<<<<<<
 *         hTable = _gdal.GDALGetRasterColorTable(hBand)
 *         if hTable == NULL:
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__41, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 676, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 676, __pyx_L1_error)

    /* "rasterio/_base.pyx":675
 *             raise ValueError("Invalid band index")
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("NULL band")
 *         hTable = _gdal.GDALGetRasterColorTable(hBand)
 */
  }

  /* "rasterio/_base.pyx":677
 *         if hBand == NULL:
 *             raise ValueError("NULL band")
 *         hTable = _gdal.GDALGetRasterColorTable(hBand)             # <<<<<<<<<<<<<<
 *         if hTable == NULL:
 *             raise ValueError("NULL color table")
 */
  __pyx_v_hTable = GDALGetRasterColorTable(__pyx_v_hBand);

  /* "rasterio/_base.pyx":678
 *             raise ValueError("NULL band")
 *         hTable = _gdal.GDALGetRasterColorTable(hBand)
 *         if hTable == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("NULL color table")
 *         retval = {}
 */
  __pyx_t_3 = ((__pyx_v_hTable == NULL) != 0);
  if (__pyx_t_3) {

    /* "rasterio/_base.pyx":679
 *         hTable = _gdal.GDALGetRasterColorTable(hBand)
 *         if hTable == NULL:
 *             raise ValueError("NULL color table")             # <<<<<<<<<<<<<<
 *         retval = {}
 * 
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__42, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 679, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 679, __pyx_L1_error)

    /* "rasterio/_base.pyx":678
 *             raise ValueError("NULL band")
 *         hTable = _gdal.GDALGetRasterColorTable(hBand)
 *         if hTable == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("NULL color table")
 *         retval = {}
 */
  }

  /* "rasterio/_base.pyx":680
 *         if hTable == NULL:
 *             raise ValueError("NULL color table")
 *         retval = {}             # <<<<<<<<<<<<<<
 * 
 *         for i in range(_gdal.GDALGetColorEntryCount(hTable)):
 */
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 680, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v_retval = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":682
 *         retval = {}
 * 
 *         for i in range(_gdal.GDALGetColorEntryCount(hTable)):             # <<<<<<<<<<<<<<
 *             color = _gdal.GDALGetColorEntry(hTable, i)
 *             if color == NULL:
 */
  __pyx_t_4 = GDALGetColorEntryCount(__pyx_v_hTable);
  for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
    __pyx_v_i = __pyx_t_5;

    /* "rasterio/_base.pyx":683
 * 
 *         for i in range(_gdal.GDALGetColorEntryCount(hTable)):
 *             color = _gdal.GDALGetColorEntry(hTable, i)             # <<<<<<<<<<<<<<
 *             if color == NULL:
 *                 log.warn("NULL color at %d, skipping", i)
 */
    __pyx_v_color = GDALGetColorEntry(__pyx_v_hTable, __pyx_v_i);

    /* "rasterio/_base.pyx":684
 *         for i in range(_gdal.GDALGetColorEntryCount(hTable)):
 *             color = _gdal.GDALGetColorEntry(hTable, i)
 *             if color == NULL:             # <<<<<<<<<<<<<<
 *                 log.warn("NULL color at %d, skipping", i)
 *                 continue
 */
    __pyx_t_3 = ((__pyx_v_color == NULL) != 0);
    if (__pyx_t_3) {

      /* "rasterio/_base.pyx":685
 *             color = _gdal.GDALGetColorEntry(hTable, i)
 *             if color == NULL:
 *                 log.warn("NULL color at %d, skipping", i)             # <<<<<<<<<<<<<<
 *                 continue
 *             log.info("Color: (%d, %d, %d, %d)", color.c1, color.c2, color.c3, color.c4)
 */
      __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 685, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_warn); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 685, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 685, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_8 = NULL;
      __pyx_t_9 = 0;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_7))) {
        __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7);
        if (likely(__pyx_t_8)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
          __Pyx_INCREF(__pyx_t_8);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_7, function);
          __pyx_t_9 = 1;
        }
      }
      __pyx_t_10 = PyTuple_New(2+__pyx_t_9); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 685, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_10);
      if (__pyx_t_8) {
        __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_8); __pyx_t_8 = NULL;
      }
      __Pyx_INCREF(__pyx_kp_s_NULL_color_at_d_skipping);
      __Pyx_GIVEREF(__pyx_kp_s_NULL_color_at_d_skipping);
      PyTuple_SET_ITEM(__pyx_t_10, 0+__pyx_t_9, __pyx_kp_s_NULL_color_at_d_skipping);
      __Pyx_GIVEREF(__pyx_t_6);
      PyTuple_SET_ITEM(__pyx_t_10, 1+__pyx_t_9, __pyx_t_6);
      __pyx_t_6 = 0;
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_10, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 685, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

      /* "rasterio/_base.pyx":686
 *             if color == NULL:
 *                 log.warn("NULL color at %d, skipping", i)
 *                 continue             # <<<<<<<<<<<<<<
 *             log.info("Color: (%d, %d, %d, %d)", color.c1, color.c2, color.c3, color.c4)
 *             retval[i] = (color.c1, color.c2, color.c3, color.c4)
 */
      goto __pyx_L7_continue;

      /* "rasterio/_base.pyx":684
 *         for i in range(_gdal.GDALGetColorEntryCount(hTable)):
 *             color = _gdal.GDALGetColorEntry(hTable, i)
 *             if color == NULL:             # <<<<<<<<<<<<<<
 *                 log.warn("NULL color at %d, skipping", i)
 *                 continue
 */
    }

    /* "rasterio/_base.pyx":687
 *                 log.warn("NULL color at %d, skipping", i)
 *                 continue
 *             log.info("Color: (%d, %d, %d, %d)", color.c1, color.c2, color.c3, color.c4)             # <<<<<<<<<<<<<<
 *             retval[i] = (color.c1, color.c2, color.c3, color.c4)
 *         return retval
 */
    __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 687, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_info); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 687, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_10);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_7 = __Pyx_PyInt_From_short(__pyx_v_color->c1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 687, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_6 = __Pyx_PyInt_From_short(__pyx_v_color->c2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 687, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_8 = __Pyx_PyInt_From_short(__pyx_v_color->c3); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 687, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_11 = __Pyx_PyInt_From_short(__pyx_v_color->c4); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 687, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    __pyx_t_12 = NULL;
    __pyx_t_9 = 0;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_10))) {
      __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_10);
      if (likely(__pyx_t_12)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
        __Pyx_INCREF(__pyx_t_12);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_10, function);
        __pyx_t_9 = 1;
      }
    }
    __pyx_t_13 = PyTuple_New(5+__pyx_t_9); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 687, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    if (__pyx_t_12) {
      __Pyx_GIVEREF(__pyx_t_12); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_12); __pyx_t_12 = NULL;
    }
    __Pyx_INCREF(__pyx_kp_s_Color_d_d_d_d);
    __Pyx_GIVEREF(__pyx_kp_s_Color_d_d_d_d);
    PyTuple_SET_ITEM(__pyx_t_13, 0+__pyx_t_9, __pyx_kp_s_Color_d_d_d_d);
    __Pyx_GIVEREF(__pyx_t_7);
    PyTuple_SET_ITEM(__pyx_t_13, 1+__pyx_t_9, __pyx_t_7);
    __Pyx_GIVEREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_13, 2+__pyx_t_9, __pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_8);
    PyTuple_SET_ITEM(__pyx_t_13, 3+__pyx_t_9, __pyx_t_8);
    __Pyx_GIVEREF(__pyx_t_11);
    PyTuple_SET_ITEM(__pyx_t_13, 4+__pyx_t_9, __pyx_t_11);
    __pyx_t_7 = 0;
    __pyx_t_6 = 0;
    __pyx_t_8 = 0;
    __pyx_t_11 = 0;
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_13, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 687, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":688
 *                 continue
 *             log.info("Color: (%d, %d, %d, %d)", color.c1, color.c2, color.c3, color.c4)
 *             retval[i] = (color.c1, color.c2, color.c3, color.c4)             # <<<<<<<<<<<<<<
 *         return retval
 * 
 */
    __pyx_t_2 = __Pyx_PyInt_From_short(__pyx_v_color->c1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 688, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_10 = __Pyx_PyInt_From_short(__pyx_v_color->c2); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 688, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_10);
    __pyx_t_13 = __Pyx_PyInt_From_short(__pyx_v_color->c3); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 688, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __pyx_t_11 = __Pyx_PyInt_From_short(__pyx_v_color->c4); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 688, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    __pyx_t_8 = PyTuple_New(4); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 688, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_GIVEREF(__pyx_t_2);
    PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_10);
    PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_10);
    __Pyx_GIVEREF(__pyx_t_13);
    PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_13);
    __Pyx_GIVEREF(__pyx_t_11);
    PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_11);
    __pyx_t_2 = 0;
    __pyx_t_10 = 0;
    __pyx_t_13 = 0;
    __pyx_t_11 = 0;
    __pyx_t_11 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 688, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    if (unlikely(PyDict_SetItem(__pyx_v_retval, __pyx_t_11, __pyx_t_8) < 0)) __PYX_ERR(0, 688, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_L7_continue:;
  }

  /* "rasterio/_base.pyx":689
 *             log.info("Color: (%d, %d, %d, %d)", color.c1, color.c2, color.c3, color.c4)
 *             retval[i] = (color.c1, color.c2, color.c3, color.c4)
 *         return retval             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_retval);
  __pyx_r = __pyx_v_retval;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":664
 *         return ColorInterp(value)
 * 
 *     def colormap(self, bidx):             # <<<<<<<<<<<<<<
 *         """Returns a dict containing the colormap for a band or None."""
 *         cdef void *hBand
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.colormap", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_retval);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":692
 * 
 *     @property
 *     def kwds(self):             # <<<<<<<<<<<<<<
 *         return self.tags(ns='rio_creation_kwds')
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_4kwds_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_4kwds_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_4kwds___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4kwds___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "rasterio/_base.pyx":693
 *     @property
 *     def kwds(self):
 *         return self.tags(ns='rio_creation_kwds')             # <<<<<<<<<<<<<<
 * 
 *     # Overviews.
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_tags); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 693, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 693, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_ns, __pyx_n_s_rio_creation_kwds) < 0) __PYX_ERR(0, 693, __pyx_L1_error)
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 693, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":692
 * 
 *     @property
 *     def kwds(self):             # <<<<<<<<<<<<<<
 *         return self.tags(ns='rio_creation_kwds')
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.kwds.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":696
 * 
 *     # Overviews.
 *     def overviews(self, bidx):             # <<<<<<<<<<<<<<
 *         cdef void *hovband = NULL
 *         cdef void *hband = self.band(bidx)
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_52overviews(PyObject *__pyx_v_self, PyObject *__pyx_v_bidx); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_52overviews(PyObject *__pyx_v_self, PyObject *__pyx_v_bidx) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("overviews (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_51overviews(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_bidx));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_51overviews(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx) {
  void *__pyx_v_hovband;
  void *__pyx_v_hband;
  int __pyx_v_num_overviews;
  PyObject *__pyx_v_factors = NULL;
  int __pyx_v_i;
  int __pyx_v_xsize;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  void *__pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_t_4;
  double __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_t_7;
  __Pyx_RefNannySetupContext("overviews", 0);

  /* "rasterio/_base.pyx":697
 *     # Overviews.
 *     def overviews(self, bidx):
 *         cdef void *hovband = NULL             # <<<<<<<<<<<<<<
 *         cdef void *hband = self.band(bidx)
 *         num_overviews = _gdal.GDALGetOverviewCount(hband)
 */
  __pyx_v_hovband = NULL;

  /* "rasterio/_base.pyx":698
 *     def overviews(self, bidx):
 *         cdef void *hovband = NULL
 *         cdef void *hband = self.band(bidx)             # <<<<<<<<<<<<<<
 *         num_overviews = _gdal.GDALGetOverviewCount(hband)
 *         factors = []
 */
  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_bidx); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 698, __pyx_L1_error)
  __pyx_t_2 = ((struct __pyx_vtabstruct_8rasterio_5_base_DatasetReader *)__pyx_v_self->__pyx_vtab)->band(__pyx_v_self, __pyx_t_1); if (unlikely(__pyx_t_2 == NULL)) __PYX_ERR(0, 698, __pyx_L1_error)
  __pyx_v_hband = __pyx_t_2;

  /* "rasterio/_base.pyx":699
 *         cdef void *hovband = NULL
 *         cdef void *hband = self.band(bidx)
 *         num_overviews = _gdal.GDALGetOverviewCount(hband)             # <<<<<<<<<<<<<<
 *         factors = []
 *         for i in range(num_overviews):
 */
  __pyx_v_num_overviews = GDALGetOverviewCount(__pyx_v_hband);

  /* "rasterio/_base.pyx":700
 *         cdef void *hband = self.band(bidx)
 *         num_overviews = _gdal.GDALGetOverviewCount(hband)
 *         factors = []             # <<<<<<<<<<<<<<
 *         for i in range(num_overviews):
 *             hovband = _gdal.GDALGetOverview(hband, i)
 */
  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 700, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_v_factors = ((PyObject*)__pyx_t_3);
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":701
 *         num_overviews = _gdal.GDALGetOverviewCount(hband)
 *         factors = []
 *         for i in range(num_overviews):             # <<<<<<<<<<<<<<
 *             hovband = _gdal.GDALGetOverview(hband, i)
 *             # Compute the overview factor only from the xsize (width).
 */
  __pyx_t_1 = __pyx_v_num_overviews;
  for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_1; __pyx_t_4+=1) {
    __pyx_v_i = __pyx_t_4;

    /* "rasterio/_base.pyx":702
 *         factors = []
 *         for i in range(num_overviews):
 *             hovband = _gdal.GDALGetOverview(hband, i)             # <<<<<<<<<<<<<<
 *             # Compute the overview factor only from the xsize (width).
 *             xsize = _gdal.GDALGetRasterBandXSize(hovband)
 */
    __pyx_v_hovband = GDALGetOverview(__pyx_v_hband, __pyx_v_i);

    /* "rasterio/_base.pyx":704
 *             hovband = _gdal.GDALGetOverview(hband, i)
 *             # Compute the overview factor only from the xsize (width).
 *             xsize = _gdal.GDALGetRasterBandXSize(hovband)             # <<<<<<<<<<<<<<
 *             factors.append(int(round(float(self.width)/float(xsize))))
 *         return factors
 */
    __pyx_v_xsize = GDALGetRasterBandXSize(__pyx_v_hovband);

    /* "rasterio/_base.pyx":705
 *             # Compute the overview factor only from the xsize (width).
 *             xsize = _gdal.GDALGetRasterBandXSize(hovband)
 *             factors.append(int(round(float(self.width)/float(xsize))))             # <<<<<<<<<<<<<<
 *         return factors
 * 
 */
    __pyx_t_5 = __Pyx_PyObject_AsDouble(__pyx_v_self->width); if (unlikely(__pyx_t_5 == ((double)-1) && PyErr_Occurred())) __PYX_ERR(0, 705, __pyx_L1_error)
    if (unlikely(((double)__pyx_v_xsize) == 0)) {
      PyErr_SetString(PyExc_ZeroDivisionError, "float division");
      __PYX_ERR(0, 705, __pyx_L1_error)
    }
    __pyx_t_3 = PyFloat_FromDouble((__pyx_t_5 / ((double)__pyx_v_xsize))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 705, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 705, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3);
    __pyx_t_3 = 0;
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_round, __pyx_t_6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 705, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyNumber_Int(__pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 705, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_7 = __Pyx_PyList_Append(__pyx_v_factors, __pyx_t_6); if (unlikely(__pyx_t_7 == -1)) __PYX_ERR(0, 705, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  }

  /* "rasterio/_base.pyx":706
 *             xsize = _gdal.GDALGetRasterBandXSize(hovband)
 *             factors.append(int(round(float(self.width)/float(xsize))))
 *         return factors             # <<<<<<<<<<<<<<
 * 
 *     def checksum(self, bidx, window=None):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_factors);
  __pyx_r = __pyx_v_factors;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":696
 * 
 *     # Overviews.
 *     def overviews(self, bidx):             # <<<<<<<<<<<<<<
 *         cdef void *hovband = NULL
 *         cdef void *hband = self.band(bidx)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.overviews", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_factors);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":708
 *         return factors
 * 
 *     def checksum(self, bidx, window=None):             # <<<<<<<<<<<<<<
 *         """Compute an integer checksum for the stored band
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_54checksum(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_13DatasetReader_53checksum[] = "Compute an integer checksum for the stored band\n\n        Parameters\n        ----------\n        bidx : int\n            The band's index (1-indexed).\n        window: tuple, optional\n            A window of the band. Default is the entire extent of the band.\n\n        Returns\n        -------\n        An int.\n        ";
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_54checksum(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_bidx = 0;
  PyObject *__pyx_v_window = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("checksum (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_bidx,&__pyx_n_s_window,0};
    PyObject* values[2] = {0,0};
    values[1] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_bidx)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_window);
          if (value) { values[1] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "checksum") < 0)) __PYX_ERR(0, 708, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_bidx = values[0];
    __pyx_v_window = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("checksum", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 708, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.DatasetReader.checksum", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_53checksum(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), __pyx_v_bidx, __pyx_v_window);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_53checksum(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_bidx, PyObject *__pyx_v_window) {
  void *__pyx_v_hband;
  int __pyx_v_xoff;
  int __pyx_v_yoff;
  int __pyx_v_width;
  int __pyx_v_height;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  __Pyx_RefNannySetupContext("checksum", 0);
  __Pyx_INCREF(__pyx_v_window);

  /* "rasterio/_base.pyx":722
 *         An int.
 *         """
 *         cdef void *hband = NULL             # <<<<<<<<<<<<<<
 *         cdef int xoff, yoff, width, height
 *         if self._hds == NULL:
 */
  __pyx_v_hband = NULL;

  /* "rasterio/_base.pyx":724
 *         cdef void *hband = NULL
 *         cdef int xoff, yoff, width, height
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("can't read closed raster file")
 *         hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
  __pyx_t_1 = ((__pyx_v_self->_hds == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":725
 *         cdef int xoff, yoff, width, height
 *         if self._hds == NULL:
 *             raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *         hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hband == NULL:
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__43, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 725, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 725, __pyx_L1_error)

    /* "rasterio/_base.pyx":724
 *         cdef void *hband = NULL
 *         cdef int xoff, yoff, width, height
 *         if self._hds == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("can't read closed raster file")
 *         hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 */
  }

  /* "rasterio/_base.pyx":726
 *         if self._hds == NULL:
 *             raise ValueError("can't read closed raster file")
 *         hband = _gdal.GDALGetRasterBand(self._hds, bidx)             # <<<<<<<<<<<<<<
 *         if hband == NULL:
 *             raise ValueError("NULL band")
 */
  __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_v_bidx); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 726, __pyx_L1_error)
  __pyx_v_hband = GDALGetRasterBand(__pyx_v_self->_hds, __pyx_t_3);

  /* "rasterio/_base.pyx":727
 *             raise ValueError("can't read closed raster file")
 *         hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hband == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("NULL band")
 *         if not window:
 */
  __pyx_t_1 = ((__pyx_v_hband == NULL) != 0);
  if (__pyx_t_1) {

    /* "rasterio/_base.pyx":728
 *         hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hband == NULL:
 *             raise ValueError("NULL band")             # <<<<<<<<<<<<<<
 *         if not window:
 *             xoff = yoff = 0
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__44, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 728, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 728, __pyx_L1_error)

    /* "rasterio/_base.pyx":727
 *             raise ValueError("can't read closed raster file")
 *         hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hband == NULL:             # <<<<<<<<<<<<<<
 *             raise ValueError("NULL band")
 *         if not window:
 */
  }

  /* "rasterio/_base.pyx":729
 *         if hband == NULL:
 *             raise ValueError("NULL band")
 *         if not window:             # <<<<<<<<<<<<<<
 *             xoff = yoff = 0
 *             width, height = self.width, self.height
 */
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_window); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 729, __pyx_L1_error)
  __pyx_t_4 = ((!__pyx_t_1) != 0);
  if (__pyx_t_4) {

    /* "rasterio/_base.pyx":730
 *             raise ValueError("NULL band")
 *         if not window:
 *             xoff = yoff = 0             # <<<<<<<<<<<<<<
 *             width, height = self.width, self.height
 *         else:
 */
    __pyx_v_xoff = 0;
    __pyx_v_yoff = 0;

    /* "rasterio/_base.pyx":731
 *         if not window:
 *             xoff = yoff = 0
 *             width, height = self.width, self.height             # <<<<<<<<<<<<<<
 *         else:
 *             window = eval_window(window, self.height, self.width)
 */
    __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_v_self->width); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 731, __pyx_L1_error)
    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_v_self->height); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 731, __pyx_L1_error)
    __pyx_v_width = __pyx_t_3;
    __pyx_v_height = __pyx_t_5;

    /* "rasterio/_base.pyx":729
 *         if hband == NULL:
 *             raise ValueError("NULL band")
 *         if not window:             # <<<<<<<<<<<<<<
 *             xoff = yoff = 0
 *             width, height = self.width, self.height
 */
    goto __pyx_L5;
  }

  /* "rasterio/_base.pyx":733
 *             width, height = self.width, self.height
 *         else:
 *             window = eval_window(window, self.height, self.width)             # <<<<<<<<<<<<<<
 *             window = crop_window(window, self.height, self.width)
 *             xoff = window[1][0]
 */
  /*else*/ {
    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_v_self->height); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 733, __pyx_L1_error)
    __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_v_self->width); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 733, __pyx_L1_error)
    __pyx_t_2 = __pyx_f_8rasterio_5_base_eval_window(__pyx_v_window, __pyx_t_5, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 733, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF_SET(__pyx_v_window, __pyx_t_2);
    __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":734
 *         else:
 *             window = eval_window(window, self.height, self.width)
 *             window = crop_window(window, self.height, self.width)             # <<<<<<<<<<<<<<
 *             xoff = window[1][0]
 *             width = window[1][1] - xoff
 */
    __pyx_t_3 = __Pyx_PyInt_As_int(__pyx_v_self->height); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 734, __pyx_L1_error)
    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_v_self->width); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 734, __pyx_L1_error)
    __pyx_t_2 = __pyx_f_8rasterio_5_base_crop_window(__pyx_v_window, __pyx_t_3, __pyx_t_5, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 734, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF_SET(__pyx_v_window, __pyx_t_2);
    __pyx_t_2 = 0;

    /* "rasterio/_base.pyx":735
 *             window = eval_window(window, self.height, self.width)
 *             window = crop_window(window, self.height, self.width)
 *             xoff = window[1][0]             # <<<<<<<<<<<<<<
 *             width = window[1][1] - xoff
 *             yoff = window[0][0]
 */
    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_window, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 735, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_2, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 735, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_6); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 735, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_v_xoff = __pyx_t_5;

    /* "rasterio/_base.pyx":736
 *             window = crop_window(window, self.height, self.width)
 *             xoff = window[1][0]
 *             width = window[1][1] - xoff             # <<<<<<<<<<<<<<
 *             yoff = window[0][0]
 *             height = window[0][1] - yoff
 */
    __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_window, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 736, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_6, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 736, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_xoff); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 736, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = PyNumber_Subtract(__pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 736, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_7); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 736, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_v_width = __pyx_t_5;

    /* "rasterio/_base.pyx":737
 *             xoff = window[1][0]
 *             width = window[1][1] - xoff
 *             yoff = window[0][0]             # <<<<<<<<<<<<<<
 *             height = window[0][1] - yoff
 *         return _gdal.GDALChecksumImage(hband, xoff, yoff, width, height)
 */
    __pyx_t_7 = __Pyx_GetItemInt(__pyx_v_window, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 737, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_7, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 737, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_6); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 737, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_v_yoff = __pyx_t_5;

    /* "rasterio/_base.pyx":738
 *             width = window[1][1] - xoff
 *             yoff = window[0][0]
 *             height = window[0][1] - yoff             # <<<<<<<<<<<<<<
 *         return _gdal.GDALChecksumImage(hband, xoff, yoff, width, height)
 * 
 */
    __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_window, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 738, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = __Pyx_GetItemInt(__pyx_t_6, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 738, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_yoff); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 738, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_2 = PyNumber_Subtract(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 738, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 738, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_v_height = __pyx_t_5;
  }
  __pyx_L5:;

  /* "rasterio/_base.pyx":739
 *             yoff = window[0][0]
 *             height = window[0][1] - yoff
 *         return _gdal.GDALChecksumImage(hband, xoff, yoff, width, height)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyInt_From_int(GDALChecksumImage(__pyx_v_hband, __pyx_v_xoff, __pyx_v_yoff, __pyx_v_width, __pyx_v_height)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 739, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":708
 *         return factors
 * 
 *     def checksum(self, bidx, window=None):             # <<<<<<<<<<<<<<
 *         """Compute an integer checksum for the stored band
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("rasterio._base.DatasetReader.checksum", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_window);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":8
 *     cdef void *_hds
 * 
 *     cdef readonly object name             # <<<<<<<<<<<<<<
 *     cdef readonly object mode
 *     cdef readonly object options
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_4name_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_4name_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_4name___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4name___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->name);
  __pyx_r = __pyx_v_self->name;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":9
 * 
 *     cdef readonly object name
 *     cdef readonly object mode             # <<<<<<<<<<<<<<
 *     cdef readonly object options
 *     cdef readonly object width, height
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_4mode_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_4mode_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_4mode___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4mode___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->mode);
  __pyx_r = __pyx_v_self->mode;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":10
 *     cdef readonly object name
 *     cdef readonly object mode
 *     cdef readonly object options             # <<<<<<<<<<<<<<
 *     cdef readonly object width, height
 *     cdef readonly object shape
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7options_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7options_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_7options___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7options___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->options);
  __pyx_r = __pyx_v_self->options;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":11
 *     cdef readonly object mode
 *     cdef readonly object options
 *     cdef readonly object width, height             # <<<<<<<<<<<<<<
 *     cdef readonly object shape
 *     cdef public object driver
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_5width_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_5width_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_5width___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_5width___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->width);
  __pyx_r = __pyx_v_self->width;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6height_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6height_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6height___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6height___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->height);
  __pyx_r = __pyx_v_self->height;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":12
 *     cdef readonly object options
 *     cdef readonly object width, height
 *     cdef readonly object shape             # <<<<<<<<<<<<<<
 *     cdef public object driver
 *     cdef public object _count
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_5shape_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_5shape_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_5shape___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_5shape___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->shape);
  __pyx_r = __pyx_v_self->shape;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":13
 *     cdef readonly object width, height
 *     cdef readonly object shape
 *     cdef public object driver             # <<<<<<<<<<<<<<
 *     cdef public object _count
 *     cdef public object _dtypes
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6driver_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6driver_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6driver___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6driver___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->driver);
  __pyx_r = __pyx_v_self->driver;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_6driver_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_6driver_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6driver_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_6driver_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->driver);
  __Pyx_DECREF(__pyx_v_self->driver);
  __pyx_v_self->driver = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_6driver_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_6driver_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6driver_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_6driver_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->driver);
  __Pyx_DECREF(__pyx_v_self->driver);
  __pyx_v_self->driver = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":14
 *     cdef readonly object shape
 *     cdef public object driver
 *     cdef public object _count             # <<<<<<<<<<<<<<
 *     cdef public object _dtypes
 *     cdef public object _closed
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6_count_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_6_count_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6_count___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_6_count___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_count);
  __pyx_r = __pyx_v_self->_count;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_6_count_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_6_count_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6_count_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_6_count_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->_count);
  __Pyx_DECREF(__pyx_v_self->_count);
  __pyx_v_self->_count = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_6_count_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_6_count_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_6_count_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_6_count_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_count);
  __Pyx_DECREF(__pyx_v_self->_count);
  __pyx_v_self->_count = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":15
 *     cdef public object driver
 *     cdef public object _count
 *     cdef public object _dtypes             # <<<<<<<<<<<<<<
 *     cdef public object _closed
 *     cdef public object _crs
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7_dtypes_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7_dtypes_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_7_dtypes___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7_dtypes___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_dtypes);
  __pyx_r = __pyx_v_self->_dtypes;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_7_dtypes_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_7_dtypes_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_7_dtypes_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_7_dtypes_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->_dtypes);
  __Pyx_DECREF(__pyx_v_self->_dtypes);
  __pyx_v_self->_dtypes = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_7_dtypes_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_7_dtypes_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_7_dtypes_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_7_dtypes_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_dtypes);
  __Pyx_DECREF(__pyx_v_self->_dtypes);
  __pyx_v_self->_dtypes = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":16
 *     cdef public object _count
 *     cdef public object _dtypes
 *     cdef public object _closed             # <<<<<<<<<<<<<<
 *     cdef public object _crs
 *     cdef public object _crs_wkt
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7_closed_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_7_closed_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_7_closed___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_7_closed___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_closed);
  __pyx_r = __pyx_v_self->_closed;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_7_closed_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_7_closed_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_7_closed_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_7_closed_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->_closed);
  __Pyx_DECREF(__pyx_v_self->_closed);
  __pyx_v_self->_closed = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_7_closed_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_7_closed_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_7_closed_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_7_closed_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_closed);
  __Pyx_DECREF(__pyx_v_self->_closed);
  __pyx_v_self->_closed = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":17
 *     cdef public object _dtypes
 *     cdef public object _closed
 *     cdef public object _crs             # <<<<<<<<<<<<<<
 *     cdef public object _crs_wkt
 *     cdef public object _transform
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_4_crs_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_4_crs_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_4_crs___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_4_crs___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_crs);
  __pyx_r = __pyx_v_self->_crs;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_4_crs_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_4_crs_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_4_crs_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_4_crs_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->_crs);
  __Pyx_DECREF(__pyx_v_self->_crs);
  __pyx_v_self->_crs = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_4_crs_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_4_crs_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_4_crs_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_4_crs_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_crs);
  __Pyx_DECREF(__pyx_v_self->_crs);
  __pyx_v_self->_crs = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":18
 *     cdef public object _closed
 *     cdef public object _crs
 *     cdef public object _crs_wkt             # <<<<<<<<<<<<<<
 *     cdef public object _transform
 *     cdef public object _block_shapes
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_8_crs_wkt_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_8_crs_wkt_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_8_crs_wkt___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_8_crs_wkt___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_crs_wkt);
  __pyx_r = __pyx_v_self->_crs_wkt;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_8_crs_wkt_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_8_crs_wkt_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_8_crs_wkt_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_8_crs_wkt_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->_crs_wkt);
  __Pyx_DECREF(__pyx_v_self->_crs_wkt);
  __pyx_v_self->_crs_wkt = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_8_crs_wkt_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_8_crs_wkt_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_8_crs_wkt_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_8_crs_wkt_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_crs_wkt);
  __Pyx_DECREF(__pyx_v_self->_crs_wkt);
  __pyx_v_self->_crs_wkt = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":19
 *     cdef public object _crs
 *     cdef public object _crs_wkt
 *     cdef public object _transform             # <<<<<<<<<<<<<<
 *     cdef public object _block_shapes
 *     cdef public object _nodatavals
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_10_transform_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_10_transform_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_10_transform___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_10_transform___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_transform);
  __pyx_r = __pyx_v_self->_transform;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_10_transform_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_10_transform_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_10_transform_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_10_transform_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->_transform);
  __Pyx_DECREF(__pyx_v_self->_transform);
  __pyx_v_self->_transform = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_10_transform_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_10_transform_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_10_transform_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_10_transform_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_transform);
  __Pyx_DECREF(__pyx_v_self->_transform);
  __pyx_v_self->_transform = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":20
 *     cdef public object _crs_wkt
 *     cdef public object _transform
 *     cdef public object _block_shapes             # <<<<<<<<<<<<<<
 *     cdef public object _nodatavals
 *     cdef public object _read
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_13_block_shapes_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_13_block_shapes_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_13_block_shapes___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_13_block_shapes___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_block_shapes);
  __pyx_r = __pyx_v_self->_block_shapes;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_13_block_shapes_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_13_block_shapes_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_13_block_shapes_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_13_block_shapes_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->_block_shapes);
  __Pyx_DECREF(__pyx_v_self->_block_shapes);
  __pyx_v_self->_block_shapes = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_13_block_shapes_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_13_block_shapes_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_13_block_shapes_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_13_block_shapes_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_block_shapes);
  __Pyx_DECREF(__pyx_v_self->_block_shapes);
  __pyx_v_self->_block_shapes = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":21
 *     cdef public object _transform
 *     cdef public object _block_shapes
 *     cdef public object _nodatavals             # <<<<<<<<<<<<<<
 *     cdef public object _read
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_11_nodatavals_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_11_nodatavals_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_11_nodatavals___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_11_nodatavals___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_nodatavals);
  __pyx_r = __pyx_v_self->_nodatavals;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_11_nodatavals_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_11_nodatavals_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_11_nodatavals_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_11_nodatavals_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->_nodatavals);
  __Pyx_DECREF(__pyx_v_self->_nodatavals);
  __pyx_v_self->_nodatavals = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_11_nodatavals_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_11_nodatavals_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_11_nodatavals_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_11_nodatavals_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_nodatavals);
  __Pyx_DECREF(__pyx_v_self->_nodatavals);
  __pyx_v_self->_nodatavals = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pxd":22
 *     cdef public object _block_shapes
 *     cdef public object _nodatavals
 *     cdef public object _read             # <<<<<<<<<<<<<<
 * 
 *     cdef void *band(self, int bidx) except NULL
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_5_read_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_8rasterio_5_base_13DatasetReader_5_read_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_5_read___get__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_13DatasetReader_5_read___get__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->_read);
  __pyx_r = __pyx_v_self->_read;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_5_read_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_5_read_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_5_read_2__set__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_5_read_2__set__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->_read);
  __Pyx_DECREF(__pyx_v_self->_read);
  __pyx_v_self->_read = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_8rasterio_5_base_13DatasetReader_5_read_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_8rasterio_5_base_13DatasetReader_5_read_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_13DatasetReader_5_read_4__del__(((struct __pyx_obj_8rasterio_5_base_DatasetReader *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8rasterio_5_base_13DatasetReader_5_read_4__del__(struct __pyx_obj_8rasterio_5_base_DatasetReader *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->_read);
  __Pyx_DECREF(__pyx_v_self->_read);
  __pyx_v_self->_read = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":746
 * # ((row_start, row_stop), (col_start, col_stop))
 * 
 * cpdef crop_window(object window, int height, int width):             # <<<<<<<<<<<<<<
 *     """Returns a window cropped to fall within height and width."""
 *     cdef int r_start, r_stop, c_start, c_stop
 */

static PyObject *__pyx_pw_8rasterio_5_base_5crop_window(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_f_8rasterio_5_base_crop_window(PyObject *__pyx_v_window, int __pyx_v_height, int __pyx_v_width, CYTHON_UNUSED int __pyx_skip_dispatch) {
  int __pyx_v_r_start;
  int __pyx_v_r_stop;
  int __pyx_v_c_start;
  int __pyx_v_c_stop;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *(*__pyx_t_4)(PyObject *);
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_t_7;
  int __pyx_t_8;
  long __pyx_t_9;
  long __pyx_t_10;
  int __pyx_t_11;
  __Pyx_RefNannySetupContext("crop_window", 0);

  /* "rasterio/_base.pyx":749
 *     """Returns a window cropped to fall within height and width."""
 *     cdef int r_start, r_stop, c_start, c_stop
 *     (r_start, r_stop), (c_start, c_stop) = window             # <<<<<<<<<<<<<<
 *     return (
 *         (min(max(r_start, 0), height), max(0, min(r_stop, height))),
 */
  if ((likely(PyTuple_CheckExact(__pyx_v_window))) || (PyList_CheckExact(__pyx_v_window))) {
    PyObject* sequence = __pyx_v_window;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 749, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_2);
    #else
    __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 749, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 749, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    #endif
  } else {
    Py_ssize_t index = -1;
    __pyx_t_3 = PyObject_GetIter(__pyx_v_window); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 749, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
    index = 0; __pyx_t_1 = __pyx_t_4(__pyx_t_3); if (unlikely(!__pyx_t_1)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_1);
    index = 1; __pyx_t_2 = __pyx_t_4(__pyx_t_3); if (unlikely(!__pyx_t_2)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_2);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_3), 2) < 0) __PYX_ERR(0, 749, __pyx_L1_error)
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 749, __pyx_L1_error)
    __pyx_L4_unpacking_done:;
  }
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 749, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_5);
    #else
    __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 749, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 749, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 749, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_4 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_3 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_3)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_3);
    index = 1; __pyx_t_5 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_6), 2) < 0) __PYX_ERR(0, 749, __pyx_L1_error)
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L6_unpacking_done;
    __pyx_L5_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 749, __pyx_L1_error)
    __pyx_L6_unpacking_done:;
  }
  __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 749, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_8 = __Pyx_PyInt_As_int(__pyx_t_5); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 749, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_r_start = __pyx_t_7;
  __pyx_v_r_stop = __pyx_t_8;
  if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
    PyObject* sequence = __pyx_t_2;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 749, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_3);
    #else
    __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 749, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 749, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    #endif
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 749, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_4 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_5 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L7_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    index = 1; __pyx_t_3 = __pyx_t_4(__pyx_t_6); if (unlikely(!__pyx_t_3)) goto __pyx_L7_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_3);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_6), 2) < 0) __PYX_ERR(0, 749, __pyx_L1_error)
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L8_unpacking_done;
    __pyx_L7_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 749, __pyx_L1_error)
    __pyx_L8_unpacking_done:;
  }
  __pyx_t_8 = __Pyx_PyInt_As_int(__pyx_t_5); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 749, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 749, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_c_start = __pyx_t_8;
  __pyx_v_c_stop = __pyx_t_7;

  /* "rasterio/_base.pyx":750
 *     cdef int r_start, r_stop, c_start, c_stop
 *     (r_start, r_stop), (c_start, c_stop) = window
 *     return (             # <<<<<<<<<<<<<<
 *         (min(max(r_start, 0), height), max(0, min(r_stop, height))),
 *         (min(max(c_start, 0), width), max(0, min(c_stop, width)))
 */
  __Pyx_XDECREF(__pyx_r);

  /* "rasterio/_base.pyx":751
 *     (r_start, r_stop), (c_start, c_stop) = window
 *     return (
 *         (min(max(r_start, 0), height), max(0, min(r_stop, height))),             # <<<<<<<<<<<<<<
 *         (min(max(c_start, 0), width), max(0, min(c_stop, width)))
 *     )
 */
  __pyx_t_7 = __pyx_v_height;
  __pyx_t_9 = 0;
  __pyx_t_8 = __pyx_v_r_start;
  if (((__pyx_t_9 > __pyx_t_8) != 0)) {
    __pyx_t_10 = __pyx_t_9;
  } else {
    __pyx_t_10 = __pyx_t_8;
  }
  __pyx_t_9 = __pyx_t_10;
  if (((__pyx_t_7 < __pyx_t_9) != 0)) {
    __pyx_t_10 = __pyx_t_7;
  } else {
    __pyx_t_10 = __pyx_t_9;
  }
  __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_t_10); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 751, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_7 = __pyx_v_height;
  __pyx_t_8 = __pyx_v_r_stop;
  if (((__pyx_t_7 < __pyx_t_8) != 0)) {
    __pyx_t_11 = __pyx_t_7;
  } else {
    __pyx_t_11 = __pyx_t_8;
  }
  __pyx_t_7 = __pyx_t_11;
  __pyx_t_10 = 0;
  if (((__pyx_t_7 > __pyx_t_10) != 0)) {
    __pyx_t_9 = __pyx_t_7;
  } else {
    __pyx_t_9 = __pyx_t_10;
  }
  __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_t_9); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 751, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 751, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1);
  __pyx_t_2 = 0;
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":752
 *     return (
 *         (min(max(r_start, 0), height), max(0, min(r_stop, height))),
 *         (min(max(c_start, 0), width), max(0, min(c_stop, width)))             # <<<<<<<<<<<<<<
 *     )
 * 
 */
  __pyx_t_7 = __pyx_v_width;
  __pyx_t_9 = 0;
  __pyx_t_11 = __pyx_v_c_start;
  if (((__pyx_t_9 > __pyx_t_11) != 0)) {
    __pyx_t_10 = __pyx_t_9;
  } else {
    __pyx_t_10 = __pyx_t_11;
  }
  __pyx_t_9 = __pyx_t_10;
  if (((__pyx_t_7 < __pyx_t_9) != 0)) {
    __pyx_t_10 = __pyx_t_7;
  } else {
    __pyx_t_10 = __pyx_t_9;
  }
  __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_t_10); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 752, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_7 = __pyx_v_width;
  __pyx_t_11 = __pyx_v_c_stop;
  if (((__pyx_t_7 < __pyx_t_11) != 0)) {
    __pyx_t_8 = __pyx_t_7;
  } else {
    __pyx_t_8 = __pyx_t_11;
  }
  __pyx_t_7 = __pyx_t_8;
  __pyx_t_10 = 0;
  if (((__pyx_t_7 > __pyx_t_10) != 0)) {
    __pyx_t_9 = __pyx_t_7;
  } else {
    __pyx_t_9 = __pyx_t_10;
  }
  __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_t_9); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 752, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 752, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":751
 *     (r_start, r_stop), (c_start, c_stop) = window
 *     return (
 *         (min(max(r_start, 0), height), max(0, min(r_stop, height))),             # <<<<<<<<<<<<<<
 *         (min(max(c_start, 0), width), max(0, min(c_stop, width)))
 *     )
 */
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 751, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_5);
  __pyx_t_3 = 0;
  __pyx_t_5 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":746
 * # ((row_start, row_stop), (col_start, col_stop))
 * 
 * cpdef crop_window(object window, int height, int width):             # <<<<<<<<<<<<<<
 *     """Returns a window cropped to fall within height and width."""
 *     cdef int r_start, r_stop, c_start, c_stop
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("rasterio._base.crop_window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_5crop_window(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_4crop_window[] = "Returns a window cropped to fall within height and width.";
static PyObject *__pyx_pw_8rasterio_5_base_5crop_window(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_window = 0;
  int __pyx_v_height;
  int __pyx_v_width;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("crop_window (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_window,&__pyx_n_s_height,&__pyx_n_s_width,0};
    PyObject* values[3] = {0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_window)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_height)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("crop_window", 1, 3, 3, 1); __PYX_ERR(0, 746, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_width)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("crop_window", 1, 3, 3, 2); __PYX_ERR(0, 746, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "crop_window") < 0)) __PYX_ERR(0, 746, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
    }
    __pyx_v_window = values[0];
    __pyx_v_height = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_height == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 746, __pyx_L3_error)
    __pyx_v_width = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_width == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 746, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("crop_window", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 746, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.crop_window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_4crop_window(__pyx_self, __pyx_v_window, __pyx_v_height, __pyx_v_width);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_4crop_window(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_window, int __pyx_v_height, int __pyx_v_width) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("crop_window", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_f_8rasterio_5_base_crop_window(__pyx_v_window, __pyx_v_height, __pyx_v_width, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 746, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("rasterio._base.crop_window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":756
 * 
 * 
 * cpdef eval_window(object window, int height, int width):             # <<<<<<<<<<<<<<
 *     """Evaluates a window tuple that might contain negative values
 *     in the context of a raster height and width."""
 */

static PyObject *__pyx_pw_8rasterio_5_base_7eval_window(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_f_8rasterio_5_base_eval_window(PyObject *__pyx_v_window, int __pyx_v_height, int __pyx_v_width, CYTHON_UNUSED int __pyx_skip_dispatch) {
  int __pyx_v_r_start;
  int __pyx_v_r_stop;
  int __pyx_v_c_start;
  int __pyx_v_c_stop;
  PyObject *__pyx_v_r = NULL;
  PyObject *__pyx_v_c = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *(*__pyx_t_7)(PyObject *);
  Py_ssize_t __pyx_t_8;
  int __pyx_t_9;
  PyObject *__pyx_t_10 = NULL;
  int __pyx_t_11;
  int __pyx_t_12;
  __Pyx_RefNannySetupContext("eval_window", 0);

  /* "rasterio/_base.pyx":760
 *     in the context of a raster height and width."""
 *     cdef int r_start, r_stop, c_start, c_stop
 *     try:             # <<<<<<<<<<<<<<
 *         r, c = window
 *         assert len(r) == 2
 */
  {
    __Pyx_PyThreadState_declare
    __Pyx_PyThreadState_assign
    __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3);
    __Pyx_XGOTREF(__pyx_t_1);
    __Pyx_XGOTREF(__pyx_t_2);
    __Pyx_XGOTREF(__pyx_t_3);
    /*try:*/ {

      /* "rasterio/_base.pyx":761
 *     cdef int r_start, r_stop, c_start, c_stop
 *     try:
 *         r, c = window             # <<<<<<<<<<<<<<
 *         assert len(r) == 2
 *         assert len(c) == 2
 */
      if ((likely(PyTuple_CheckExact(__pyx_v_window))) || (PyList_CheckExact(__pyx_v_window))) {
        PyObject* sequence = __pyx_v_window;
        #if CYTHON_COMPILING_IN_CPYTHON
        Py_ssize_t size = Py_SIZE(sequence);
        #else
        Py_ssize_t size = PySequence_Size(sequence);
        #endif
        if (unlikely(size != 2)) {
          if (size > 2) __Pyx_RaiseTooManyValuesError(2);
          else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
          __PYX_ERR(0, 761, __pyx_L3_error)
        }
        #if CYTHON_COMPILING_IN_CPYTHON
        if (likely(PyTuple_CheckExact(sequence))) {
          __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
          __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); 
        } else {
          __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
          __pyx_t_5 = PyList_GET_ITEM(sequence, 1); 
        }
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_5);
        #else
        __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 761, __pyx_L3_error)
        __Pyx_GOTREF(__pyx_t_4);
        __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 761, __pyx_L3_error)
        __Pyx_GOTREF(__pyx_t_5);
        #endif
      } else {
        Py_ssize_t index = -1;
        __pyx_t_6 = PyObject_GetIter(__pyx_v_window); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 761, __pyx_L3_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext;
        index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L11_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_4);
        index = 1; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L11_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_5);
        if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) __PYX_ERR(0, 761, __pyx_L3_error)
        __pyx_t_7 = NULL;
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        goto __pyx_L12_unpacking_done;
        __pyx_L11_unpacking_failed:;
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_7 = NULL;
        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
        __PYX_ERR(0, 761, __pyx_L3_error)
        __pyx_L12_unpacking_done:;
      }
      __pyx_v_r = __pyx_t_4;
      __pyx_t_4 = 0;
      __pyx_v_c = __pyx_t_5;
      __pyx_t_5 = 0;

      /* "rasterio/_base.pyx":762
 *     try:
 *         r, c = window
 *         assert len(r) == 2             # <<<<<<<<<<<<<<
 *         assert len(c) == 2
 *     except (ValueError, TypeError, AssertionError):
 */
      #ifndef CYTHON_WITHOUT_ASSERTIONS
      if (unlikely(!Py_OptimizeFlag)) {
        __pyx_t_8 = PyObject_Length(__pyx_v_r); if (unlikely(__pyx_t_8 == -1)) __PYX_ERR(0, 762, __pyx_L3_error)
        if (unlikely(!((__pyx_t_8 == 2) != 0))) {
          PyErr_SetNone(PyExc_AssertionError);
          __PYX_ERR(0, 762, __pyx_L3_error)
        }
      }
      #endif

      /* "rasterio/_base.pyx":763
 *         r, c = window
 *         assert len(r) == 2
 *         assert len(c) == 2             # <<<<<<<<<<<<<<
 *     except (ValueError, TypeError, AssertionError):
 *         raise ValueError("invalid window structure; expecting "
 */
      #ifndef CYTHON_WITHOUT_ASSERTIONS
      if (unlikely(!Py_OptimizeFlag)) {
        __pyx_t_8 = PyObject_Length(__pyx_v_c); if (unlikely(__pyx_t_8 == -1)) __PYX_ERR(0, 763, __pyx_L3_error)
        if (unlikely(!((__pyx_t_8 == 2) != 0))) {
          PyErr_SetNone(PyExc_AssertionError);
          __PYX_ERR(0, 763, __pyx_L3_error)
        }
      }
      #endif

      /* "rasterio/_base.pyx":760
 *     in the context of a raster height and width."""
 *     cdef int r_start, r_stop, c_start, c_stop
 *     try:             # <<<<<<<<<<<<<<
 *         r, c = window
 *         assert len(r) == 2
 */
    }
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    goto __pyx_L10_try_end;
    __pyx_L3_error:;
    __Pyx_PyThreadState_assign
    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;

    /* "rasterio/_base.pyx":764
 *         assert len(r) == 2
 *         assert len(c) == 2
 *     except (ValueError, TypeError, AssertionError):             # <<<<<<<<<<<<<<
 *         raise ValueError("invalid window structure; expecting "
 *                          "((row_start, row_stop), (col_start, col_stop))")
 */
    __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_ValueError) || __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError) || __Pyx_PyErr_ExceptionMatches(__pyx_builtin_AssertionError);
    if (__pyx_t_9) {
      __Pyx_AddTraceback("rasterio._base.eval_window", __pyx_clineno, __pyx_lineno, __pyx_filename);
      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_4, &__pyx_t_6) < 0) __PYX_ERR(0, 764, __pyx_L5_except_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_GOTREF(__pyx_t_6);

      /* "rasterio/_base.pyx":765
 *         assert len(c) == 2
 *     except (ValueError, TypeError, AssertionError):
 *         raise ValueError("invalid window structure; expecting "             # <<<<<<<<<<<<<<
 *                          "((row_start, row_stop), (col_start, col_stop))")
 *     r_start = r[0] or 0
 */
      __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__45, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 765, __pyx_L5_except_error)
      __Pyx_GOTREF(__pyx_t_10);
      __Pyx_Raise(__pyx_t_10, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
      __PYX_ERR(0, 765, __pyx_L5_except_error)
    }
    goto __pyx_L5_except_error;
    __pyx_L5_except_error:;

    /* "rasterio/_base.pyx":760
 *     in the context of a raster height and width."""
 *     cdef int r_start, r_stop, c_start, c_stop
 *     try:             # <<<<<<<<<<<<<<
 *         r, c = window
 *         assert len(r) == 2
 */
    __Pyx_PyThreadState_assign
    __Pyx_XGIVEREF(__pyx_t_1);
    __Pyx_XGIVEREF(__pyx_t_2);
    __Pyx_XGIVEREF(__pyx_t_3);
    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
    goto __pyx_L1_error;
    __pyx_L10_try_end:;
  }

  /* "rasterio/_base.pyx":767
 *         raise ValueError("invalid window structure; expecting "
 *                          "((row_start, row_stop), (col_start, col_stop))")
 *     r_start = r[0] or 0             # <<<<<<<<<<<<<<
 *     if r_start < 0:
 *         if height < 0:
 */
  __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_r, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 767, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_11 < 0)) __PYX_ERR(0, 767, __pyx_L1_error)
  if (!__pyx_t_11) {
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  } else {
    __pyx_t_12 = __Pyx_PyInt_As_int(__pyx_t_6); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 767, __pyx_L1_error)
    __pyx_t_9 = __pyx_t_12;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L15_bool_binop_done;
  }
  __pyx_t_9 = 0;
  __pyx_L15_bool_binop_done:;
  __pyx_v_r_start = __pyx_t_9;

  /* "rasterio/_base.pyx":768
 *                          "((row_start, row_stop), (col_start, col_stop))")
 *     r_start = r[0] or 0
 *     if r_start < 0:             # <<<<<<<<<<<<<<
 *         if height < 0:
 *             raise ValueError("invalid height: %d" % height)
 */
  __pyx_t_11 = ((__pyx_v_r_start < 0) != 0);
  if (__pyx_t_11) {

    /* "rasterio/_base.pyx":769
 *     r_start = r[0] or 0
 *     if r_start < 0:
 *         if height < 0:             # <<<<<<<<<<<<<<
 *             raise ValueError("invalid height: %d" % height)
 *         r_start += height
 */
    __pyx_t_11 = ((__pyx_v_height < 0) != 0);
    if (__pyx_t_11) {

      /* "rasterio/_base.pyx":770
 *     if r_start < 0:
 *         if height < 0:
 *             raise ValueError("invalid height: %d" % height)             # <<<<<<<<<<<<<<
 *         r_start += height
 *     r_stop = r[1] or height
 */
      __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_height); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 770, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_invalid_height_d, __pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 770, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 770, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_GIVEREF(__pyx_t_4);
      PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
      __pyx_t_4 = 0;
      __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_6, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 770, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_Raise(__pyx_t_4, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __PYX_ERR(0, 770, __pyx_L1_error)

      /* "rasterio/_base.pyx":769
 *     r_start = r[0] or 0
 *     if r_start < 0:
 *         if height < 0:             # <<<<<<<<<<<<<<
 *             raise ValueError("invalid height: %d" % height)
 *         r_start += height
 */
    }

    /* "rasterio/_base.pyx":771
 *         if height < 0:
 *             raise ValueError("invalid height: %d" % height)
 *         r_start += height             # <<<<<<<<<<<<<<
 *     r_stop = r[1] or height
 *     if r_stop < 0:
 */
    __pyx_v_r_start = (__pyx_v_r_start + __pyx_v_height);

    /* "rasterio/_base.pyx":768
 *                          "((row_start, row_stop), (col_start, col_stop))")
 *     r_start = r[0] or 0
 *     if r_start < 0:             # <<<<<<<<<<<<<<
 *         if height < 0:
 *             raise ValueError("invalid height: %d" % height)
 */
  }

  /* "rasterio/_base.pyx":772
 *             raise ValueError("invalid height: %d" % height)
 *         r_start += height
 *     r_stop = r[1] or height             # <<<<<<<<<<<<<<
 *     if r_stop < 0:
 *         if height < 0:
 */
  __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_r, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 772, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_11 < 0)) __PYX_ERR(0, 772, __pyx_L1_error)
  if (!__pyx_t_11) {
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __pyx_t_12 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 772, __pyx_L1_error)
    __pyx_t_9 = __pyx_t_12;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    goto __pyx_L19_bool_binop_done;
  }
  __pyx_t_9 = __pyx_v_height;
  __pyx_L19_bool_binop_done:;
  __pyx_v_r_stop = __pyx_t_9;

  /* "rasterio/_base.pyx":773
 *         r_start += height
 *     r_stop = r[1] or height
 *     if r_stop < 0:             # <<<<<<<<<<<<<<
 *         if height < 0:
 *             raise ValueError("invalid height: %d" % height)
 */
  __pyx_t_11 = ((__pyx_v_r_stop < 0) != 0);
  if (__pyx_t_11) {

    /* "rasterio/_base.pyx":774
 *     r_stop = r[1] or height
 *     if r_stop < 0:
 *         if height < 0:             # <<<<<<<<<<<<<<
 *             raise ValueError("invalid height: %d" % height)
 *         r_stop += height
 */
    __pyx_t_11 = ((__pyx_v_height < 0) != 0);
    if (__pyx_t_11) {

      /* "rasterio/_base.pyx":775
 *     if r_stop < 0:
 *         if height < 0:
 *             raise ValueError("invalid height: %d" % height)             # <<<<<<<<<<<<<<
 *         r_stop += height
 *     if not r_stop >= r_start:
 */
      __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_height); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 775, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_invalid_height_d, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 775, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 775, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_GIVEREF(__pyx_t_6);
      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6);
      __pyx_t_6 = 0;
      __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 775, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_Raise(__pyx_t_6, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __PYX_ERR(0, 775, __pyx_L1_error)

      /* "rasterio/_base.pyx":774
 *     r_stop = r[1] or height
 *     if r_stop < 0:
 *         if height < 0:             # <<<<<<<<<<<<<<
 *             raise ValueError("invalid height: %d" % height)
 *         r_stop += height
 */
    }

    /* "rasterio/_base.pyx":776
 *         if height < 0:
 *             raise ValueError("invalid height: %d" % height)
 *         r_stop += height             # <<<<<<<<<<<<<<
 *     if not r_stop >= r_start:
 *         raise ValueError(
 */
    __pyx_v_r_stop = (__pyx_v_r_stop + __pyx_v_height);

    /* "rasterio/_base.pyx":773
 *         r_start += height
 *     r_stop = r[1] or height
 *     if r_stop < 0:             # <<<<<<<<<<<<<<
 *         if height < 0:
 *             raise ValueError("invalid height: %d" % height)
 */
  }

  /* "rasterio/_base.pyx":777
 *             raise ValueError("invalid height: %d" % height)
 *         r_stop += height
 *     if not r_stop >= r_start:             # <<<<<<<<<<<<<<
 *         raise ValueError(
 *             "invalid window: row range (%d, %d)" % (r_start, r_stop))
 */
  __pyx_t_11 = ((!((__pyx_v_r_stop >= __pyx_v_r_start) != 0)) != 0);
  if (__pyx_t_11) {

    /* "rasterio/_base.pyx":779
 *     if not r_stop >= r_start:
 *         raise ValueError(
 *             "invalid window: row range (%d, %d)" % (r_start, r_stop))             # <<<<<<<<<<<<<<
 *     c_start = c[0] or 0
 *     if c_start < 0:
 */
    __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_r_start); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 779, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_r_stop); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 779, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 779, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_4);
    __pyx_t_6 = 0;
    __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_invalid_window_row_range_d_d, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 779, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;

    /* "rasterio/_base.pyx":778
 *         r_stop += height
 *     if not r_stop >= r_start:
 *         raise ValueError(             # <<<<<<<<<<<<<<
 *             "invalid window: row range (%d, %d)" % (r_start, r_stop))
 *     c_start = c[0] or 0
 */
    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 778, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
    __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 778, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_Raise(__pyx_t_4, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __PYX_ERR(0, 778, __pyx_L1_error)

    /* "rasterio/_base.pyx":777
 *             raise ValueError("invalid height: %d" % height)
 *         r_stop += height
 *     if not r_stop >= r_start:             # <<<<<<<<<<<<<<
 *         raise ValueError(
 *             "invalid window: row range (%d, %d)" % (r_start, r_stop))
 */
  }

  /* "rasterio/_base.pyx":780
 *         raise ValueError(
 *             "invalid window: row range (%d, %d)" % (r_start, r_stop))
 *     c_start = c[0] or 0             # <<<<<<<<<<<<<<
 *     if c_start < 0:
 *         if width < 0:
 */
  __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_c, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 780, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_11 < 0)) __PYX_ERR(0, 780, __pyx_L1_error)
  if (!__pyx_t_11) {
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __pyx_t_12 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 780, __pyx_L1_error)
    __pyx_t_9 = __pyx_t_12;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    goto __pyx_L24_bool_binop_done;
  }
  __pyx_t_9 = 0;
  __pyx_L24_bool_binop_done:;
  __pyx_v_c_start = __pyx_t_9;

  /* "rasterio/_base.pyx":781
 *             "invalid window: row range (%d, %d)" % (r_start, r_stop))
 *     c_start = c[0] or 0
 *     if c_start < 0:             # <<<<<<<<<<<<<<
 *         if width < 0:
 *             raise ValueError("invalid width: %d" % width)
 */
  __pyx_t_11 = ((__pyx_v_c_start < 0) != 0);
  if (__pyx_t_11) {

    /* "rasterio/_base.pyx":782
 *     c_start = c[0] or 0
 *     if c_start < 0:
 *         if width < 0:             # <<<<<<<<<<<<<<
 *             raise ValueError("invalid width: %d" % width)
 *         c_start += width
 */
    __pyx_t_11 = ((__pyx_v_width < 0) != 0);
    if (__pyx_t_11) {

      /* "rasterio/_base.pyx":783
 *     if c_start < 0:
 *         if width < 0:
 *             raise ValueError("invalid width: %d" % width)             # <<<<<<<<<<<<<<
 *         c_start += width
 *     c_stop = c[1] or width
 */
      __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_width); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 783, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_5 = __Pyx_PyString_Format(__pyx_kp_s_invalid_width_d, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 783, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 783, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_GIVEREF(__pyx_t_5);
      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
      __pyx_t_5 = 0;
      __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 783, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_Raise(__pyx_t_5, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __PYX_ERR(0, 783, __pyx_L1_error)

      /* "rasterio/_base.pyx":782
 *     c_start = c[0] or 0
 *     if c_start < 0:
 *         if width < 0:             # <<<<<<<<<<<<<<
 *             raise ValueError("invalid width: %d" % width)
 *         c_start += width
 */
    }

    /* "rasterio/_base.pyx":784
 *         if width < 0:
 *             raise ValueError("invalid width: %d" % width)
 *         c_start += width             # <<<<<<<<<<<<<<
 *     c_stop = c[1] or width
 *     if c_stop < 0:
 */
    __pyx_v_c_start = (__pyx_v_c_start + __pyx_v_width);

    /* "rasterio/_base.pyx":781
 *             "invalid window: row range (%d, %d)" % (r_start, r_stop))
 *     c_start = c[0] or 0
 *     if c_start < 0:             # <<<<<<<<<<<<<<
 *         if width < 0:
 *             raise ValueError("invalid width: %d" % width)
 */
  }

  /* "rasterio/_base.pyx":785
 *             raise ValueError("invalid width: %d" % width)
 *         c_start += width
 *     c_stop = c[1] or width             # <<<<<<<<<<<<<<
 *     if c_stop < 0:
 *         if width < 0:
 */
  __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_c, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 785, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_11 < 0)) __PYX_ERR(0, 785, __pyx_L1_error)
  if (!__pyx_t_11) {
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  } else {
    __pyx_t_12 = __Pyx_PyInt_As_int(__pyx_t_5); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 785, __pyx_L1_error)
    __pyx_t_9 = __pyx_t_12;
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    goto __pyx_L28_bool_binop_done;
  }
  __pyx_t_9 = __pyx_v_width;
  __pyx_L28_bool_binop_done:;
  __pyx_v_c_stop = __pyx_t_9;

  /* "rasterio/_base.pyx":786
 *         c_start += width
 *     c_stop = c[1] or width
 *     if c_stop < 0:             # <<<<<<<<<<<<<<
 *         if width < 0:
 *             raise ValueError("invalid width: %d" % width)
 */
  __pyx_t_11 = ((__pyx_v_c_stop < 0) != 0);
  if (__pyx_t_11) {

    /* "rasterio/_base.pyx":787
 *     c_stop = c[1] or width
 *     if c_stop < 0:
 *         if width < 0:             # <<<<<<<<<<<<<<
 *             raise ValueError("invalid width: %d" % width)
 *         c_stop += width
 */
    __pyx_t_11 = ((__pyx_v_width < 0) != 0);
    if (__pyx_t_11) {

      /* "rasterio/_base.pyx":788
 *     if c_stop < 0:
 *         if width < 0:
 *             raise ValueError("invalid width: %d" % width)             # <<<<<<<<<<<<<<
 *         c_stop += width
 *     if not c_stop >= c_start:
 */
      __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_width); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 788, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_invalid_width_d, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 788, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 788, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_GIVEREF(__pyx_t_4);
      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
      __pyx_t_4 = 0;
      __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 788, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_Raise(__pyx_t_4, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __PYX_ERR(0, 788, __pyx_L1_error)

      /* "rasterio/_base.pyx":787
 *     c_stop = c[1] or width
 *     if c_stop < 0:
 *         if width < 0:             # <<<<<<<<<<<<<<
 *             raise ValueError("invalid width: %d" % width)
 *         c_stop += width
 */
    }

    /* "rasterio/_base.pyx":789
 *         if width < 0:
 *             raise ValueError("invalid width: %d" % width)
 *         c_stop += width             # <<<<<<<<<<<<<<
 *     if not c_stop >= c_start:
 *         raise ValueError(
 */
    __pyx_v_c_stop = (__pyx_v_c_stop + __pyx_v_width);

    /* "rasterio/_base.pyx":786
 *         c_start += width
 *     c_stop = c[1] or width
 *     if c_stop < 0:             # <<<<<<<<<<<<<<
 *         if width < 0:
 *             raise ValueError("invalid width: %d" % width)
 */
  }

  /* "rasterio/_base.pyx":790
 *             raise ValueError("invalid width: %d" % width)
 *         c_stop += width
 *     if not c_stop >= c_start:             # <<<<<<<<<<<<<<
 *         raise ValueError(
 *             "invalid window: col range (%d, %d)" % (c_start, c_stop))
 */
  __pyx_t_11 = ((!((__pyx_v_c_stop >= __pyx_v_c_start) != 0)) != 0);
  if (__pyx_t_11) {

    /* "rasterio/_base.pyx":792
 *     if not c_stop >= c_start:
 *         raise ValueError(
 *             "invalid window: col range (%d, %d)" % (c_start, c_stop))             # <<<<<<<<<<<<<<
 *     return (r_start, r_stop), (c_start, c_stop)
 * 
 */
    __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_c_start); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 792, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_c_stop); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 792, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 792, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_5);
    PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
    __pyx_t_4 = 0;
    __pyx_t_5 = 0;
    __pyx_t_5 = __Pyx_PyString_Format(__pyx_kp_s_invalid_window_col_range_d_d, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 792, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;

    /* "rasterio/_base.pyx":791
 *         c_stop += width
 *     if not c_stop >= c_start:
 *         raise ValueError(             # <<<<<<<<<<<<<<
 *             "invalid window: col range (%d, %d)" % (c_start, c_stop))
 *     return (r_start, r_stop), (c_start, c_stop)
 */
    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 791, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_5);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5);
    __pyx_t_5 = 0;
    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_6, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 791, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_Raise(__pyx_t_5, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __PYX_ERR(0, 791, __pyx_L1_error)

    /* "rasterio/_base.pyx":790
 *             raise ValueError("invalid width: %d" % width)
 *         c_stop += width
 *     if not c_stop >= c_start:             # <<<<<<<<<<<<<<
 *         raise ValueError(
 *             "invalid window: col range (%d, %d)" % (c_start, c_stop))
 */
  }

  /* "rasterio/_base.pyx":793
 *         raise ValueError(
 *             "invalid window: col range (%d, %d)" % (c_start, c_stop))
 *     return (r_start, r_stop), (c_start, c_stop)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_r_start); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 793, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_r_stop); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 793, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 793, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_6);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_6);
  __pyx_t_5 = 0;
  __pyx_t_6 = 0;
  __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_c_start); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 793, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_c_stop); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 793, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 793, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_GIVEREF(__pyx_t_6);
  PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_6);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_5);
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 793, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_10);
  PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_10);
  __pyx_t_4 = 0;
  __pyx_t_10 = 0;
  __pyx_r = __pyx_t_5;
  __pyx_t_5 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":756
 * 
 * 
 * cpdef eval_window(object window, int height, int width):             # <<<<<<<<<<<<<<
 *     """Evaluates a window tuple that might contain negative values
 *     in the context of a raster height and width."""
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_AddTraceback("rasterio._base.eval_window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_r);
  __Pyx_XDECREF(__pyx_v_c);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_7eval_window(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_6eval_window[] = "Evaluates a window tuple that might contain negative values\n    in the context of a raster height and width.";
static PyObject *__pyx_pw_8rasterio_5_base_7eval_window(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_window = 0;
  int __pyx_v_height;
  int __pyx_v_width;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("eval_window (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_window,&__pyx_n_s_height,&__pyx_n_s_width,0};
    PyObject* values[3] = {0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_window)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_height)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("eval_window", 1, 3, 3, 1); __PYX_ERR(0, 756, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_width)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("eval_window", 1, 3, 3, 2); __PYX_ERR(0, 756, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "eval_window") < 0)) __PYX_ERR(0, 756, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
    }
    __pyx_v_window = values[0];
    __pyx_v_height = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_height == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 756, __pyx_L3_error)
    __pyx_v_width = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_width == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 756, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("eval_window", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 756, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.eval_window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_6eval_window(__pyx_self, __pyx_v_window, __pyx_v_height, __pyx_v_width);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_6eval_window(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_window, int __pyx_v_height, int __pyx_v_width) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("eval_window", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_f_8rasterio_5_base_eval_window(__pyx_v_window, __pyx_v_height, __pyx_v_width, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 756, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("rasterio._base.eval_window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":796
 * 
 * 
 * def get_index(x, y, affine, op=math.floor, precision=6):             # <<<<<<<<<<<<<<
 *     """
 *     Returns the (row, col) index of the pixel containing (x, y) given a
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_9get_index(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_8get_index[] = "\n    Returns the (row, col) index of the pixel containing (x, y) given a\n    coordinate reference system.\n\n    Parameters\n    ----------\n    x : float\n        x value in coordinate reference system\n    y : float\n        y value in coordinate reference system\n    affine : tuple\n        Coefficients mapping pixel coordinates to coordinate reference system.\n    op : function\n        Function to convert fractional pixels to whole numbers (floor, ceiling,\n        round)\n    precision : int\n        Decimal places of precision in indexing, as in `round()`.\n\n    Returns\n    -------\n    row : int\n        row index\n    col : int\n        col index\n    ";
static PyMethodDef __pyx_mdef_8rasterio_5_base_9get_index = {"get_index", (PyCFunction)__pyx_pw_8rasterio_5_base_9get_index, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_8get_index};
static PyObject *__pyx_pw_8rasterio_5_base_9get_index(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_x = 0;
  PyObject *__pyx_v_y = 0;
  PyObject *__pyx_v_affine = 0;
  PyObject *__pyx_v_op = 0;
  PyObject *__pyx_v_precision = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("get_index (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_y,&__pyx_n_s_affine,&__pyx_n_s_op,&__pyx_n_s_precision,0};
    PyObject* values[5] = {0,0,0,0,0};
    values[3] = __pyx_k__46;
    values[4] = ((PyObject *)__pyx_int_6);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("get_index", 0, 3, 5, 1); __PYX_ERR(0, 796, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_affine)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("get_index", 0, 3, 5, 2); __PYX_ERR(0, 796, __pyx_L3_error)
        }
        case  3:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_op);
          if (value) { values[3] = value; kw_args--; }
        }
        case  4:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_precision);
          if (value) { values[4] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_index") < 0)) __PYX_ERR(0, 796, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_x = values[0];
    __pyx_v_y = values[1];
    __pyx_v_affine = values[2];
    __pyx_v_op = values[3];
    __pyx_v_precision = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("get_index", 0, 3, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 796, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.get_index", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_8get_index(__pyx_self, __pyx_v_x, __pyx_v_y, __pyx_v_affine, __pyx_v_op, __pyx_v_precision);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_8get_index(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x, PyObject *__pyx_v_y, PyObject *__pyx_v_affine, PyObject *__pyx_v_op, PyObject *__pyx_v_precision) {
  PyObject *__pyx_v_eps = NULL;
  PyObject *__pyx_v_row = NULL;
  PyObject *__pyx_v_col = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannySetupContext("get_index", 0);

  /* "rasterio/_base.pyx":825
 *     # and sign determined by the op function: positive for floor, negative
 *     # for ceil.
 *     eps = 10.0**-precision * (1.0 - 2.0*op(0.1))             # <<<<<<<<<<<<<<
 *     row = int(op((y - eps - affine[5]) / affine[4]))
 *     col = int(op((x + eps - affine[2]) / affine[0]))
 */
  __pyx_t_1 = PyNumber_Negative(__pyx_v_precision); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 825, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyNumber_Power(__pyx_float_10_0, __pyx_t_1, Py_None); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 825, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_v_op, __pyx_tuple__47, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 825, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyNumber_Multiply(__pyx_float_2_0, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 825, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyFloat_SubtractCObj(__pyx_float_1_0, __pyx_t_3, 1.0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 825, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyNumber_Multiply(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 825, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_eps = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":826
 *     # for ceil.
 *     eps = 10.0**-precision * (1.0 - 2.0*op(0.1))
 *     row = int(op((y - eps - affine[5]) / affine[4]))             # <<<<<<<<<<<<<<
 *     col = int(op((x + eps - affine[2]) / affine[0]))
 *     return row, col
 */
  __pyx_t_1 = PyNumber_Subtract(__pyx_v_y, __pyx_v_eps); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 826, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_affine, 5, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 826, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = PyNumber_Subtract(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 826, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_affine, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 826, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyNumber_Divide(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 826, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_INCREF(__pyx_v_op);
  __pyx_t_2 = __pyx_v_op; __pyx_t_4 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (!__pyx_t_4) {
    __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 826, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_GOTREF(__pyx_t_3);
  } else {
    __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 826, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL;
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 826, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyNumber_Int(__pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 826, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_row = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":827
 *     eps = 10.0**-precision * (1.0 - 2.0*op(0.1))
 *     row = int(op((y - eps - affine[5]) / affine[4]))
 *     col = int(op((x + eps - affine[2]) / affine[0]))             # <<<<<<<<<<<<<<
 *     return row, col
 * 
 */
  __pyx_t_3 = PyNumber_Add(__pyx_v_x, __pyx_v_eps); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 827, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_affine, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 827, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_1 = PyNumber_Subtract(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 827, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_affine, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 827, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_3 = __Pyx_PyNumber_Divide(__pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 827, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_INCREF(__pyx_v_op);
  __pyx_t_5 = __pyx_v_op; __pyx_t_1 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_1)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_1);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
    }
  }
  if (!__pyx_t_1) {
    __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 827, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_GOTREF(__pyx_t_2);
  } else {
    __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 827, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); __pyx_t_1 = NULL;
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_t_3);
    __pyx_t_3 = 0;
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 827, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  }
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __Pyx_PyNumber_Int(__pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 827, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_col = __pyx_t_5;
  __pyx_t_5 = 0;

  /* "rasterio/_base.pyx":828
 *     row = int(op((y - eps - affine[5]) / affine[4]))
 *     col = int(op((x + eps - affine[2]) / affine[0]))
 *     return row, col             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 828, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_INCREF(__pyx_v_row);
  __Pyx_GIVEREF(__pyx_v_row);
  PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_row);
  __Pyx_INCREF(__pyx_v_col);
  __Pyx_GIVEREF(__pyx_v_col);
  PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_v_col);
  __pyx_r = __pyx_t_5;
  __pyx_t_5 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":796
 * 
 * 
 * def get_index(x, y, affine, op=math.floor, precision=6):             # <<<<<<<<<<<<<<
 *     """
 *     Returns the (row, col) index of the pixel containing (x, y) given a
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("rasterio._base.get_index", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_eps);
  __Pyx_XDECREF(__pyx_v_row);
  __Pyx_XDECREF(__pyx_v_col);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":831
 * 
 * 
 * def get_window(left, bottom, right, top, affine, precision=6):             # <<<<<<<<<<<<<<
 *     """
 *     Returns a window tuple given coordinate bounds and the coordinate reference
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_11get_window(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_10get_window[] = "\n    Returns a window tuple given coordinate bounds and the coordinate reference\n    system.\n\n    Parameters\n    ----------\n    left : float\n        Left edge of window\n    bottom : float\n        Bottom edge of window\n    right : float\n        Right edge of window\n    top : float\n        top edge of window\n    affine : tuple\n        Coefficients mapping pixel coordinates to coordinate reference system.\n    precision : int\n        Decimal places of precision in indexing, as in `round()`.\n    ";
static PyMethodDef __pyx_mdef_8rasterio_5_base_11get_window = {"get_window", (PyCFunction)__pyx_pw_8rasterio_5_base_11get_window, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_10get_window};
static PyObject *__pyx_pw_8rasterio_5_base_11get_window(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_left = 0;
  PyObject *__pyx_v_bottom = 0;
  PyObject *__pyx_v_right = 0;
  PyObject *__pyx_v_top = 0;
  PyObject *__pyx_v_affine = 0;
  PyObject *__pyx_v_precision = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("get_window (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_left,&__pyx_n_s_bottom,&__pyx_n_s_right,&__pyx_n_s_top,&__pyx_n_s_affine,&__pyx_n_s_precision,0};
    PyObject* values[6] = {0,0,0,0,0,0};
    values[5] = ((PyObject *)__pyx_int_6);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_left)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_bottom)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("get_window", 0, 5, 6, 1); __PYX_ERR(0, 831, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_right)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("get_window", 0, 5, 6, 2); __PYX_ERR(0, 831, __pyx_L3_error)
        }
        case  3:
        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_top)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("get_window", 0, 5, 6, 3); __PYX_ERR(0, 831, __pyx_L3_error)
        }
        case  4:
        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_affine)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("get_window", 0, 5, 6, 4); __PYX_ERR(0, 831, __pyx_L3_error)
        }
        case  5:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_precision);
          if (value) { values[5] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_window") < 0)) __PYX_ERR(0, 831, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_left = values[0];
    __pyx_v_bottom = values[1];
    __pyx_v_right = values[2];
    __pyx_v_top = values[3];
    __pyx_v_affine = values[4];
    __pyx_v_precision = values[5];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("get_window", 0, 5, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 831, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.get_window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_10get_window(__pyx_self, __pyx_v_left, __pyx_v_bottom, __pyx_v_right, __pyx_v_top, __pyx_v_affine, __pyx_v_precision);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_10get_window(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_left, PyObject *__pyx_v_bottom, PyObject *__pyx_v_right, PyObject *__pyx_v_top, PyObject *__pyx_v_affine, PyObject *__pyx_v_precision) {
  PyObject *__pyx_v_window_start = NULL;
  PyObject *__pyx_v_window_stop = NULL;
  PyObject *__pyx_v_window = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannySetupContext("get_window", 0);

  /* "rasterio/_base.pyx":851
 *         Decimal places of precision in indexing, as in `round()`.
 *     """
 *     window_start = get_index(             # <<<<<<<<<<<<<<
 *         left, top, affine, op=math.floor, precision=precision)
 *     window_stop = get_index(
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_get_index); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 851, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);

  /* "rasterio/_base.pyx":852
 *     """
 *     window_start = get_index(
 *         left, top, affine, op=math.floor, precision=precision)             # <<<<<<<<<<<<<<
 *     window_stop = get_index(
 *         right, bottom, affine, op=math.ceil, precision=precision)
 */
  __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 851, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_left);
  __Pyx_GIVEREF(__pyx_v_left);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_left);
  __Pyx_INCREF(__pyx_v_top);
  __Pyx_GIVEREF(__pyx_v_top);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_top);
  __Pyx_INCREF(__pyx_v_affine);
  __Pyx_GIVEREF(__pyx_v_affine);
  PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_affine);
  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 852, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_math); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 852, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_floor); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 852, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_op, __pyx_t_5) < 0) __PYX_ERR(0, 852, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_precision, __pyx_v_precision) < 0) __PYX_ERR(0, 852, __pyx_L1_error)

  /* "rasterio/_base.pyx":851
 *         Decimal places of precision in indexing, as in `round()`.
 *     """
 *     window_start = get_index(             # <<<<<<<<<<<<<<
 *         left, top, affine, op=math.floor, precision=precision)
 *     window_stop = get_index(
 */
  __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 851, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_window_start = __pyx_t_5;
  __pyx_t_5 = 0;

  /* "rasterio/_base.pyx":853
 *     window_start = get_index(
 *         left, top, affine, op=math.floor, precision=precision)
 *     window_stop = get_index(             # <<<<<<<<<<<<<<
 *         right, bottom, affine, op=math.ceil, precision=precision)
 *     window = tuple(zip(window_start, window_stop))
 */
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_get_index); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 853, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);

  /* "rasterio/_base.pyx":854
 *         left, top, affine, op=math.floor, precision=precision)
 *     window_stop = get_index(
 *         right, bottom, affine, op=math.ceil, precision=precision)             # <<<<<<<<<<<<<<
 *     window = tuple(zip(window_start, window_stop))
 *     return window
 */
  __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 853, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_v_right);
  __Pyx_GIVEREF(__pyx_v_right);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_right);
  __Pyx_INCREF(__pyx_v_bottom);
  __Pyx_GIVEREF(__pyx_v_bottom);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_bottom);
  __Pyx_INCREF(__pyx_v_affine);
  __Pyx_GIVEREF(__pyx_v_affine);
  PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_affine);
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 854, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_math); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 854, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ceil); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 854, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_op, __pyx_t_4) < 0) __PYX_ERR(0, 854, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_precision, __pyx_v_precision) < 0) __PYX_ERR(0, 854, __pyx_L1_error)

  /* "rasterio/_base.pyx":853
 *     window_start = get_index(
 *         left, top, affine, op=math.floor, precision=precision)
 *     window_stop = get_index(             # <<<<<<<<<<<<<<
 *         right, bottom, affine, op=math.ceil, precision=precision)
 *     window = tuple(zip(window_start, window_stop))
 */
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 853, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_window_stop = __pyx_t_4;
  __pyx_t_4 = 0;

  /* "rasterio/_base.pyx":855
 *     window_stop = get_index(
 *         right, bottom, affine, op=math.ceil, precision=precision)
 *     window = tuple(zip(window_start, window_stop))             # <<<<<<<<<<<<<<
 *     return window
 * 
 */
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(__pyx_v_window_start);
  __Pyx_GIVEREF(__pyx_v_window_start);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_window_start);
  __Pyx_INCREF(__pyx_v_window_stop);
  __Pyx_GIVEREF(__pyx_v_window_stop);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_window_stop);
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_zip, __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = PySequence_Tuple(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 855, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_window = ((PyObject*)__pyx_t_4);
  __pyx_t_4 = 0;

  /* "rasterio/_base.pyx":856
 *         right, bottom, affine, op=math.ceil, precision=precision)
 *     window = tuple(zip(window_start, window_stop))
 *     return window             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_window);
  __pyx_r = __pyx_v_window;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":831
 * 
 * 
 * def get_window(left, bottom, right, top, affine, precision=6):             # <<<<<<<<<<<<<<
 *     """
 *     Returns a window tuple given coordinate bounds and the coordinate reference
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("rasterio._base.get_window", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_window_start);
  __Pyx_XDECREF(__pyx_v_window_stop);
  __Pyx_XDECREF(__pyx_v_window);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":859
 * 
 * 
 * def window_shape(window, height=-1, width=-1):             # <<<<<<<<<<<<<<
 *     """Returns shape of a window.
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_13window_shape(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8rasterio_5_base_12window_shape[] = "Returns shape of a window.\n\n    height and width arguments are optional if there are no negative\n    values in the window.\n    ";
static PyMethodDef __pyx_mdef_8rasterio_5_base_13window_shape = {"window_shape", (PyCFunction)__pyx_pw_8rasterio_5_base_13window_shape, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_12window_shape};
static PyObject *__pyx_pw_8rasterio_5_base_13window_shape(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_window = 0;
  PyObject *__pyx_v_height = 0;
  PyObject *__pyx_v_width = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("window_shape (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_window,&__pyx_n_s_height,&__pyx_n_s_width,0};
    PyObject* values[3] = {0,0,0};
    values[1] = ((PyObject *)__pyx_int_neg_1);
    values[2] = ((PyObject *)__pyx_int_neg_1);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_window)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_height);
          if (value) { values[1] = value; kw_args--; }
        }
        case  2:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_width);
          if (value) { values[2] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "window_shape") < 0)) __PYX_ERR(0, 859, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_window = values[0];
    __pyx_v_height = values[1];
    __pyx_v_width = values[2];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("window_shape", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 859, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.window_shape", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_12window_shape(__pyx_self, __pyx_v_window, __pyx_v_height, __pyx_v_width);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_12window_shape(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_window, PyObject *__pyx_v_height, PyObject *__pyx_v_width) {
  PyObject *__pyx_v_a = NULL;
  PyObject *__pyx_v_b = NULL;
  PyObject *__pyx_v_c = NULL;
  PyObject *__pyx_v_d = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *(*__pyx_t_7)(PyObject *);
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  __Pyx_RefNannySetupContext("window_shape", 0);

  /* "rasterio/_base.pyx":865
 *     values in the window.
 *     """
 *     (a, b), (c, d) = eval_window(window, height, width)             # <<<<<<<<<<<<<<
 *     return b-a, d-c
 * 
 */
  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_height); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 865, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_v_width); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 865, __pyx_L1_error)
  __pyx_t_3 = __pyx_f_8rasterio_5_base_eval_window(__pyx_v_window, __pyx_t_1, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 865, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
    PyObject* sequence = __pyx_t_3;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 865, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_5);
    #else
    __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 865, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 865, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    #endif
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 865, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_4);
    index = 1; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) __PYX_ERR(0, 865, __pyx_L1_error)
    __pyx_t_7 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_7 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 865, __pyx_L1_error)
    __pyx_L4_unpacking_done:;
  }
  if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
    PyObject* sequence = __pyx_t_4;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 865, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_8 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_6 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_8 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_t_8);
    #else
    __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 865, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_8 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 865, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    #endif
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_9 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 865, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_7 = Py_TYPE(__pyx_t_9)->tp_iternext;
    index = 0; __pyx_t_6 = __pyx_t_7(__pyx_t_9); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_6);
    index = 1; __pyx_t_8 = __pyx_t_7(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L5_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_8);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_9), 2) < 0) __PYX_ERR(0, 865, __pyx_L1_error)
    __pyx_t_7 = NULL;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    goto __pyx_L6_unpacking_done;
    __pyx_L5_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __pyx_t_7 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 865, __pyx_L1_error)
    __pyx_L6_unpacking_done:;
  }
  __pyx_v_a = __pyx_t_6;
  __pyx_t_6 = 0;
  __pyx_v_b = __pyx_t_8;
  __pyx_t_8 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_5))) || (PyList_CheckExact(__pyx_t_5))) {
    PyObject* sequence = __pyx_t_5;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      __PYX_ERR(0, 865, __pyx_L1_error)
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_8 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_8 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_8);
    __Pyx_INCREF(__pyx_t_6);
    #else
    __pyx_t_8 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 865, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 865, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    #endif
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_9 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 865, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_7 = Py_TYPE(__pyx_t_9)->tp_iternext;
    index = 0; __pyx_t_8 = __pyx_t_7(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L7_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_8);
    index = 1; __pyx_t_6 = __pyx_t_7(__pyx_t_9); if (unlikely(!__pyx_t_6)) goto __pyx_L7_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_6);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_9), 2) < 0) __PYX_ERR(0, 865, __pyx_L1_error)
    __pyx_t_7 = NULL;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    goto __pyx_L8_unpacking_done;
    __pyx_L7_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __pyx_t_7 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 865, __pyx_L1_error)
    __pyx_L8_unpacking_done:;
  }
  __pyx_v_c = __pyx_t_8;
  __pyx_t_8 = 0;
  __pyx_v_d = __pyx_t_6;
  __pyx_t_6 = 0;

  /* "rasterio/_base.pyx":866
 *     """
 *     (a, b), (c, d) = eval_window(window, height, width)
 *     return b-a, d-c             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = PyNumber_Subtract(__pyx_v_b, __pyx_v_a); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 866, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = PyNumber_Subtract(__pyx_v_d, __pyx_v_c); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 866, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 866, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_5);
  __pyx_t_3 = 0;
  __pyx_t_5 = 0;
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":859
 * 
 * 
 * def window_shape(window, height=-1, width=-1):             # <<<<<<<<<<<<<<
 *     """Returns shape of a window.
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("rasterio._base.window_shape", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_a);
  __Pyx_XDECREF(__pyx_v_b);
  __Pyx_XDECREF(__pyx_v_c);
  __Pyx_XDECREF(__pyx_v_d);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":869
 * 
 * 
 * def window_index(window):             # <<<<<<<<<<<<<<
 *     return tuple(slice(*w) for w in window)
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_15window_index(PyObject *__pyx_self, PyObject *__pyx_v_window); /*proto*/
static PyMethodDef __pyx_mdef_8rasterio_5_base_15window_index = {"window_index", (PyCFunction)__pyx_pw_8rasterio_5_base_15window_index, METH_O, 0};
static PyObject *__pyx_pw_8rasterio_5_base_15window_index(PyObject *__pyx_self, PyObject *__pyx_v_window) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("window_index (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_14window_index(__pyx_self, ((PyObject *)__pyx_v_window));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
static PyObject *__pyx_gb_8rasterio_5_base_12window_index_2generator2(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */

/* "rasterio/_base.pyx":870
 * 
 * def window_index(window):
 *     return tuple(slice(*w) for w in window)             # <<<<<<<<<<<<<<
 * 
 * 
 */

static PyObject *__pyx_pf_8rasterio_5_base_12window_index_genexpr(PyObject *__pyx_self) {
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_4_genexpr *__pyx_cur_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("genexpr", 0);
  __pyx_cur_scope = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_4_genexpr *)__pyx_tp_new_8rasterio_5_base___pyx_scope_struct_4_genexpr(__pyx_ptype_8rasterio_5_base___pyx_scope_struct_4_genexpr, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index *) __pyx_self;
  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
  {
    __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_8rasterio_5_base_12window_index_2generator2, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_window_index_locals_genexpr); if (unlikely(!gen)) __PYX_ERR(0, 870, __pyx_L1_error)
    __Pyx_DECREF(__pyx_cur_scope);
    __Pyx_RefNannyFinishContext();
    return (PyObject *) gen;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_AddTraceback("rasterio._base.window_index.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_gb_8rasterio_5_base_12window_index_2generator2(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
{
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_4_genexpr *__pyx_cur_scope = ((struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_4_genexpr *)__pyx_generator->closure);
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  Py_ssize_t __pyx_t_2;
  PyObject *(*__pyx_t_3)(PyObject *);
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("None", 0);
  switch (__pyx_generator->resume_label) {
    case 0: goto __pyx_L3_first_run;
    case 1: goto __pyx_L6_resume_from_yield;
    default: /* CPython raises the right error here */
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __pyx_L3_first_run:;
  if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 870, __pyx_L1_error)
  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_window)) { __Pyx_RaiseClosureNameError("window"); __PYX_ERR(0, 870, __pyx_L1_error) }
  if (likely(PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_window)) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_window)) {
    __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_window; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
    __pyx_t_3 = NULL;
  } else {
    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_window); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 870, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 870, __pyx_L1_error)
  }
  for (;;) {
    if (likely(!__pyx_t_3)) {
      if (likely(PyList_CheckExact(__pyx_t_1))) {
        if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 870, __pyx_L1_error)
        #else
        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 870, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        #endif
      } else {
        if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 870, __pyx_L1_error)
        #else
        __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 870, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        #endif
      }
    } else {
      __pyx_t_4 = __pyx_t_3(__pyx_t_1);
      if (unlikely(!__pyx_t_4)) {
        PyObject* exc_type = PyErr_Occurred();
        if (exc_type) {
          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
          else __PYX_ERR(0, 870, __pyx_L1_error)
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_4);
    }
    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_w);
    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_w, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_4);
    __pyx_t_4 = 0;
    __pyx_t_4 = PySequence_Tuple(__pyx_cur_scope->__pyx_v_w); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 870, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)(&PySlice_Type)), __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 870, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_r = __pyx_t_5;
    __pyx_t_5 = 0;
    __Pyx_XGIVEREF(__pyx_t_1);
    __pyx_cur_scope->__pyx_t_0 = __pyx_t_1;
    __pyx_cur_scope->__pyx_t_1 = __pyx_t_2;
    __pyx_cur_scope->__pyx_t_2 = __pyx_t_3;
    __Pyx_XGIVEREF(__pyx_r);
    __Pyx_RefNannyFinishContext();
    /* return from generator, yielding value */
    __pyx_generator->resume_label = 1;
    return __pyx_r;
    __pyx_L6_resume_from_yield:;
    __pyx_t_1 = __pyx_cur_scope->__pyx_t_0;
    __pyx_cur_scope->__pyx_t_0 = 0;
    __Pyx_XGOTREF(__pyx_t_1);
    __pyx_t_2 = __pyx_cur_scope->__pyx_t_1;
    __pyx_t_3 = __pyx_cur_scope->__pyx_t_2;
    if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 870, __pyx_L1_error)
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* function exit code */
  PyErr_SetNone(PyExc_StopIteration);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
  __pyx_generator->resume_label = -1;
  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":869
 * 
 * 
 * def window_index(window):             # <<<<<<<<<<<<<<
 *     return tuple(slice(*w) for w in window)
 * 
 */

static PyObject *__pyx_pf_8rasterio_5_base_14window_index(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_window) {
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index *__pyx_cur_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  __Pyx_RefNannySetupContext("window_index", 0);
  __pyx_cur_scope = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index *)__pyx_tp_new_8rasterio_5_base___pyx_scope_struct_3_window_index(__pyx_ptype_8rasterio_5_base___pyx_scope_struct_3_window_index, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_v_window = __pyx_v_window;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_window);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_window);

  /* "rasterio/_base.pyx":870
 * 
 * def window_index(window):
 *     return tuple(slice(*w) for w in window)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_pf_8rasterio_5_base_12window_index_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 870, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PySequence_Tuple(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 870, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":869
 * 
 * 
 * def window_index(window):             # <<<<<<<<<<<<<<
 *     return tuple(slice(*w) for w in window)
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("rasterio._base.window_index", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":873
 * 
 * 
 * def tastes_like_gdal(t):             # <<<<<<<<<<<<<<
 *     return t[2] == t[4] == 0.0 and t[1] > 0 and t[5] < 0
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_17tastes_like_gdal(PyObject *__pyx_self, PyObject *__pyx_v_t); /*proto*/
static PyMethodDef __pyx_mdef_8rasterio_5_base_17tastes_like_gdal = {"tastes_like_gdal", (PyCFunction)__pyx_pw_8rasterio_5_base_17tastes_like_gdal, METH_O, 0};
static PyObject *__pyx_pw_8rasterio_5_base_17tastes_like_gdal(PyObject *__pyx_self, PyObject *__pyx_v_t) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("tastes_like_gdal (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_16tastes_like_gdal(__pyx_self, ((PyObject *)__pyx_v_t));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_16tastes_like_gdal(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_t) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_t_5;
  __Pyx_RefNannySetupContext("tastes_like_gdal", 0);

  /* "rasterio/_base.pyx":874
 * 
 * def tastes_like_gdal(t):
 *     return t[2] == t[4] == 0.0 and t[1] > 0 and t[5] < 0             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_t, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 874, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_t, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 874, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 874, __pyx_L1_error)
  if (__Pyx_PyObject_IsTrue(__pyx_t_4)) {
    __Pyx_DECREF(__pyx_t_4);
    __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_float_0_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 874, __pyx_L1_error)
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 874, __pyx_L1_error)
  if (__pyx_t_5) {
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __Pyx_INCREF(__pyx_t_4);
    __pyx_t_1 = __pyx_t_4;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    goto __pyx_L3_bool_binop_done;
  }
  __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_t, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 874, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyObject_RichCompare(__pyx_t_4, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 874, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 874, __pyx_L1_error)
  if (__pyx_t_5) {
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    __Pyx_INCREF(__pyx_t_3);
    __pyx_t_1 = __pyx_t_3;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    goto __pyx_L3_bool_binop_done;
  }
  __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_t, 5, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 874, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 874, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_INCREF(__pyx_t_4);
  __pyx_t_1 = __pyx_t_4;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_L3_bool_binop_done:;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":873
 * 
 * 
 * def tastes_like_gdal(t):             # <<<<<<<<<<<<<<
 *     return t[2] == t[4] == 0.0 and t[1] > 0 and t[5] < 0
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("rasterio._base.tastes_like_gdal", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":877
 * 
 * 
 * cdef void *_osr_from_crs(object crs):             # <<<<<<<<<<<<<<
 *     """Returns a reference to memory that must be deallocated
 *     by the caller."""
 */

static void *__pyx_f_8rasterio_5_base__osr_from_crs(PyObject *__pyx_v_crs) {
  char *__pyx_v_proj_c;
  void *__pyx_v_osr;
  PyObject *__pyx_v_params = NULL;
  PyObject *__pyx_v_init = NULL;
  PyObject *__pyx_v_auth = NULL;
  PyObject *__pyx_v_val = NULL;
  PyObject *__pyx_v_k = NULL;
  PyObject *__pyx_v_v = NULL;
  PyObject *__pyx_v_proj = NULL;
  PyObject *__pyx_v_proj_b = NULL;
  void *__pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_t_2;
  int __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *(*__pyx_t_7)(PyObject *);
  int __pyx_t_8;
  Py_ssize_t __pyx_t_9;
  PyObject *(*__pyx_t_10)(PyObject *);
  PyObject *__pyx_t_11 = NULL;
  int __pyx_t_12;
  int __pyx_t_13;
  char *__pyx_t_14;
  __Pyx_RefNannySetupContext("_osr_from_crs", 0);

  /* "rasterio/_base.pyx":880
 *     """Returns a reference to memory that must be deallocated
 *     by the caller."""
 *     cdef char *proj_c = NULL             # <<<<<<<<<<<<<<
 *     cdef void *osr = _gdal.OSRNewSpatialReference(NULL)
 *     params = []
 */
  __pyx_v_proj_c = NULL;

  /* "rasterio/_base.pyx":881
 *     by the caller."""
 *     cdef char *proj_c = NULL
 *     cdef void *osr = _gdal.OSRNewSpatialReference(NULL)             # <<<<<<<<<<<<<<
 *     params = []
 *     # Normally, we expect a CRS dict.
 */
  __pyx_v_osr = OSRNewSpatialReference(NULL);

  /* "rasterio/_base.pyx":882
 *     cdef char *proj_c = NULL
 *     cdef void *osr = _gdal.OSRNewSpatialReference(NULL)
 *     params = []             # <<<<<<<<<<<<<<
 *     # Normally, we expect a CRS dict.
 *     if isinstance(crs, dict):
 */
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 882, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_params = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":884
 *     params = []
 *     # Normally, we expect a CRS dict.
 *     if isinstance(crs, dict):             # <<<<<<<<<<<<<<
 *         # EPSG is a special case.
 *         init = crs.get('init')
 */
  __pyx_t_2 = PyDict_Check(__pyx_v_crs); 
  __pyx_t_3 = (__pyx_t_2 != 0);
  if (__pyx_t_3) {

    /* "rasterio/_base.pyx":886
 *     if isinstance(crs, dict):
 *         # EPSG is a special case.
 *         init = crs.get('init')             # <<<<<<<<<<<<<<
 *         if init:
 *             auth, val = init.split(':')
 */
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_crs, __pyx_n_s_get); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 886, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__48, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 886, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_v_init = __pyx_t_4;
    __pyx_t_4 = 0;

    /* "rasterio/_base.pyx":887
 *         # EPSG is a special case.
 *         init = crs.get('init')
 *         if init:             # <<<<<<<<<<<<<<
 *             auth, val = init.split(':')
 *             if auth.upper() == 'EPSG':
 */
    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_init); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 887, __pyx_L1_error)
    if (__pyx_t_3) {

      /* "rasterio/_base.pyx":888
 *         init = crs.get('init')
 *         if init:
 *             auth, val = init.split(':')             # <<<<<<<<<<<<<<
 *             if auth.upper() == 'EPSG':
 *                 _gdal.OSRImportFromEPSG(osr, int(val))
 */
      __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_init, __pyx_n_s_split); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 888, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__50, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 888, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
        PyObject* sequence = __pyx_t_1;
        #if CYTHON_COMPILING_IN_CPYTHON
        Py_ssize_t size = Py_SIZE(sequence);
        #else
        Py_ssize_t size = PySequence_Size(sequence);
        #endif
        if (unlikely(size != 2)) {
          if (size > 2) __Pyx_RaiseTooManyValuesError(2);
          else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
          __PYX_ERR(0, 888, __pyx_L1_error)
        }
        #if CYTHON_COMPILING_IN_CPYTHON
        if (likely(PyTuple_CheckExact(sequence))) {
          __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
          __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); 
        } else {
          __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
          __pyx_t_5 = PyList_GET_ITEM(sequence, 1); 
        }
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_5);
        #else
        __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 888, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 888, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        #endif
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      } else {
        Py_ssize_t index = -1;
        __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 888, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext;
        index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L5_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_4);
        index = 1; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_5);
        if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) __PYX_ERR(0, 888, __pyx_L1_error)
        __pyx_t_7 = NULL;
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        goto __pyx_L6_unpacking_done;
        __pyx_L5_unpacking_failed:;
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_7 = NULL;
        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
        __PYX_ERR(0, 888, __pyx_L1_error)
        __pyx_L6_unpacking_done:;
      }
      __pyx_v_auth = __pyx_t_4;
      __pyx_t_4 = 0;
      __pyx_v_val = __pyx_t_5;
      __pyx_t_5 = 0;

      /* "rasterio/_base.pyx":889
 *         if init:
 *             auth, val = init.split(':')
 *             if auth.upper() == 'EPSG':             # <<<<<<<<<<<<<<
 *                 _gdal.OSRImportFromEPSG(osr, int(val))
 *         else:
 */
      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_auth, __pyx_n_s_upper); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 889, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_4 = NULL;
      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5);
        if (likely(__pyx_t_4)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_5, function);
        }
      }
      if (__pyx_t_4) {
        __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 889, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      } else {
        __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 889, __pyx_L1_error)
      }
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_t_1, __pyx_n_s_EPSG, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 889, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      if (__pyx_t_3) {

        /* "rasterio/_base.pyx":890
 *             auth, val = init.split(':')
 *             if auth.upper() == 'EPSG':
 *                 _gdal.OSRImportFromEPSG(osr, int(val))             # <<<<<<<<<<<<<<
 *         else:
 *             crs['wktext'] = True
 */
        __pyx_t_1 = __Pyx_PyNumber_Int(__pyx_v_val); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 890, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_8 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 890, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        OSRImportFromEPSG(__pyx_v_osr, __pyx_t_8);

        /* "rasterio/_base.pyx":889
 *         if init:
 *             auth, val = init.split(':')
 *             if auth.upper() == 'EPSG':             # <<<<<<<<<<<<<<
 *                 _gdal.OSRImportFromEPSG(osr, int(val))
 *         else:
 */
      }

      /* "rasterio/_base.pyx":887
 *         # EPSG is a special case.
 *         init = crs.get('init')
 *         if init:             # <<<<<<<<<<<<<<
 *             auth, val = init.split(':')
 *             if auth.upper() == 'EPSG':
 */
      goto __pyx_L4;
    }

    /* "rasterio/_base.pyx":892
 *                 _gdal.OSRImportFromEPSG(osr, int(val))
 *         else:
 *             crs['wktext'] = True             # <<<<<<<<<<<<<<
 *             for k, v in crs.items():
 *                 if v is True or (k in ('no_defs', 'wktext') and v):
 */
    /*else*/ {
      if (unlikely(PyObject_SetItem(__pyx_v_crs, __pyx_n_s_wktext, Py_True) < 0)) __PYX_ERR(0, 892, __pyx_L1_error)

      /* "rasterio/_base.pyx":893
 *         else:
 *             crs['wktext'] = True
 *             for k, v in crs.items():             # <<<<<<<<<<<<<<
 *                 if v is True or (k in ('no_defs', 'wktext') and v):
 *                     params.append("+%s" % k)
 */
      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_crs, __pyx_n_s_items); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 893, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_4 = NULL;
      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5);
        if (likely(__pyx_t_4)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_5, function);
        }
      }
      if (__pyx_t_4) {
        __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 893, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      } else {
        __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 893, __pyx_L1_error)
      }
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      if (likely(PyList_CheckExact(__pyx_t_1)) || PyTuple_CheckExact(__pyx_t_1)) {
        __pyx_t_5 = __pyx_t_1; __Pyx_INCREF(__pyx_t_5); __pyx_t_9 = 0;
        __pyx_t_10 = NULL;
      } else {
        __pyx_t_9 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 893, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __pyx_t_10 = Py_TYPE(__pyx_t_5)->tp_iternext; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 893, __pyx_L1_error)
      }
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      for (;;) {
        if (likely(!__pyx_t_10)) {
          if (likely(PyList_CheckExact(__pyx_t_5))) {
            if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_5)) break;
            #if CYTHON_COMPILING_IN_CPYTHON
            __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_9); __Pyx_INCREF(__pyx_t_1); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 893, __pyx_L1_error)
            #else
            __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 893, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_1);
            #endif
          } else {
            if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
            #if CYTHON_COMPILING_IN_CPYTHON
            __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_9); __Pyx_INCREF(__pyx_t_1); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 893, __pyx_L1_error)
            #else
            __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 893, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_1);
            #endif
          }
        } else {
          __pyx_t_1 = __pyx_t_10(__pyx_t_5);
          if (unlikely(!__pyx_t_1)) {
            PyObject* exc_type = PyErr_Occurred();
            if (exc_type) {
              if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
              else __PYX_ERR(0, 893, __pyx_L1_error)
            }
            break;
          }
          __Pyx_GOTREF(__pyx_t_1);
        }
        if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
          PyObject* sequence = __pyx_t_1;
          #if CYTHON_COMPILING_IN_CPYTHON
          Py_ssize_t size = Py_SIZE(sequence);
          #else
          Py_ssize_t size = PySequence_Size(sequence);
          #endif
          if (unlikely(size != 2)) {
            if (size > 2) __Pyx_RaiseTooManyValuesError(2);
            else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
            __PYX_ERR(0, 893, __pyx_L1_error)
          }
          #if CYTHON_COMPILING_IN_CPYTHON
          if (likely(PyTuple_CheckExact(sequence))) {
            __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
            __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
          } else {
            __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
            __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
          }
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(__pyx_t_6);
          #else
          __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 893, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_4);
          __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 893, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          #endif
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        } else {
          Py_ssize_t index = -1;
          __pyx_t_11 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 893, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_11);
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_7 = Py_TYPE(__pyx_t_11)->tp_iternext;
          index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_11); if (unlikely(!__pyx_t_4)) goto __pyx_L10_unpacking_failed;
          __Pyx_GOTREF(__pyx_t_4);
          index = 1; __pyx_t_6 = __pyx_t_7(__pyx_t_11); if (unlikely(!__pyx_t_6)) goto __pyx_L10_unpacking_failed;
          __Pyx_GOTREF(__pyx_t_6);
          if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_11), 2) < 0) __PYX_ERR(0, 893, __pyx_L1_error)
          __pyx_t_7 = NULL;
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          goto __pyx_L11_unpacking_done;
          __pyx_L10_unpacking_failed:;
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          __pyx_t_7 = NULL;
          if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
          __PYX_ERR(0, 893, __pyx_L1_error)
          __pyx_L11_unpacking_done:;
        }
        __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_4);
        __pyx_t_4 = 0;
        __Pyx_XDECREF_SET(__pyx_v_v, __pyx_t_6);
        __pyx_t_6 = 0;

        /* "rasterio/_base.pyx":894
 *             crs['wktext'] = True
 *             for k, v in crs.items():
 *                 if v is True or (k in ('no_defs', 'wktext') and v):             # <<<<<<<<<<<<<<
 *                     params.append("+%s" % k)
 *                 else:
 */
        __pyx_t_2 = (__pyx_v_v == Py_True);
        __pyx_t_12 = (__pyx_t_2 != 0);
        if (!__pyx_t_12) {
        } else {
          __pyx_t_3 = __pyx_t_12;
          goto __pyx_L13_bool_binop_done;
        }
        __Pyx_INCREF(__pyx_v_k);
        __pyx_t_1 = __pyx_v_k;
        __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_t_1, __pyx_n_s_no_defs, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 894, __pyx_L1_error)
        if (!__pyx_t_2) {
        } else {
          __pyx_t_12 = __pyx_t_2;
          goto __pyx_L16_bool_binop_done;
        }
        __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_t_1, __pyx_n_s_wktext, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 894, __pyx_L1_error)
        __pyx_t_12 = __pyx_t_2;
        __pyx_L16_bool_binop_done:;
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_t_2 = (__pyx_t_12 != 0);
        if (__pyx_t_2) {
        } else {
          __pyx_t_3 = __pyx_t_2;
          goto __pyx_L13_bool_binop_done;
        }
        __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_v); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 894, __pyx_L1_error)
        __pyx_t_3 = __pyx_t_2;
        __pyx_L13_bool_binop_done:;
        if (__pyx_t_3) {

          /* "rasterio/_base.pyx":895
 *             for k, v in crs.items():
 *                 if v is True or (k in ('no_defs', 'wktext') and v):
 *                     params.append("+%s" % k)             # <<<<<<<<<<<<<<
 *                 else:
 *                     params.append("+%s=%s" % (k, v))
 */
          __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_s, __pyx_v_k); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 895, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_13 = __Pyx_PyList_Append(__pyx_v_params, __pyx_t_1); if (unlikely(__pyx_t_13 == -1)) __PYX_ERR(0, 895, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

          /* "rasterio/_base.pyx":894
 *             crs['wktext'] = True
 *             for k, v in crs.items():
 *                 if v is True or (k in ('no_defs', 'wktext') and v):             # <<<<<<<<<<<<<<
 *                     params.append("+%s" % k)
 *                 else:
 */
          goto __pyx_L12;
        }

        /* "rasterio/_base.pyx":897
 *                     params.append("+%s" % k)
 *                 else:
 *                     params.append("+%s=%s" % (k, v))             # <<<<<<<<<<<<<<
 *             proj = " ".join(params)
 *             log.debug("PROJ.4 to be imported: %r", proj)
 */
        /*else*/ {
          __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 897, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_INCREF(__pyx_v_k);
          __Pyx_GIVEREF(__pyx_v_k);
          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_k);
          __Pyx_INCREF(__pyx_v_v);
          __Pyx_GIVEREF(__pyx_v_v);
          PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_v);
          __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_s_s, __pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 897, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_13 = __Pyx_PyList_Append(__pyx_v_params, __pyx_t_6); if (unlikely(__pyx_t_13 == -1)) __PYX_ERR(0, 897, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        }
        __pyx_L12:;

        /* "rasterio/_base.pyx":893
 *         else:
 *             crs['wktext'] = True
 *             for k, v in crs.items():             # <<<<<<<<<<<<<<
 *                 if v is True or (k in ('no_defs', 'wktext') and v):
 *                     params.append("+%s" % k)
 */
      }
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;

      /* "rasterio/_base.pyx":898
 *                 else:
 *                     params.append("+%s=%s" % (k, v))
 *             proj = " ".join(params)             # <<<<<<<<<<<<<<
 *             log.debug("PROJ.4 to be imported: %r", proj)
 *             proj_b = proj.encode('utf-8')
 */
      __pyx_t_5 = __Pyx_PyString_Join(__pyx_kp_s__30, __pyx_v_params); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 898, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_v_proj = ((PyObject*)__pyx_t_5);
      __pyx_t_5 = 0;

      /* "rasterio/_base.pyx":899
 *                     params.append("+%s=%s" % (k, v))
 *             proj = " ".join(params)
 *             log.debug("PROJ.4 to be imported: %r", proj)             # <<<<<<<<<<<<<<
 *             proj_b = proj.encode('utf-8')
 *             proj_c = proj_b
 */
      __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_log); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 899, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_debug); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 899, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_t_6 = NULL;
      __pyx_t_9 = 0;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_1))) {
        __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1);
        if (likely(__pyx_t_6)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
          __Pyx_INCREF(__pyx_t_6);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_1, function);
          __pyx_t_9 = 1;
        }
      }
      __pyx_t_4 = PyTuple_New(2+__pyx_t_9); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 899, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      if (__pyx_t_6) {
        __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); __pyx_t_6 = NULL;
      }
      __Pyx_INCREF(__pyx_kp_s_PROJ_4_to_be_imported_r);
      __Pyx_GIVEREF(__pyx_kp_s_PROJ_4_to_be_imported_r);
      PyTuple_SET_ITEM(__pyx_t_4, 0+__pyx_t_9, __pyx_kp_s_PROJ_4_to_be_imported_r);
      __Pyx_INCREF(__pyx_v_proj);
      __Pyx_GIVEREF(__pyx_v_proj);
      PyTuple_SET_ITEM(__pyx_t_4, 1+__pyx_t_9, __pyx_v_proj);
      __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 899, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;

      /* "rasterio/_base.pyx":900
 *             proj = " ".join(params)
 *             log.debug("PROJ.4 to be imported: %r", proj)
 *             proj_b = proj.encode('utf-8')             # <<<<<<<<<<<<<<
 *             proj_c = proj_b
 *             _gdal.OSRImportFromProj4(osr, proj_c)
 */
      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_proj, __pyx_n_s_encode); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 900, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple__51, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 900, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_v_proj_b = __pyx_t_1;
      __pyx_t_1 = 0;

      /* "rasterio/_base.pyx":901
 *             log.debug("PROJ.4 to be imported: %r", proj)
 *             proj_b = proj.encode('utf-8')
 *             proj_c = proj_b             # <<<<<<<<<<<<<<
 *             _gdal.OSRImportFromProj4(osr, proj_c)
 *     # Fall back for CRS strings like "EPSG:3857."
 */
      __pyx_t_14 = __Pyx_PyObject_AsString(__pyx_v_proj_b); if (unlikely((!__pyx_t_14) && PyErr_Occurred())) __PYX_ERR(0, 901, __pyx_L1_error)
      __pyx_v_proj_c = __pyx_t_14;

      /* "rasterio/_base.pyx":902
 *             proj_b = proj.encode('utf-8')
 *             proj_c = proj_b
 *             _gdal.OSRImportFromProj4(osr, proj_c)             # <<<<<<<<<<<<<<
 *     # Fall back for CRS strings like "EPSG:3857."
 *     else:
 */
      OSRImportFromProj4(__pyx_v_osr, __pyx_v_proj_c);
    }
    __pyx_L4:;

    /* "rasterio/_base.pyx":884
 *     params = []
 *     # Normally, we expect a CRS dict.
 *     if isinstance(crs, dict):             # <<<<<<<<<<<<<<
 *         # EPSG is a special case.
 *         init = crs.get('init')
 */
    goto __pyx_L3;
  }

  /* "rasterio/_base.pyx":905
 *     # Fall back for CRS strings like "EPSG:3857."
 *     else:
 *         proj_b = crs.encode('utf-8')             # <<<<<<<<<<<<<<
 *         proj_c = proj_b
 *         _gdal.OSRSetFromUserInput(osr, proj_c)
 */
  /*else*/ {
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_crs, __pyx_n_s_encode); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 905, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__52, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 905, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_v_proj_b = __pyx_t_5;
    __pyx_t_5 = 0;

    /* "rasterio/_base.pyx":906
 *     else:
 *         proj_b = crs.encode('utf-8')
 *         proj_c = proj_b             # <<<<<<<<<<<<<<
 *         _gdal.OSRSetFromUserInput(osr, proj_c)
 *     return osr
 */
    __pyx_t_14 = __Pyx_PyObject_AsString(__pyx_v_proj_b); if (unlikely((!__pyx_t_14) && PyErr_Occurred())) __PYX_ERR(0, 906, __pyx_L1_error)
    __pyx_v_proj_c = __pyx_t_14;

    /* "rasterio/_base.pyx":907
 *         proj_b = crs.encode('utf-8')
 *         proj_c = proj_b
 *         _gdal.OSRSetFromUserInput(osr, proj_c)             # <<<<<<<<<<<<<<
 *     return osr
 * 
 */
    OSRSetFromUserInput(__pyx_v_osr, __pyx_v_proj_c);
  }
  __pyx_L3:;

  /* "rasterio/_base.pyx":908
 *         proj_c = proj_b
 *         _gdal.OSRSetFromUserInput(osr, proj_c)
 *     return osr             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_r = __pyx_v_osr;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":877
 * 
 * 
 * cdef void *_osr_from_crs(object crs):             # <<<<<<<<<<<<<<
 *     """Returns a reference to memory that must be deallocated
 *     by the caller."""
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_WriteUnraisable("rasterio._base._osr_from_crs", __pyx_clineno, __pyx_lineno, __pyx_filename, 0, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_params);
  __Pyx_XDECREF(__pyx_v_init);
  __Pyx_XDECREF(__pyx_v_auth);
  __Pyx_XDECREF(__pyx_v_val);
  __Pyx_XDECREF(__pyx_v_k);
  __Pyx_XDECREF(__pyx_v_v);
  __Pyx_XDECREF(__pyx_v_proj);
  __Pyx_XDECREF(__pyx_v_proj_b);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":911
 * 
 * 
 * def _transform(src_crs, dst_crs, xs, ys, zs):             # <<<<<<<<<<<<<<
 *     cdef double *x = NULL
 *     cdef double *y = NULL
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_19_transform(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_8rasterio_5_base_19_transform = {"_transform", (PyCFunction)__pyx_pw_8rasterio_5_base_19_transform, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_8rasterio_5_base_19_transform(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_src_crs = 0;
  PyObject *__pyx_v_dst_crs = 0;
  PyObject *__pyx_v_xs = 0;
  PyObject *__pyx_v_ys = 0;
  PyObject *__pyx_v_zs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_transform (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_src_crs,&__pyx_n_s_dst_crs,&__pyx_n_s_xs,&__pyx_n_s_ys,&__pyx_n_s_zs,0};
    PyObject* values[5] = {0,0,0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_src_crs)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_dst_crs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_transform", 1, 5, 5, 1); __PYX_ERR(0, 911, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_xs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_transform", 1, 5, 5, 2); __PYX_ERR(0, 911, __pyx_L3_error)
        }
        case  3:
        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_ys)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_transform", 1, 5, 5, 3); __PYX_ERR(0, 911, __pyx_L3_error)
        }
        case  4:
        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_zs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_transform", 1, 5, 5, 4); __PYX_ERR(0, 911, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_transform") < 0)) __PYX_ERR(0, 911, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 5) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
      values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
    }
    __pyx_v_src_crs = values[0];
    __pyx_v_dst_crs = values[1];
    __pyx_v_xs = values[2];
    __pyx_v_ys = values[3];
    __pyx_v_zs = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_transform", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 911, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base._transform", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_18_transform(__pyx_self, __pyx_v_src_crs, __pyx_v_dst_crs, __pyx_v_xs, __pyx_v_ys, __pyx_v_zs);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_18_transform(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_src_crs, PyObject *__pyx_v_dst_crs, PyObject *__pyx_v_xs, PyObject *__pyx_v_ys, PyObject *__pyx_v_zs) {
  double *__pyx_v_x;
  double *__pyx_v_y;
  double *__pyx_v_z;
  CYTHON_UNUSED char *__pyx_v_proj_c;
  void *__pyx_v_src;
  void *__pyx_v_dst;
  void *__pyx_v_transform;
  int __pyx_v_i;
  PyObject *__pyx_v_n = NULL;
  PyObject *__pyx_v_cple = NULL;
  CYTHON_UNUSED int __pyx_v_res;
  PyObject *__pyx_v_res_xs = NULL;
  PyObject *__pyx_v_res_ys = NULL;
  PyObject *__pyx_v_res_zs = NULL;
  PyObject *__pyx_v_retval = NULL;
  PyObject *__pyx_v_err = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  Py_ssize_t __pyx_t_1;
  Py_ssize_t __pyx_t_2;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  size_t __pyx_t_8;
  long __pyx_t_9;
  int __pyx_t_10;
  double __pyx_t_11;
  PyObject *__pyx_t_12 = NULL;
  PyObject *__pyx_t_13 = NULL;
  PyObject *__pyx_t_14 = NULL;
  PyObject *__pyx_t_15 = NULL;
  PyObject *__pyx_t_16 = NULL;
  PyObject *__pyx_t_17 = NULL;
  PyObject *__pyx_t_18 = NULL;
  PyObject *__pyx_t_19 = NULL;
  PyObject *__pyx_t_20 = NULL;
  PyObject *__pyx_t_21 = NULL;
  PyObject *__pyx_t_22 = NULL;
  PyObject *__pyx_t_23 = NULL;
  PyObject *__pyx_t_24 = NULL;
  PyObject *__pyx_t_25 = NULL;
  int __pyx_t_26;
  char const *__pyx_t_27;
  __Pyx_RefNannySetupContext("_transform", 0);

  /* "rasterio/_base.pyx":912
 * 
 * def _transform(src_crs, dst_crs, xs, ys, zs):
 *     cdef double *x = NULL             # <<<<<<<<<<<<<<
 *     cdef double *y = NULL
 *     cdef double *z = NULL
 */
  __pyx_v_x = NULL;

  /* "rasterio/_base.pyx":913
 * def _transform(src_crs, dst_crs, xs, ys, zs):
 *     cdef double *x = NULL
 *     cdef double *y = NULL             # <<<<<<<<<<<<<<
 *     cdef double *z = NULL
 *     cdef char *proj_c = NULL
 */
  __pyx_v_y = NULL;

  /* "rasterio/_base.pyx":914
 *     cdef double *x = NULL
 *     cdef double *y = NULL
 *     cdef double *z = NULL             # <<<<<<<<<<<<<<
 *     cdef char *proj_c = NULL
 *     cdef void *src = NULL
 */
  __pyx_v_z = NULL;

  /* "rasterio/_base.pyx":915
 *     cdef double *y = NULL
 *     cdef double *z = NULL
 *     cdef char *proj_c = NULL             # <<<<<<<<<<<<<<
 *     cdef void *src = NULL
 *     cdef void *dst = NULL
 */
  __pyx_v_proj_c = NULL;

  /* "rasterio/_base.pyx":916
 *     cdef double *z = NULL
 *     cdef char *proj_c = NULL
 *     cdef void *src = NULL             # <<<<<<<<<<<<<<
 *     cdef void *dst = NULL
 *     cdef void *transform = NULL
 */
  __pyx_v_src = NULL;

  /* "rasterio/_base.pyx":917
 *     cdef char *proj_c = NULL
 *     cdef void *src = NULL
 *     cdef void *dst = NULL             # <<<<<<<<<<<<<<
 *     cdef void *transform = NULL
 *     cdef int i
 */
  __pyx_v_dst = NULL;

  /* "rasterio/_base.pyx":918
 *     cdef void *src = NULL
 *     cdef void *dst = NULL
 *     cdef void *transform = NULL             # <<<<<<<<<<<<<<
 *     cdef int i
 * 
 */
  __pyx_v_transform = NULL;

  /* "rasterio/_base.pyx":921
 *     cdef int i
 * 
 *     assert len(xs) == len(ys)             # <<<<<<<<<<<<<<
 *     assert zs is None or len(xs) == len(zs)
 * 
 */
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    __pyx_t_1 = PyObject_Length(__pyx_v_xs); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 921, __pyx_L1_error)
    __pyx_t_2 = PyObject_Length(__pyx_v_ys); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 921, __pyx_L1_error)
    if (unlikely(!((__pyx_t_1 == __pyx_t_2) != 0))) {
      PyErr_SetNone(PyExc_AssertionError);
      __PYX_ERR(0, 921, __pyx_L1_error)
    }
  }
  #endif

  /* "rasterio/_base.pyx":922
 * 
 *     assert len(xs) == len(ys)
 *     assert zs is None or len(xs) == len(zs)             # <<<<<<<<<<<<<<
 * 
 *     src = _osr_from_crs(src_crs)
 */
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    __pyx_t_4 = (__pyx_v_zs == Py_None);
    __pyx_t_5 = (__pyx_t_4 != 0);
    if (!__pyx_t_5) {
    } else {
      __pyx_t_3 = __pyx_t_5;
      goto __pyx_L3_bool_binop_done;
    }
    __pyx_t_2 = PyObject_Length(__pyx_v_xs); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 922, __pyx_L1_error)
    __pyx_t_1 = PyObject_Length(__pyx_v_zs); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 922, __pyx_L1_error)
    __pyx_t_5 = ((__pyx_t_2 == __pyx_t_1) != 0);
    __pyx_t_3 = __pyx_t_5;
    __pyx_L3_bool_binop_done:;
    if (unlikely(!__pyx_t_3)) {
      PyErr_SetNone(PyExc_AssertionError);
      __PYX_ERR(0, 922, __pyx_L1_error)
    }
  }
  #endif

  /* "rasterio/_base.pyx":924
 *     assert zs is None or len(xs) == len(zs)
 * 
 *     src = _osr_from_crs(src_crs)             # <<<<<<<<<<<<<<
 *     dst = _osr_from_crs(dst_crs)
 * 
 */
  __pyx_v_src = __pyx_f_8rasterio_5_base__osr_from_crs(__pyx_v_src_crs);

  /* "rasterio/_base.pyx":925
 * 
 *     src = _osr_from_crs(src_crs)
 *     dst = _osr_from_crs(dst_crs)             # <<<<<<<<<<<<<<
 * 
 *     n = len(xs)
 */
  __pyx_v_dst = __pyx_f_8rasterio_5_base__osr_from_crs(__pyx_v_dst_crs);

  /* "rasterio/_base.pyx":927
 *     dst = _osr_from_crs(dst_crs)
 * 
 *     n = len(xs)             # <<<<<<<<<<<<<<
 *     x = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *     y = <double *>_gdal.CPLMalloc(n*sizeof(double))
 */
  __pyx_t_1 = PyObject_Length(__pyx_v_xs); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 927, __pyx_L1_error)
  __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 927, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_v_n = __pyx_t_6;
  __pyx_t_6 = 0;

  /* "rasterio/_base.pyx":928
 * 
 *     n = len(xs)
 *     x = <double *>_gdal.CPLMalloc(n*sizeof(double))             # <<<<<<<<<<<<<<
 *     y = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *     for i in range(n):
 */
  __pyx_t_6 = __Pyx_PyInt_FromSize_t((sizeof(double))); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 928, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_7 = PyNumber_Multiply(__pyx_v_n, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 928, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_8 = __Pyx_PyInt_As_size_t(__pyx_t_7); if (unlikely((__pyx_t_8 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 928, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_v_x = ((double *)CPLMalloc(__pyx_t_8));

  /* "rasterio/_base.pyx":929
 *     n = len(xs)
 *     x = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *     y = <double *>_gdal.CPLMalloc(n*sizeof(double))             # <<<<<<<<<<<<<<
 *     for i in range(n):
 *         x[i] = xs[i]
 */
  __pyx_t_7 = __Pyx_PyInt_FromSize_t((sizeof(double))); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 929, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_6 = PyNumber_Multiply(__pyx_v_n, __pyx_t_7); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 929, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_8 = __Pyx_PyInt_As_size_t(__pyx_t_6); if (unlikely((__pyx_t_8 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 929, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_v_y = ((double *)CPLMalloc(__pyx_t_8));

  /* "rasterio/_base.pyx":930
 *     x = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *     y = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *     for i in range(n):             # <<<<<<<<<<<<<<
 *         x[i] = xs[i]
 *         y[i] = ys[i]
 */
  __pyx_t_9 = __Pyx_PyInt_As_long(__pyx_v_n); if (unlikely((__pyx_t_9 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 930, __pyx_L1_error)
  for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
    __pyx_v_i = __pyx_t_10;

    /* "rasterio/_base.pyx":931
 *     y = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *     for i in range(n):
 *         x[i] = xs[i]             # <<<<<<<<<<<<<<
 *         y[i] = ys[i]
 * 
 */
    __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_xs, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 931, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_11 = __pyx_PyFloat_AsDouble(__pyx_t_6); if (unlikely((__pyx_t_11 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 931, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    (__pyx_v_x[__pyx_v_i]) = __pyx_t_11;

    /* "rasterio/_base.pyx":932
 *     for i in range(n):
 *         x[i] = xs[i]
 *         y[i] = ys[i]             # <<<<<<<<<<<<<<
 * 
 *     if zs is not None:
 */
    __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_ys, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 932, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_11 = __pyx_PyFloat_AsDouble(__pyx_t_6); if (unlikely((__pyx_t_11 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 932, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    (__pyx_v_y[__pyx_v_i]) = __pyx_t_11;
  }

  /* "rasterio/_base.pyx":934
 *         y[i] = ys[i]
 * 
 *     if zs is not None:             # <<<<<<<<<<<<<<
 *         z = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *         for i in range(n):
 */
  __pyx_t_3 = (__pyx_v_zs != Py_None);
  __pyx_t_5 = (__pyx_t_3 != 0);
  if (__pyx_t_5) {

    /* "rasterio/_base.pyx":935
 * 
 *     if zs is not None:
 *         z = <double *>_gdal.CPLMalloc(n*sizeof(double))             # <<<<<<<<<<<<<<
 *         for i in range(n):
 *             z[i] = zs[i]
 */
    __pyx_t_6 = __Pyx_PyInt_FromSize_t((sizeof(double))); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 935, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = PyNumber_Multiply(__pyx_v_n, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 935, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_8 = __Pyx_PyInt_As_size_t(__pyx_t_7); if (unlikely((__pyx_t_8 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 935, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_v_z = ((double *)CPLMalloc(__pyx_t_8));

    /* "rasterio/_base.pyx":936
 *     if zs is not None:
 *         z = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *         for i in range(n):             # <<<<<<<<<<<<<<
 *             z[i] = zs[i]
 * 
 */
    __pyx_t_9 = __Pyx_PyInt_As_long(__pyx_v_n); if (unlikely((__pyx_t_9 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 936, __pyx_L1_error)
    for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
      __pyx_v_i = __pyx_t_10;

      /* "rasterio/_base.pyx":937
 *         z = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *         for i in range(n):
 *             z[i] = zs[i]             # <<<<<<<<<<<<<<
 * 
 *     try:
 */
      __pyx_t_7 = __Pyx_GetItemInt(__pyx_v_zs, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 937, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __pyx_t_11 = __pyx_PyFloat_AsDouble(__pyx_t_7); if (unlikely((__pyx_t_11 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 937, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      (__pyx_v_z[__pyx_v_i]) = __pyx_t_11;
    }

    /* "rasterio/_base.pyx":934
 *         y[i] = ys[i]
 * 
 *     if zs is not None:             # <<<<<<<<<<<<<<
 *         z = <double *>_gdal.CPLMalloc(n*sizeof(double))
 *         for i in range(n):
 */
  }

  /* "rasterio/_base.pyx":939
 *             z[i] = zs[i]
 * 
 *     try:             # <<<<<<<<<<<<<<
 *         with CPLErrors() as cple:
 *             transform = _gdal.OCTNewCoordinateTransformation(src, dst)
 */
  /*try:*/ {
    {
      __Pyx_PyThreadState_declare
      __Pyx_PyThreadState_assign
      __Pyx_ExceptionSave(&__pyx_t_12, &__pyx_t_13, &__pyx_t_14);
      __Pyx_XGOTREF(__pyx_t_12);
      __Pyx_XGOTREF(__pyx_t_13);
      __Pyx_XGOTREF(__pyx_t_14);
      /*try:*/ {

        /* "rasterio/_base.pyx":940
 * 
 *     try:
 *         with CPLErrors() as cple:             # <<<<<<<<<<<<<<
 *             transform = _gdal.OCTNewCoordinateTransformation(src, dst)
 *             cple.check()
 */
        /*with:*/ {
          __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_CPLErrors); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 940, __pyx_L13_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_15 = NULL;
          if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_6))) {
            __pyx_t_15 = PyMethod_GET_SELF(__pyx_t_6);
            if (likely(__pyx_t_15)) {
              PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
              __Pyx_INCREF(__pyx_t_15);
              __Pyx_INCREF(function);
              __Pyx_DECREF_SET(__pyx_t_6, function);
            }
          }
          if (__pyx_t_15) {
            __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_15); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 940, __pyx_L13_error)
            __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
          } else {
            __pyx_t_7 = __Pyx_PyObject_CallNoArg(__pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 940, __pyx_L13_error)
          }
          __Pyx_GOTREF(__pyx_t_7);
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_16 = __Pyx_PyObject_LookupSpecial(__pyx_t_7, __pyx_n_s_exit); if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 940, __pyx_L13_error)
          __Pyx_GOTREF(__pyx_t_16);
          __pyx_t_15 = __Pyx_PyObject_LookupSpecial(__pyx_t_7, __pyx_n_s_enter); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 940, __pyx_L21_error)
          __Pyx_GOTREF(__pyx_t_15);
          __pyx_t_17 = NULL;
          if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_15))) {
            __pyx_t_17 = PyMethod_GET_SELF(__pyx_t_15);
            if (likely(__pyx_t_17)) {
              PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_15);
              __Pyx_INCREF(__pyx_t_17);
              __Pyx_INCREF(function);
              __Pyx_DECREF_SET(__pyx_t_15, function);
            }
          }
          if (__pyx_t_17) {
            __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_15, __pyx_t_17); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 940, __pyx_L21_error)
            __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
          } else {
            __pyx_t_6 = __Pyx_PyObject_CallNoArg(__pyx_t_15); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 940, __pyx_L21_error)
          }
          __Pyx_GOTREF(__pyx_t_6);
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
          __pyx_t_15 = __pyx_t_6;
          __pyx_t_6 = 0;
          __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
          /*try:*/ {
            {
              __Pyx_PyThreadState_declare
              __Pyx_PyThreadState_assign
              __Pyx_ExceptionSave(&__pyx_t_18, &__pyx_t_19, &__pyx_t_20);
              __Pyx_XGOTREF(__pyx_t_18);
              __Pyx_XGOTREF(__pyx_t_19);
              __Pyx_XGOTREF(__pyx_t_20);
              /*try:*/ {
                __pyx_v_cple = __pyx_t_15;
                __pyx_t_15 = 0;

                /* "rasterio/_base.pyx":941
 *     try:
 *         with CPLErrors() as cple:
 *             transform = _gdal.OCTNewCoordinateTransformation(src, dst)             # <<<<<<<<<<<<<<
 *             cple.check()
 *             res = _gdal.OCTTransform(transform, n, x, y, z)
 */
                __pyx_v_transform = OCTNewCoordinateTransformation(__pyx_v_src, __pyx_v_dst);

                /* "rasterio/_base.pyx":942
 *         with CPLErrors() as cple:
 *             transform = _gdal.OCTNewCoordinateTransformation(src, dst)
 *             cple.check()             # <<<<<<<<<<<<<<
 *             res = _gdal.OCTTransform(transform, n, x, y, z)
 *             res_xs = [0]*n
 */
                __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_cple, __pyx_n_s_check); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 942, __pyx_L27_error)
                __Pyx_GOTREF(__pyx_t_7);
                __pyx_t_6 = NULL;
                if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_7))) {
                  __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_7);
                  if (likely(__pyx_t_6)) {
                    PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
                    __Pyx_INCREF(__pyx_t_6);
                    __Pyx_INCREF(function);
                    __Pyx_DECREF_SET(__pyx_t_7, function);
                  }
                }
                if (__pyx_t_6) {
                  __pyx_t_15 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 942, __pyx_L27_error)
                  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
                } else {
                  __pyx_t_15 = __Pyx_PyObject_CallNoArg(__pyx_t_7); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 942, __pyx_L27_error)
                }
                __Pyx_GOTREF(__pyx_t_15);
                __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
                __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;

                /* "rasterio/_base.pyx":943
 *             transform = _gdal.OCTNewCoordinateTransformation(src, dst)
 *             cple.check()
 *             res = _gdal.OCTTransform(transform, n, x, y, z)             # <<<<<<<<<<<<<<
 *             res_xs = [0]*n
 *             res_ys = [0]*n
 */
                __pyx_t_10 = __Pyx_PyInt_As_int(__pyx_v_n); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 943, __pyx_L27_error)
                __pyx_v_res = OCTTransform(__pyx_v_transform, __pyx_t_10, __pyx_v_x, __pyx_v_y, __pyx_v_z);

                /* "rasterio/_base.pyx":944
 *             cple.check()
 *             res = _gdal.OCTTransform(transform, n, x, y, z)
 *             res_xs = [0]*n             # <<<<<<<<<<<<<<
 *             res_ys = [0]*n
 *             for i in range(n):
 */
                __pyx_t_15 = PyList_New(1); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 944, __pyx_L27_error)
                __Pyx_GOTREF(__pyx_t_15);
                __Pyx_INCREF(__pyx_int_0);
                __Pyx_GIVEREF(__pyx_int_0);
                PyList_SET_ITEM(__pyx_t_15, 0, __pyx_int_0);
                { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_15, __pyx_v_n); if (unlikely(!__pyx_temp)) __PYX_ERR(0, 944, __pyx_L27_error)
                  __Pyx_GOTREF(__pyx_temp);
                  __Pyx_DECREF(__pyx_t_15);
                  __pyx_t_15 = __pyx_temp;
                }
                __pyx_v_res_xs = ((PyObject*)__pyx_t_15);
                __pyx_t_15 = 0;

                /* "rasterio/_base.pyx":945
 *             res = _gdal.OCTTransform(transform, n, x, y, z)
 *             res_xs = [0]*n
 *             res_ys = [0]*n             # <<<<<<<<<<<<<<
 *             for i in range(n):
 *                 res_xs[i] = x[i]
 */
                __pyx_t_15 = PyList_New(1); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 945, __pyx_L27_error)
                __Pyx_GOTREF(__pyx_t_15);
                __Pyx_INCREF(__pyx_int_0);
                __Pyx_GIVEREF(__pyx_int_0);
                PyList_SET_ITEM(__pyx_t_15, 0, __pyx_int_0);
                { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_15, __pyx_v_n); if (unlikely(!__pyx_temp)) __PYX_ERR(0, 945, __pyx_L27_error)
                  __Pyx_GOTREF(__pyx_temp);
                  __Pyx_DECREF(__pyx_t_15);
                  __pyx_t_15 = __pyx_temp;
                }
                __pyx_v_res_ys = ((PyObject*)__pyx_t_15);
                __pyx_t_15 = 0;

                /* "rasterio/_base.pyx":946
 *             res_xs = [0]*n
 *             res_ys = [0]*n
 *             for i in range(n):             # <<<<<<<<<<<<<<
 *                 res_xs[i] = x[i]
 *                 res_ys[i] = y[i]
 */
                __pyx_t_9 = __Pyx_PyInt_As_long(__pyx_v_n); if (unlikely((__pyx_t_9 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 946, __pyx_L27_error)
                for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
                  __pyx_v_i = __pyx_t_10;

                  /* "rasterio/_base.pyx":947
 *             res_ys = [0]*n
 *             for i in range(n):
 *                 res_xs[i] = x[i]             # <<<<<<<<<<<<<<
 *                 res_ys[i] = y[i]
 *             if zs is not None:
 */
                  __pyx_t_15 = PyFloat_FromDouble((__pyx_v_x[__pyx_v_i])); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 947, __pyx_L27_error)
                  __Pyx_GOTREF(__pyx_t_15);
                  if (unlikely(__Pyx_SetItemInt(__pyx_v_res_xs, __pyx_v_i, __pyx_t_15, int, 1, __Pyx_PyInt_From_int, 1, 1, 0) < 0)) __PYX_ERR(0, 947, __pyx_L27_error)
                  __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;

                  /* "rasterio/_base.pyx":948
 *             for i in range(n):
 *                 res_xs[i] = x[i]
 *                 res_ys[i] = y[i]             # <<<<<<<<<<<<<<
 *             if zs is not None:
 *                 res_zs = [0]*n
 */
                  __pyx_t_15 = PyFloat_FromDouble((__pyx_v_y[__pyx_v_i])); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 948, __pyx_L27_error)
                  __Pyx_GOTREF(__pyx_t_15);
                  if (unlikely(__Pyx_SetItemInt(__pyx_v_res_ys, __pyx_v_i, __pyx_t_15, int, 1, __Pyx_PyInt_From_int, 1, 1, 0) < 0)) __PYX_ERR(0, 948, __pyx_L27_error)
                  __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                }

                /* "rasterio/_base.pyx":949
 *                 res_xs[i] = x[i]
 *                 res_ys[i] = y[i]
 *             if zs is not None:             # <<<<<<<<<<<<<<
 *                 res_zs = [0]*n
 *                 for i in range(n):
 */
                __pyx_t_5 = (__pyx_v_zs != Py_None);
                __pyx_t_3 = (__pyx_t_5 != 0);
                if (__pyx_t_3) {

                  /* "rasterio/_base.pyx":950
 *                 res_ys[i] = y[i]
 *             if zs is not None:
 *                 res_zs = [0]*n             # <<<<<<<<<<<<<<
 *                 for i in range(n):
 *                     res_zs[i] = z[i]
 */
                  __pyx_t_15 = PyList_New(1); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 950, __pyx_L27_error)
                  __Pyx_GOTREF(__pyx_t_15);
                  __Pyx_INCREF(__pyx_int_0);
                  __Pyx_GIVEREF(__pyx_int_0);
                  PyList_SET_ITEM(__pyx_t_15, 0, __pyx_int_0);
                  { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_15, __pyx_v_n); if (unlikely(!__pyx_temp)) __PYX_ERR(0, 950, __pyx_L27_error)
                    __Pyx_GOTREF(__pyx_temp);
                    __Pyx_DECREF(__pyx_t_15);
                    __pyx_t_15 = __pyx_temp;
                  }
                  __pyx_v_res_zs = ((PyObject*)__pyx_t_15);
                  __pyx_t_15 = 0;

                  /* "rasterio/_base.pyx":951
 *             if zs is not None:
 *                 res_zs = [0]*n
 *                 for i in range(n):             # <<<<<<<<<<<<<<
 *                     res_zs[i] = z[i]
 *                 retval = (res_xs, res_ys, res_zs)
 */
                  __pyx_t_9 = __Pyx_PyInt_As_long(__pyx_v_n); if (unlikely((__pyx_t_9 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 951, __pyx_L27_error)
                  for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
                    __pyx_v_i = __pyx_t_10;

                    /* "rasterio/_base.pyx":952
 *                 res_zs = [0]*n
 *                 for i in range(n):
 *                     res_zs[i] = z[i]             # <<<<<<<<<<<<<<
 *                 retval = (res_xs, res_ys, res_zs)
 *             else:
 */
                    __pyx_t_15 = PyFloat_FromDouble((__pyx_v_z[__pyx_v_i])); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 952, __pyx_L27_error)
                    __Pyx_GOTREF(__pyx_t_15);
                    if (unlikely(__Pyx_SetItemInt(__pyx_v_res_zs, __pyx_v_i, __pyx_t_15, int, 1, __Pyx_PyInt_From_int, 1, 1, 0) < 0)) __PYX_ERR(0, 952, __pyx_L27_error)
                    __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                  }

                  /* "rasterio/_base.pyx":953
 *                 for i in range(n):
 *                     res_zs[i] = z[i]
 *                 retval = (res_xs, res_ys, res_zs)             # <<<<<<<<<<<<<<
 *             else:
 *                 retval = (res_xs, res_ys)
 */
                  __pyx_t_15 = PyTuple_New(3); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 953, __pyx_L27_error)
                  __Pyx_GOTREF(__pyx_t_15);
                  __Pyx_INCREF(__pyx_v_res_xs);
                  __Pyx_GIVEREF(__pyx_v_res_xs);
                  PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_v_res_xs);
                  __Pyx_INCREF(__pyx_v_res_ys);
                  __Pyx_GIVEREF(__pyx_v_res_ys);
                  PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_v_res_ys);
                  __Pyx_INCREF(__pyx_v_res_zs);
                  __Pyx_GIVEREF(__pyx_v_res_zs);
                  PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_v_res_zs);
                  __pyx_v_retval = ((PyObject*)__pyx_t_15);
                  __pyx_t_15 = 0;

                  /* "rasterio/_base.pyx":949
 *                 res_xs[i] = x[i]
 *                 res_ys[i] = y[i]
 *             if zs is not None:             # <<<<<<<<<<<<<<
 *                 res_zs = [0]*n
 *                 for i in range(n):
 */
                  goto __pyx_L37;
                }

                /* "rasterio/_base.pyx":955
 *                 retval = (res_xs, res_ys, res_zs)
 *             else:
 *                 retval = (res_xs, res_ys)             # <<<<<<<<<<<<<<
 *     except CPLE_NotSupported as err:
 *         raise CRSError(err.errmsg)
 */
                /*else*/ {
                  __pyx_t_15 = PyTuple_New(2); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 955, __pyx_L27_error)
                  __Pyx_GOTREF(__pyx_t_15);
                  __Pyx_INCREF(__pyx_v_res_xs);
                  __Pyx_GIVEREF(__pyx_v_res_xs);
                  PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_v_res_xs);
                  __Pyx_INCREF(__pyx_v_res_ys);
                  __Pyx_GIVEREF(__pyx_v_res_ys);
                  PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_v_res_ys);
                  __pyx_v_retval = ((PyObject*)__pyx_t_15);
                  __pyx_t_15 = 0;
                }
                __pyx_L37:;

                /* "rasterio/_base.pyx":940
 * 
 *     try:
 *         with CPLErrors() as cple:             # <<<<<<<<<<<<<<
 *             transform = _gdal.OCTNewCoordinateTransformation(src, dst)
 *             cple.check()
 */
              }
              __Pyx_XDECREF(__pyx_t_18); __pyx_t_18 = 0;
              __Pyx_XDECREF(__pyx_t_19); __pyx_t_19 = 0;
              __Pyx_XDECREF(__pyx_t_20); __pyx_t_20 = 0;
              goto __pyx_L34_try_end;
              __pyx_L27_error:;
              __Pyx_PyThreadState_assign
              __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0;
              __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
              __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
              __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
              /*except:*/ {
                __Pyx_AddTraceback("rasterio._base._transform", __pyx_clineno, __pyx_lineno, __pyx_filename);
                if (__Pyx_GetException(&__pyx_t_15, &__pyx_t_7, &__pyx_t_6) < 0) __PYX_ERR(0, 940, __pyx_L29_except_error)
                __Pyx_GOTREF(__pyx_t_15);
                __Pyx_GOTREF(__pyx_t_7);
                __Pyx_GOTREF(__pyx_t_6);
                __pyx_t_17 = PyTuple_Pack(3, __pyx_t_15, __pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 940, __pyx_L29_except_error)
                __Pyx_GOTREF(__pyx_t_17);
                __pyx_t_21 = __Pyx_PyObject_Call(__pyx_t_16, __pyx_t_17, NULL);
                __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
                __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
                if (unlikely(!__pyx_t_21)) __PYX_ERR(0, 940, __pyx_L29_except_error)
                __Pyx_GOTREF(__pyx_t_21);
                __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_21);
                __Pyx_DECREF(__pyx_t_21); __pyx_t_21 = 0;
                if (__pyx_t_3 < 0) __PYX_ERR(0, 940, __pyx_L29_except_error)
                __pyx_t_5 = ((!(__pyx_t_3 != 0)) != 0);
                if (__pyx_t_5) {
                  __Pyx_GIVEREF(__pyx_t_15);
                  __Pyx_GIVEREF(__pyx_t_7);
                  __Pyx_XGIVEREF(__pyx_t_6);
                  __Pyx_ErrRestoreWithState(__pyx_t_15, __pyx_t_7, __pyx_t_6);
                  __pyx_t_15 = 0; __pyx_t_7 = 0; __pyx_t_6 = 0; 
                  __PYX_ERR(0, 940, __pyx_L29_except_error)
                }
                __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
                __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
                goto __pyx_L28_exception_handled;
              }
              __pyx_L29_except_error:;
              __Pyx_PyThreadState_assign
              __Pyx_XGIVEREF(__pyx_t_18);
              __Pyx_XGIVEREF(__pyx_t_19);
              __Pyx_XGIVEREF(__pyx_t_20);
              __Pyx_ExceptionReset(__pyx_t_18, __pyx_t_19, __pyx_t_20);
              goto __pyx_L13_error;
              __pyx_L28_exception_handled:;
              __Pyx_PyThreadState_assign
              __Pyx_XGIVEREF(__pyx_t_18);
              __Pyx_XGIVEREF(__pyx_t_19);
              __Pyx_XGIVEREF(__pyx_t_20);
              __Pyx_ExceptionReset(__pyx_t_18, __pyx_t_19, __pyx_t_20);
              __pyx_L34_try_end:;
            }
          }
          /*finally:*/ {
            /*normal exit:*/{
              if (__pyx_t_16) {
                __pyx_t_20 = __Pyx_PyObject_Call(__pyx_t_16, __pyx_tuple__53, NULL);
                __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
                if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 940, __pyx_L13_error)
                __Pyx_GOTREF(__pyx_t_20);
                __Pyx_DECREF(__pyx_t_20); __pyx_t_20 = 0;
              }
              goto __pyx_L26;
            }
            __pyx_L26:;
          }
          goto __pyx_L43;
          __pyx_L21_error:;
          __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
          goto __pyx_L13_error;
          __pyx_L43:;
        }

        /* "rasterio/_base.pyx":939
 *             z[i] = zs[i]
 * 
 *     try:             # <<<<<<<<<<<<<<
 *         with CPLErrors() as cple:
 *             transform = _gdal.OCTNewCoordinateTransformation(src, dst)
 */
      }
      __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
      __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
      __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
      goto __pyx_L20_try_end;
      __pyx_L13_error:;
      __Pyx_PyThreadState_assign
      __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0;
      __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;

      /* "rasterio/_base.pyx":956
 *             else:
 *                 retval = (res_xs, res_ys)
 *     except CPLE_NotSupported as err:             # <<<<<<<<<<<<<<
 *         raise CRSError(err.errmsg)
 *     finally:
 */
      __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_CPLE_NotSupported); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 956, __pyx_L15_except_error)
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_10 = __Pyx_PyErr_ExceptionMatches(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      if (__pyx_t_10) {
        __Pyx_AddTraceback("rasterio._base._transform", __pyx_clineno, __pyx_lineno, __pyx_filename);
        if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_7, &__pyx_t_15) < 0) __PYX_ERR(0, 956, __pyx_L15_except_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_GOTREF(__pyx_t_15);
        __Pyx_INCREF(__pyx_t_7);
        __pyx_v_err = __pyx_t_7;

        /* "rasterio/_base.pyx":957
 *                 retval = (res_xs, res_ys)
 *     except CPLE_NotSupported as err:
 *         raise CRSError(err.errmsg)             # <<<<<<<<<<<<<<
 *     finally:
 *         _gdal.CPLFree(x)
 */
        __pyx_t_22 = __Pyx_GetModuleGlobalName(__pyx_n_s_CRSError); if (unlikely(!__pyx_t_22)) __PYX_ERR(0, 957, __pyx_L15_except_error)
        __Pyx_GOTREF(__pyx_t_22);
        __pyx_t_23 = __Pyx_PyObject_GetAttrStr(__pyx_v_err, __pyx_n_s_errmsg); if (unlikely(!__pyx_t_23)) __PYX_ERR(0, 957, __pyx_L15_except_error)
        __Pyx_GOTREF(__pyx_t_23);
        __pyx_t_24 = NULL;
        if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_22))) {
          __pyx_t_24 = PyMethod_GET_SELF(__pyx_t_22);
          if (likely(__pyx_t_24)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_22);
            __Pyx_INCREF(__pyx_t_24);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_22, function);
          }
        }
        if (!__pyx_t_24) {
          __pyx_t_17 = __Pyx_PyObject_CallOneArg(__pyx_t_22, __pyx_t_23); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 957, __pyx_L15_except_error)
          __Pyx_DECREF(__pyx_t_23); __pyx_t_23 = 0;
          __Pyx_GOTREF(__pyx_t_17);
        } else {
          __pyx_t_25 = PyTuple_New(1+1); if (unlikely(!__pyx_t_25)) __PYX_ERR(0, 957, __pyx_L15_except_error)
          __Pyx_GOTREF(__pyx_t_25);
          __Pyx_GIVEREF(__pyx_t_24); PyTuple_SET_ITEM(__pyx_t_25, 0, __pyx_t_24); __pyx_t_24 = NULL;
          __Pyx_GIVEREF(__pyx_t_23);
          PyTuple_SET_ITEM(__pyx_t_25, 0+1, __pyx_t_23);
          __pyx_t_23 = 0;
          __pyx_t_17 = __Pyx_PyObject_Call(__pyx_t_22, __pyx_t_25, NULL); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 957, __pyx_L15_except_error)
          __Pyx_GOTREF(__pyx_t_17);
          __Pyx_DECREF(__pyx_t_25); __pyx_t_25 = 0;
        }
        __Pyx_DECREF(__pyx_t_22); __pyx_t_22 = 0;
        __Pyx_Raise(__pyx_t_17, 0, 0, 0);
        __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
        __PYX_ERR(0, 957, __pyx_L15_except_error)
      }
      goto __pyx_L15_except_error;
      __pyx_L15_except_error:;

      /* "rasterio/_base.pyx":939
 *             z[i] = zs[i]
 * 
 *     try:             # <<<<<<<<<<<<<<
 *         with CPLErrors() as cple:
 *             transform = _gdal.OCTNewCoordinateTransformation(src, dst)
 */
      __Pyx_PyThreadState_assign
      __Pyx_XGIVEREF(__pyx_t_12);
      __Pyx_XGIVEREF(__pyx_t_13);
      __Pyx_XGIVEREF(__pyx_t_14);
      __Pyx_ExceptionReset(__pyx_t_12, __pyx_t_13, __pyx_t_14);
      goto __pyx_L11_error;
      __pyx_L20_try_end:;
    }
  }

  /* "rasterio/_base.pyx":959
 *         raise CRSError(err.errmsg)
 *     finally:
 *         _gdal.CPLFree(x)             # <<<<<<<<<<<<<<
 *         _gdal.CPLFree(y)
 *         _gdal.CPLFree(z)
 */
  /*finally:*/ {
    /*normal exit:*/{
      CPLFree(__pyx_v_x);

      /* "rasterio/_base.pyx":960
 *     finally:
 *         _gdal.CPLFree(x)
 *         _gdal.CPLFree(y)             # <<<<<<<<<<<<<<
 *         _gdal.CPLFree(z)
 *         _gdal.OSRDestroySpatialReference(src)
 */
      CPLFree(__pyx_v_y);

      /* "rasterio/_base.pyx":961
 *         _gdal.CPLFree(x)
 *         _gdal.CPLFree(y)
 *         _gdal.CPLFree(z)             # <<<<<<<<<<<<<<
 *         _gdal.OSRDestroySpatialReference(src)
 *         _gdal.OSRDestroySpatialReference(dst)
 */
      CPLFree(__pyx_v_z);

      /* "rasterio/_base.pyx":962
 *         _gdal.CPLFree(y)
 *         _gdal.CPLFree(z)
 *         _gdal.OSRDestroySpatialReference(src)             # <<<<<<<<<<<<<<
 *         _gdal.OSRDestroySpatialReference(dst)
 * 
 */
      OSRDestroySpatialReference(__pyx_v_src);

      /* "rasterio/_base.pyx":963
 *         _gdal.CPLFree(z)
 *         _gdal.OSRDestroySpatialReference(src)
 *         _gdal.OSRDestroySpatialReference(dst)             # <<<<<<<<<<<<<<
 * 
 *     return retval
 */
      OSRDestroySpatialReference(__pyx_v_dst);
      goto __pyx_L12;
    }
    /*exception exit:*/{
      __Pyx_PyThreadState_declare
      __pyx_L11_error:;
      __pyx_t_14 = 0; __pyx_t_13 = 0; __pyx_t_12 = 0; __pyx_t_16 = 0; __pyx_t_20 = 0; __pyx_t_19 = 0;
      __Pyx_PyThreadState_assign
      __Pyx_XDECREF(__pyx_t_24); __pyx_t_24 = 0;
      __Pyx_XDECREF(__pyx_t_23); __pyx_t_23 = 0;
      __Pyx_XDECREF(__pyx_t_25); __pyx_t_25 = 0;
      __Pyx_XDECREF(__pyx_t_22); __pyx_t_22 = 0;
      __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0;
      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
      if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_16, &__pyx_t_20, &__pyx_t_19);
      if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_14, &__pyx_t_13, &__pyx_t_12) < 0)) __Pyx_ErrFetch(&__pyx_t_14, &__pyx_t_13, &__pyx_t_12);
      __Pyx_XGOTREF(__pyx_t_14);
      __Pyx_XGOTREF(__pyx_t_13);
      __Pyx_XGOTREF(__pyx_t_12);
      __Pyx_XGOTREF(__pyx_t_16);
      __Pyx_XGOTREF(__pyx_t_20);
      __Pyx_XGOTREF(__pyx_t_19);
      __pyx_t_10 = __pyx_lineno; __pyx_t_26 = __pyx_clineno; __pyx_t_27 = __pyx_filename;
      {

        /* "rasterio/_base.pyx":959
 *         raise CRSError(err.errmsg)
 *     finally:
 *         _gdal.CPLFree(x)             # <<<<<<<<<<<<<<
 *         _gdal.CPLFree(y)
 *         _gdal.CPLFree(z)
 */
        CPLFree(__pyx_v_x);

        /* "rasterio/_base.pyx":960
 *     finally:
 *         _gdal.CPLFree(x)
 *         _gdal.CPLFree(y)             # <<<<<<<<<<<<<<
 *         _gdal.CPLFree(z)
 *         _gdal.OSRDestroySpatialReference(src)
 */
        CPLFree(__pyx_v_y);

        /* "rasterio/_base.pyx":961
 *         _gdal.CPLFree(x)
 *         _gdal.CPLFree(y)
 *         _gdal.CPLFree(z)             # <<<<<<<<<<<<<<
 *         _gdal.OSRDestroySpatialReference(src)
 *         _gdal.OSRDestroySpatialReference(dst)
 */
        CPLFree(__pyx_v_z);

        /* "rasterio/_base.pyx":962
 *         _gdal.CPLFree(y)
 *         _gdal.CPLFree(z)
 *         _gdal.OSRDestroySpatialReference(src)             # <<<<<<<<<<<<<<
 *         _gdal.OSRDestroySpatialReference(dst)
 * 
 */
        OSRDestroySpatialReference(__pyx_v_src);

        /* "rasterio/_base.pyx":963
 *         _gdal.CPLFree(z)
 *         _gdal.OSRDestroySpatialReference(src)
 *         _gdal.OSRDestroySpatialReference(dst)             # <<<<<<<<<<<<<<
 * 
 *     return retval
 */
        OSRDestroySpatialReference(__pyx_v_dst);
      }
      __Pyx_PyThreadState_assign
      if (PY_MAJOR_VERSION >= 3) {
        __Pyx_XGIVEREF(__pyx_t_16);
        __Pyx_XGIVEREF(__pyx_t_20);
        __Pyx_XGIVEREF(__pyx_t_19);
        __Pyx_ExceptionReset(__pyx_t_16, __pyx_t_20, __pyx_t_19);
      }
      __Pyx_XGIVEREF(__pyx_t_14);
      __Pyx_XGIVEREF(__pyx_t_13);
      __Pyx_XGIVEREF(__pyx_t_12);
      __Pyx_ErrRestore(__pyx_t_14, __pyx_t_13, __pyx_t_12);
      __pyx_t_14 = 0; __pyx_t_13 = 0; __pyx_t_12 = 0; __pyx_t_16 = 0; __pyx_t_20 = 0; __pyx_t_19 = 0;
      __pyx_lineno = __pyx_t_10; __pyx_clineno = __pyx_t_26; __pyx_filename = __pyx_t_27;
      goto __pyx_L1_error;
    }
    __pyx_L12:;
  }

  /* "rasterio/_base.pyx":965
 *         _gdal.OSRDestroySpatialReference(dst)
 * 
 *     return retval             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(!__pyx_v_retval)) { __Pyx_RaiseUnboundLocalError("retval"); __PYX_ERR(0, 965, __pyx_L1_error) }
  __Pyx_INCREF(__pyx_v_retval);
  __pyx_r = __pyx_v_retval;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":911
 * 
 * 
 * def _transform(src_crs, dst_crs, xs, ys, zs):             # <<<<<<<<<<<<<<
 *     cdef double *x = NULL
 *     cdef double *y = NULL
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_15);
  __Pyx_XDECREF(__pyx_t_17);
  __Pyx_XDECREF(__pyx_t_22);
  __Pyx_XDECREF(__pyx_t_23);
  __Pyx_XDECREF(__pyx_t_24);
  __Pyx_XDECREF(__pyx_t_25);
  __Pyx_AddTraceback("rasterio._base._transform", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_n);
  __Pyx_XDECREF(__pyx_v_cple);
  __Pyx_XDECREF(__pyx_v_res_xs);
  __Pyx_XDECREF(__pyx_v_res_ys);
  __Pyx_XDECREF(__pyx_v_res_zs);
  __Pyx_XDECREF(__pyx_v_retval);
  __Pyx_XDECREF(__pyx_v_err);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":968
 * 
 * 
 * def is_geographic_crs(crs):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsGeographic(osr_crs)
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_21is_geographic_crs(PyObject *__pyx_self, PyObject *__pyx_v_crs); /*proto*/
static PyMethodDef __pyx_mdef_8rasterio_5_base_21is_geographic_crs = {"is_geographic_crs", (PyCFunction)__pyx_pw_8rasterio_5_base_21is_geographic_crs, METH_O, 0};
static PyObject *__pyx_pw_8rasterio_5_base_21is_geographic_crs(PyObject *__pyx_self, PyObject *__pyx_v_crs) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("is_geographic_crs (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_20is_geographic_crs(__pyx_self, ((PyObject *)__pyx_v_crs));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_20is_geographic_crs(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_crs) {
  void *__pyx_v_osr_crs;
  int __pyx_v_retval;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("is_geographic_crs", 0);

  /* "rasterio/_base.pyx":969
 * 
 * def is_geographic_crs(crs):
 *     cdef void *osr_crs = _osr_from_crs(crs)             # <<<<<<<<<<<<<<
 *     cdef int retval = _gdal.OSRIsGeographic(osr_crs)
 *     _gdal.OSRDestroySpatialReference(osr_crs)
 */
  __pyx_v_osr_crs = __pyx_f_8rasterio_5_base__osr_from_crs(__pyx_v_crs);

  /* "rasterio/_base.pyx":970
 * def is_geographic_crs(crs):
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsGeographic(osr_crs)             # <<<<<<<<<<<<<<
 *     _gdal.OSRDestroySpatialReference(osr_crs)
 *     return retval == 1
 */
  __pyx_v_retval = OSRIsGeographic(__pyx_v_osr_crs);

  /* "rasterio/_base.pyx":971
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsGeographic(osr_crs)
 *     _gdal.OSRDestroySpatialReference(osr_crs)             # <<<<<<<<<<<<<<
 *     return retval == 1
 * 
 */
  OSRDestroySpatialReference(__pyx_v_osr_crs);

  /* "rasterio/_base.pyx":972
 *     cdef int retval = _gdal.OSRIsGeographic(osr_crs)
 *     _gdal.OSRDestroySpatialReference(osr_crs)
 *     return retval == 1             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyBool_FromLong((__pyx_v_retval == 1)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 972, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":968
 * 
 * 
 * def is_geographic_crs(crs):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsGeographic(osr_crs)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("rasterio._base.is_geographic_crs", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":975
 * 
 * 
 * def is_projected_crs(crs):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsProjected(osr_crs)
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_23is_projected_crs(PyObject *__pyx_self, PyObject *__pyx_v_crs); /*proto*/
static PyMethodDef __pyx_mdef_8rasterio_5_base_23is_projected_crs = {"is_projected_crs", (PyCFunction)__pyx_pw_8rasterio_5_base_23is_projected_crs, METH_O, 0};
static PyObject *__pyx_pw_8rasterio_5_base_23is_projected_crs(PyObject *__pyx_self, PyObject *__pyx_v_crs) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("is_projected_crs (wrapper)", 0);
  __pyx_r = __pyx_pf_8rasterio_5_base_22is_projected_crs(__pyx_self, ((PyObject *)__pyx_v_crs));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_22is_projected_crs(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_crs) {
  void *__pyx_v_osr_crs;
  int __pyx_v_retval;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("is_projected_crs", 0);

  /* "rasterio/_base.pyx":976
 * 
 * def is_projected_crs(crs):
 *     cdef void *osr_crs = _osr_from_crs(crs)             # <<<<<<<<<<<<<<
 *     cdef int retval = _gdal.OSRIsProjected(osr_crs)
 *     _gdal.OSRDestroySpatialReference(osr_crs)
 */
  __pyx_v_osr_crs = __pyx_f_8rasterio_5_base__osr_from_crs(__pyx_v_crs);

  /* "rasterio/_base.pyx":977
 * def is_projected_crs(crs):
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsProjected(osr_crs)             # <<<<<<<<<<<<<<
 *     _gdal.OSRDestroySpatialReference(osr_crs)
 *     return retval == 1
 */
  __pyx_v_retval = OSRIsProjected(__pyx_v_osr_crs);

  /* "rasterio/_base.pyx":978
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsProjected(osr_crs)
 *     _gdal.OSRDestroySpatialReference(osr_crs)             # <<<<<<<<<<<<<<
 *     return retval == 1
 * 
 */
  OSRDestroySpatialReference(__pyx_v_osr_crs);

  /* "rasterio/_base.pyx":979
 *     cdef int retval = _gdal.OSRIsProjected(osr_crs)
 *     _gdal.OSRDestroySpatialReference(osr_crs)
 *     return retval == 1             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyBool_FromLong((__pyx_v_retval == 1)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 979, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":975
 * 
 * 
 * def is_projected_crs(crs):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsProjected(osr_crs)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("rasterio._base.is_projected_crs", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "rasterio/_base.pyx":982
 * 
 * 
 * def is_same_crs(crs1, crs2):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs1 = _osr_from_crs(crs1)
 *     cdef void *osr_crs2 = _osr_from_crs(crs2)
 */

/* Python wrapper */
static PyObject *__pyx_pw_8rasterio_5_base_25is_same_crs(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_8rasterio_5_base_25is_same_crs = {"is_same_crs", (PyCFunction)__pyx_pw_8rasterio_5_base_25is_same_crs, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_8rasterio_5_base_25is_same_crs(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_crs1 = 0;
  PyObject *__pyx_v_crs2 = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("is_same_crs (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_crs1,&__pyx_n_s_crs2,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_crs1)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_crs2)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("is_same_crs", 1, 2, 2, 1); __PYX_ERR(0, 982, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "is_same_crs") < 0)) __PYX_ERR(0, 982, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_crs1 = values[0];
    __pyx_v_crs2 = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("is_same_crs", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 982, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("rasterio._base.is_same_crs", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8rasterio_5_base_24is_same_crs(__pyx_self, __pyx_v_crs1, __pyx_v_crs2);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8rasterio_5_base_24is_same_crs(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_crs1, PyObject *__pyx_v_crs2) {
  void *__pyx_v_osr_crs1;
  void *__pyx_v_osr_crs2;
  int __pyx_v_retval;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("is_same_crs", 0);

  /* "rasterio/_base.pyx":983
 * 
 * def is_same_crs(crs1, crs2):
 *     cdef void *osr_crs1 = _osr_from_crs(crs1)             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs2 = _osr_from_crs(crs2)
 *     cdef int retval = _gdal.OSRIsSame(osr_crs1, osr_crs2)
 */
  __pyx_v_osr_crs1 = __pyx_f_8rasterio_5_base__osr_from_crs(__pyx_v_crs1);

  /* "rasterio/_base.pyx":984
 * def is_same_crs(crs1, crs2):
 *     cdef void *osr_crs1 = _osr_from_crs(crs1)
 *     cdef void *osr_crs2 = _osr_from_crs(crs2)             # <<<<<<<<<<<<<<
 *     cdef int retval = _gdal.OSRIsSame(osr_crs1, osr_crs2)
 *     _gdal.OSRDestroySpatialReference(osr_crs1)
 */
  __pyx_v_osr_crs2 = __pyx_f_8rasterio_5_base__osr_from_crs(__pyx_v_crs2);

  /* "rasterio/_base.pyx":985
 *     cdef void *osr_crs1 = _osr_from_crs(crs1)
 *     cdef void *osr_crs2 = _osr_from_crs(crs2)
 *     cdef int retval = _gdal.OSRIsSame(osr_crs1, osr_crs2)             # <<<<<<<<<<<<<<
 *     _gdal.OSRDestroySpatialReference(osr_crs1)
 *     _gdal.OSRDestroySpatialReference(osr_crs2)
 */
  __pyx_v_retval = OSRIsSame(__pyx_v_osr_crs1, __pyx_v_osr_crs2);

  /* "rasterio/_base.pyx":986
 *     cdef void *osr_crs2 = _osr_from_crs(crs2)
 *     cdef int retval = _gdal.OSRIsSame(osr_crs1, osr_crs2)
 *     _gdal.OSRDestroySpatialReference(osr_crs1)             # <<<<<<<<<<<<<<
 *     _gdal.OSRDestroySpatialReference(osr_crs2)
 *     return retval == 1
 */
  OSRDestroySpatialReference(__pyx_v_osr_crs1);

  /* "rasterio/_base.pyx":987
 *     cdef int retval = _gdal.OSRIsSame(osr_crs1, osr_crs2)
 *     _gdal.OSRDestroySpatialReference(osr_crs1)
 *     _gdal.OSRDestroySpatialReference(osr_crs2)             # <<<<<<<<<<<<<<
 *     return retval == 1
 */
  OSRDestroySpatialReference(__pyx_v_osr_crs2);

  /* "rasterio/_base.pyx":988
 *     _gdal.OSRDestroySpatialReference(osr_crs1)
 *     _gdal.OSRDestroySpatialReference(osr_crs2)
 *     return retval == 1             # <<<<<<<<<<<<<<
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyBool_FromLong((__pyx_v_retval == 1)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 988, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "rasterio/_base.pyx":982
 * 
 * 
 * def is_same_crs(crs1, crs2):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs1 = _osr_from_crs(crs1)
 *     cdef void *osr_crs2 = _osr_from_crs(crs2)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("rasterio._base.is_same_crs", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
static struct __pyx_vtabstruct_8rasterio_5_base_DatasetReader __pyx_vtable_8rasterio_5_base_DatasetReader;

static PyObject *__pyx_tp_new_8rasterio_5_base_DatasetReader(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  struct __pyx_obj_8rasterio_5_base_DatasetReader *p;
  PyObject *o;
  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
    o = (*t->tp_alloc)(t, 0);
  } else {
    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
  }
  if (unlikely(!o)) return 0;
  p = ((struct __pyx_obj_8rasterio_5_base_DatasetReader *)o);
  p->__pyx_vtab = __pyx_vtabptr_8rasterio_5_base_DatasetReader;
  p->name = Py_None; Py_INCREF(Py_None);
  p->mode = Py_None; Py_INCREF(Py_None);
  p->options = Py_None; Py_INCREF(Py_None);
  p->width = Py_None; Py_INCREF(Py_None);
  p->height = Py_None; Py_INCREF(Py_None);
  p->shape = Py_None; Py_INCREF(Py_None);
  p->driver = Py_None; Py_INCREF(Py_None);
  p->_count = Py_None; Py_INCREF(Py_None);
  p->_dtypes = Py_None; Py_INCREF(Py_None);
  p->_closed = Py_None; Py_INCREF(Py_None);
  p->_crs = Py_None; Py_INCREF(Py_None);
  p->_crs_wkt = Py_None; Py_INCREF(Py_None);
  p->_transform = Py_None; Py_INCREF(Py_None);
  p->_block_shapes = Py_None; Py_INCREF(Py_None);
  p->_nodatavals = Py_None; Py_INCREF(Py_None);
  p->_read = Py_None; Py_INCREF(Py_None);
  return o;
}

static void __pyx_tp_dealloc_8rasterio_5_base_DatasetReader(PyObject *o) {
  struct __pyx_obj_8rasterio_5_base_DatasetReader *p = (struct __pyx_obj_8rasterio_5_base_DatasetReader *)o;
  #if PY_VERSION_HEX >= 0x030400a1
  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
    if (PyObject_CallFinalizerFromDealloc(o)) return;
  }
  #endif
  PyObject_GC_UnTrack(o);
  {
    PyObject *etype, *eval, *etb;
    PyErr_Fetch(&etype, &eval, &etb);
    ++Py_REFCNT(o);
    __pyx_pw_8rasterio_5_base_13DatasetReader_23__dealloc__(o);
    --Py_REFCNT(o);
    PyErr_Restore(etype, eval, etb);
  }
  Py_CLEAR(p->name);
  Py_CLEAR(p->mode);
  Py_CLEAR(p->options);
  Py_CLEAR(p->width);
  Py_CLEAR(p->height);
  Py_CLEAR(p->shape);
  Py_CLEAR(p->driver);
  Py_CLEAR(p->_count);
  Py_CLEAR(p->_dtypes);
  Py_CLEAR(p->_closed);
  Py_CLEAR(p->_crs);
  Py_CLEAR(p->_crs_wkt);
  Py_CLEAR(p->_transform);
  Py_CLEAR(p->_block_shapes);
  Py_CLEAR(p->_nodatavals);
  Py_CLEAR(p->_read);
  (*Py_TYPE(o)->tp_free)(o);
}

static int __pyx_tp_traverse_8rasterio_5_base_DatasetReader(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_8rasterio_5_base_DatasetReader *p = (struct __pyx_obj_8rasterio_5_base_DatasetReader *)o;
  if (p->name) {
    e = (*v)(p->name, a); if (e) return e;
  }
  if (p->mode) {
    e = (*v)(p->mode, a); if (e) return e;
  }
  if (p->options) {
    e = (*v)(p->options, a); if (e) return e;
  }
  if (p->width) {
    e = (*v)(p->width, a); if (e) return e;
  }
  if (p->height) {
    e = (*v)(p->height, a); if (e) return e;
  }
  if (p->shape) {
    e = (*v)(p->shape, a); if (e) return e;
  }
  if (p->driver) {
    e = (*v)(p->driver, a); if (e) return e;
  }
  if (p->_count) {
    e = (*v)(p->_count, a); if (e) return e;
  }
  if (p->_dtypes) {
    e = (*v)(p->_dtypes, a); if (e) return e;
  }
  if (p->_closed) {
    e = (*v)(p->_closed, a); if (e) return e;
  }
  if (p->_crs) {
    e = (*v)(p->_crs, a); if (e) return e;
  }
  if (p->_crs_wkt) {
    e = (*v)(p->_crs_wkt, a); if (e) return e;
  }
  if (p->_transform) {
    e = (*v)(p->_transform, a); if (e) return e;
  }
  if (p->_block_shapes) {
    e = (*v)(p->_block_shapes, a); if (e) return e;
  }
  if (p->_nodatavals) {
    e = (*v)(p->_nodatavals, a); if (e) return e;
  }
  if (p->_read) {
    e = (*v)(p->_read, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_8rasterio_5_base_DatasetReader(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_8rasterio_5_base_DatasetReader *p = (struct __pyx_obj_8rasterio_5_base_DatasetReader *)o;
  tmp = ((PyObject*)p->name);
  p->name = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->mode);
  p->mode = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->options);
  p->options = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->width);
  p->width = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->height);
  p->height = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->shape);
  p->shape = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->driver);
  p->driver = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->_count);
  p->_count = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->_dtypes);
  p->_dtypes = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->_closed);
  p->_closed = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->_crs);
  p->_crs = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->_crs_wkt);
  p->_crs_wkt = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->_transform);
  p->_transform = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->_block_shapes);
  p->_block_shapes = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->_nodatavals);
  p->_nodatavals = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->_read);
  p->_read = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_closed(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_6closed_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_count(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_5count_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_indexes(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_7indexes_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_dtypes(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_6dtypes_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_block_shapes(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_12block_shapes_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_nodatavals(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_10nodatavals_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_nodata(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_6nodata_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_mask_flags(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_10mask_flags_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_bounds(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_6bounds_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_res(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_3res_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_meta(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_4meta_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_compression(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_11compression_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_interleaving(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_12interleaving_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_photometric(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_11photometric_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_is_tiled(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_8is_tiled_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_profile(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_7profile_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_crs(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_3crs_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_crs_wkt(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_7crs_wkt_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_transform(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_9transform_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_affine(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_6affine_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_kwds(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_4kwds_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_name(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_4name_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_mode(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_4mode_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_options(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_7options_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_width(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_5width_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_height(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_6height_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_shape(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_5shape_1__get__(o);
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader_driver(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_6driver_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader_driver(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_6driver_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_6driver_5__del__(o);
  }
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader__count(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_6_count_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader__count(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_6_count_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_6_count_5__del__(o);
  }
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader__dtypes(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_7_dtypes_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader__dtypes(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_7_dtypes_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_7_dtypes_5__del__(o);
  }
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader__closed(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_7_closed_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader__closed(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_7_closed_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_7_closed_5__del__(o);
  }
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader__crs(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_4_crs_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader__crs(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_4_crs_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_4_crs_5__del__(o);
  }
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader__crs_wkt(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_8_crs_wkt_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader__crs_wkt(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_8_crs_wkt_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_8_crs_wkt_5__del__(o);
  }
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader__transform(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_10_transform_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader__transform(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_10_transform_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_10_transform_5__del__(o);
  }
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader__block_shapes(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_13_block_shapes_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader__block_shapes(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_13_block_shapes_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_13_block_shapes_5__del__(o);
  }
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader__nodatavals(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_11_nodatavals_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader__nodatavals(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_11_nodatavals_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_11_nodatavals_5__del__(o);
  }
}

static PyObject *__pyx_getprop_8rasterio_5_base_13DatasetReader__read(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_8rasterio_5_base_13DatasetReader_5_read_1__get__(o);
}

static int __pyx_setprop_8rasterio_5_base_13DatasetReader__read(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_5_read_3__set__(o, v);
  }
  else {
    return __pyx_pw_8rasterio_5_base_13DatasetReader_5_read_5__del__(o);
  }
}

static PyMethodDef __pyx_methods_8rasterio_5_base_DatasetReader[] = {
  {"start", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_5start, METH_NOARGS, __pyx_doc_8rasterio_5_base_13DatasetReader_4start},
  {"_has_band", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_7_has_band, METH_O, 0},
  {"read_crs", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_9read_crs, METH_NOARGS, 0},
  {"read_crs_wkt", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_11read_crs_wkt, METH_NOARGS, 0},
  {"read_transform", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_13read_transform, METH_NOARGS, 0},
  {"stop", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_15stop, METH_NOARGS, 0},
  {"close", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_17close, METH_NOARGS, 0},
  {"__enter__", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_19__enter__, METH_NOARGS, 0},
  {"__exit__", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_21__exit__, METH_VARARGS|METH_KEYWORDS, 0},
  {"get_nodatavals", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_25get_nodatavals, METH_NOARGS, 0},
  {"block_windows", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_27block_windows, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_13DatasetReader_26block_windows},
  {"ul", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_30ul, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_13DatasetReader_29ul},
  {"index", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_32index, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_13DatasetReader_31index},
  {"window", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_34window, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_13DatasetReader_33window},
  {"window_transform", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_36window_transform, METH_O, __pyx_doc_8rasterio_5_base_13DatasetReader_35window_transform},
  {"window_bounds", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_38window_bounds, METH_O, __pyx_doc_8rasterio_5_base_13DatasetReader_37window_bounds},
  {"lnglat", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_40lnglat, METH_NOARGS, 0},
  {"get_crs", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_42get_crs, METH_NOARGS, 0},
  {"get_transform", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_44get_transform, METH_NOARGS, __pyx_doc_8rasterio_5_base_13DatasetReader_43get_transform},
  {"tags", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_46tags, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_13DatasetReader_45tags},
  {"colorinterp", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_48colorinterp, METH_O, __pyx_doc_8rasterio_5_base_13DatasetReader_47colorinterp},
  {"colormap", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_50colormap, METH_O, __pyx_doc_8rasterio_5_base_13DatasetReader_49colormap},
  {"overviews", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_52overviews, METH_O, 0},
  {"checksum", (PyCFunction)__pyx_pw_8rasterio_5_base_13DatasetReader_54checksum, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_13DatasetReader_53checksum},
  {0, 0, 0, 0}
};

static struct PyGetSetDef __pyx_getsets_8rasterio_5_base_DatasetReader[] = {
  {(char *)"closed", __pyx_getprop_8rasterio_5_base_13DatasetReader_closed, 0, (char *)0, 0},
  {(char *)"count", __pyx_getprop_8rasterio_5_base_13DatasetReader_count, 0, (char *)0, 0},
  {(char *)"indexes", __pyx_getprop_8rasterio_5_base_13DatasetReader_indexes, 0, (char *)0, 0},
  {(char *)"dtypes", __pyx_getprop_8rasterio_5_base_13DatasetReader_dtypes, 0, (char *)"Returns an ordered tuple of all band data types.", 0},
  {(char *)"block_shapes", __pyx_getprop_8rasterio_5_base_13DatasetReader_block_shapes, 0, (char *)"Returns an ordered list of block shapes for all bands.\n        \n        Shapes are tuples and have the same ordering as the dataset's\n        shape: (count of image rows, count of image columns).\n        ", 0},
  {(char *)"nodatavals", __pyx_getprop_8rasterio_5_base_13DatasetReader_nodatavals, 0, (char *)"Nodata values for each band.", 0},
  {(char *)"nodata", __pyx_getprop_8rasterio_5_base_13DatasetReader_nodata, 0, (char *)"The dataset's single nodata value.", 0},
  {(char *)"mask_flags", __pyx_getprop_8rasterio_5_base_13DatasetReader_mask_flags, 0, (char *)"Mask flags for each band.", 0},
  {(char *)"bounds", __pyx_getprop_8rasterio_5_base_13DatasetReader_bounds, 0, (char *)"Returns the lower left and upper right bounds of the dataset\n        in the units of its coordinate reference system.\n        \n        The returned value is a tuple:\n        (lower left x, lower left y, upper right x, upper right y)\n        ", 0},
  {(char *)"res", __pyx_getprop_8rasterio_5_base_13DatasetReader_res, 0, (char *)"Returns the (width, height) of pixels in the units of its\n        coordinate reference system.", 0},
  {(char *)"meta", __pyx_getprop_8rasterio_5_base_13DatasetReader_meta, 0, (char *)"The basic metadata of this dataset.", 0},
  {(char *)"compression", __pyx_getprop_8rasterio_5_base_13DatasetReader_compression, 0, (char *)0, 0},
  {(char *)"interleaving", __pyx_getprop_8rasterio_5_base_13DatasetReader_interleaving, 0, (char *)0, 0},
  {(char *)"photometric", __pyx_getprop_8rasterio_5_base_13DatasetReader_photometric, 0, (char *)0, 0},
  {(char *)"is_tiled", __pyx_getprop_8rasterio_5_base_13DatasetReader_is_tiled, 0, (char *)0, 0},
  {(char *)"profile", __pyx_getprop_8rasterio_5_base_13DatasetReader_profile, 0, (char *)"Basic metadata and creation options of this dataset.\n\n        May be passed as keyword arguments to `rasterio.open()` to\n        create a clone of this dataset.\n        ", 0},
  {(char *)"crs", __pyx_getprop_8rasterio_5_base_13DatasetReader_crs, 0, (char *)"A mapping of PROJ.4 coordinate reference system params.\n        ", 0},
  {(char *)"crs_wkt", __pyx_getprop_8rasterio_5_base_13DatasetReader_crs_wkt, 0, (char *)"An OGC WKT string representation of the coordinate reference\n        system.\n        ", 0},
  {(char *)"transform", __pyx_getprop_8rasterio_5_base_13DatasetReader_transform, 0, (char *)"Coefficients of the affine transformation that maps col,row\n        pixel coordinates to x,y coordinates in the specified crs. The\n        coefficients of the augmented matrix are shown below.\n        \n          | x |   | a  b  c | | r |\n          | y | = | d  e  f | | c |\n          | 1 |   | 0  0  1 | | 1 |\n        \n        In Rasterio versions before 1.0 the value of this property\n        is a list of coefficients ``[c, a, b, f, d, e]``. This form\n        is *deprecated* beginning in 0.9 and in version 1.0 this \n        property will be replaced by an instance of ``affine.Affine``,\n        which is a namedtuple with coefficients in the order\n        ``(a, b, c, d, e, f)``.\n\n        Please see https://github.com/mapbox/rasterio/issues/86\n        for more details.\n        ", 0},
  {(char *)"affine", __pyx_getprop_8rasterio_5_base_13DatasetReader_affine, 0, (char *)"An instance of ``affine.Affine``. This property is a\n        transitional feature: see the docstring of ``transform``\n        (above) for more details.\n        ", 0},
  {(char *)"kwds", __pyx_getprop_8rasterio_5_base_13DatasetReader_kwds, 0, (char *)0, 0},
  {(char *)"name", __pyx_getprop_8rasterio_5_base_13DatasetReader_name, 0, (char *)0, 0},
  {(char *)"mode", __pyx_getprop_8rasterio_5_base_13DatasetReader_mode, 0, (char *)0, 0},
  {(char *)"options", __pyx_getprop_8rasterio_5_base_13DatasetReader_options, 0, (char *)0, 0},
  {(char *)"width", __pyx_getprop_8rasterio_5_base_13DatasetReader_width, 0, (char *)0, 0},
  {(char *)"height", __pyx_getprop_8rasterio_5_base_13DatasetReader_height, 0, (char *)0, 0},
  {(char *)"shape", __pyx_getprop_8rasterio_5_base_13DatasetReader_shape, 0, (char *)0, 0},
  {(char *)"driver", __pyx_getprop_8rasterio_5_base_13DatasetReader_driver, __pyx_setprop_8rasterio_5_base_13DatasetReader_driver, (char *)0, 0},
  {(char *)"_count", __pyx_getprop_8rasterio_5_base_13DatasetReader__count, __pyx_setprop_8rasterio_5_base_13DatasetReader__count, (char *)0, 0},
  {(char *)"_dtypes", __pyx_getprop_8rasterio_5_base_13DatasetReader__dtypes, __pyx_setprop_8rasterio_5_base_13DatasetReader__dtypes, (char *)0, 0},
  {(char *)"_closed", __pyx_getprop_8rasterio_5_base_13DatasetReader__closed, __pyx_setprop_8rasterio_5_base_13DatasetReader__closed, (char *)0, 0},
  {(char *)"_crs", __pyx_getprop_8rasterio_5_base_13DatasetReader__crs, __pyx_setprop_8rasterio_5_base_13DatasetReader__crs, (char *)0, 0},
  {(char *)"_crs_wkt", __pyx_getprop_8rasterio_5_base_13DatasetReader__crs_wkt, __pyx_setprop_8rasterio_5_base_13DatasetReader__crs_wkt, (char *)0, 0},
  {(char *)"_transform", __pyx_getprop_8rasterio_5_base_13DatasetReader__transform, __pyx_setprop_8rasterio_5_base_13DatasetReader__transform, (char *)0, 0},
  {(char *)"_block_shapes", __pyx_getprop_8rasterio_5_base_13DatasetReader__block_shapes, __pyx_setprop_8rasterio_5_base_13DatasetReader__block_shapes, (char *)0, 0},
  {(char *)"_nodatavals", __pyx_getprop_8rasterio_5_base_13DatasetReader__nodatavals, __pyx_setprop_8rasterio_5_base_13DatasetReader__nodatavals, (char *)0, 0},
  {(char *)"_read", __pyx_getprop_8rasterio_5_base_13DatasetReader__read, __pyx_setprop_8rasterio_5_base_13DatasetReader__read, (char *)0, 0},
  {0, 0, 0, 0, 0}
};

static PyTypeObject __pyx_type_8rasterio_5_base_DatasetReader = {
  PyVarObject_HEAD_INIT(0, 0)
  "rasterio._base.DatasetReader", /*tp_name*/
  sizeof(struct __pyx_obj_8rasterio_5_base_DatasetReader), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_8rasterio_5_base_DatasetReader, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  __pyx_pw_8rasterio_5_base_13DatasetReader_3__repr__, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_8rasterio_5_base_DatasetReader, /*tp_traverse*/
  __pyx_tp_clear_8rasterio_5_base_DatasetReader, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  __pyx_methods_8rasterio_5_base_DatasetReader, /*tp_methods*/
  0, /*tp_members*/
  __pyx_getsets_8rasterio_5_base_DatasetReader, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  __pyx_pw_8rasterio_5_base_13DatasetReader_1__init__, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_8rasterio_5_base_DatasetReader, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *__pyx_freelist_8rasterio_5_base___pyx_scope_struct__block_windows[8];
static int __pyx_freecount_8rasterio_5_base___pyx_scope_struct__block_windows = 0;

static PyObject *__pyx_tp_new_8rasterio_5_base___pyx_scope_struct__block_windows(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_8rasterio_5_base___pyx_scope_struct__block_windows > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows)))) {
    o = (PyObject*)__pyx_freelist_8rasterio_5_base___pyx_scope_struct__block_windows[--__pyx_freecount_8rasterio_5_base___pyx_scope_struct__block_windows];
    memset(o, 0, sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_8rasterio_5_base___pyx_scope_struct__block_windows(PyObject *o) {
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_v_bidx);
  Py_CLEAR(p->__pyx_v_block_shapes);
  Py_CLEAR(p->__pyx_v_col);
  Py_CLEAR(p->__pyx_v_d);
  Py_CLEAR(p->__pyx_v_h);
  Py_CLEAR(p->__pyx_v_height);
  Py_CLEAR(p->__pyx_v_m);
  Py_CLEAR(p->__pyx_v_ncols);
  Py_CLEAR(p->__pyx_v_nrows);
  Py_CLEAR(p->__pyx_v_row);
  Py_CLEAR(p->__pyx_v_self);
  Py_CLEAR(p->__pyx_v_w);
  Py_CLEAR(p->__pyx_v_width);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_8rasterio_5_base___pyx_scope_struct__block_windows < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows)))) {
    __pyx_freelist_8rasterio_5_base___pyx_scope_struct__block_windows[__pyx_freecount_8rasterio_5_base___pyx_scope_struct__block_windows++] = ((struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_8rasterio_5_base___pyx_scope_struct__block_windows(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *)o;
  if (p->__pyx_v_bidx) {
    e = (*v)(p->__pyx_v_bidx, a); if (e) return e;
  }
  if (p->__pyx_v_block_shapes) {
    e = (*v)(p->__pyx_v_block_shapes, a); if (e) return e;
  }
  if (p->__pyx_v_col) {
    e = (*v)(p->__pyx_v_col, a); if (e) return e;
  }
  if (p->__pyx_v_d) {
    e = (*v)(p->__pyx_v_d, a); if (e) return e;
  }
  if (p->__pyx_v_h) {
    e = (*v)(p->__pyx_v_h, a); if (e) return e;
  }
  if (p->__pyx_v_height) {
    e = (*v)(p->__pyx_v_height, a); if (e) return e;
  }
  if (p->__pyx_v_m) {
    e = (*v)(p->__pyx_v_m, a); if (e) return e;
  }
  if (p->__pyx_v_ncols) {
    e = (*v)(p->__pyx_v_ncols, a); if (e) return e;
  }
  if (p->__pyx_v_nrows) {
    e = (*v)(p->__pyx_v_nrows, a); if (e) return e;
  }
  if (p->__pyx_v_row) {
    e = (*v)(p->__pyx_v_row, a); if (e) return e;
  }
  if (p->__pyx_v_self) {
    e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
  }
  if (p->__pyx_v_w) {
    e = (*v)(p->__pyx_v_w, a); if (e) return e;
  }
  if (p->__pyx_v_width) {
    e = (*v)(p->__pyx_v_width, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_8rasterio_5_base___pyx_scope_struct__block_windows(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows *)o;
  tmp = ((PyObject*)p->__pyx_v_bidx);
  p->__pyx_v_bidx = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_block_shapes);
  p->__pyx_v_block_shapes = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_col);
  p->__pyx_v_col = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_d);
  p->__pyx_v_d = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_h);
  p->__pyx_v_h = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_height);
  p->__pyx_v_height = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_m);
  p->__pyx_v_m = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_ncols);
  p->__pyx_v_ncols = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_nrows);
  p->__pyx_v_nrows = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_row);
  p->__pyx_v_row = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_self);
  p->__pyx_v_self = ((struct __pyx_obj_8rasterio_5_base_DatasetReader *)Py_None); Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_w);
  p->__pyx_v_w = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_width);
  p->__pyx_v_width = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_8rasterio_5_base___pyx_scope_struct__block_windows = {
  PyVarObject_HEAD_INIT(0, 0)
  "rasterio._base.__pyx_scope_struct__block_windows", /*tp_name*/
  sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct__block_windows), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_8rasterio_5_base___pyx_scope_struct__block_windows, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_8rasterio_5_base___pyx_scope_struct__block_windows, /*tp_traverse*/
  __pyx_tp_clear_8rasterio_5_base___pyx_scope_struct__block_windows, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_8rasterio_5_base___pyx_scope_struct__block_windows, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__ *__pyx_freelist_8rasterio_5_base___pyx_scope_struct_1___get__[8];
static int __pyx_freecount_8rasterio_5_base___pyx_scope_struct_1___get__ = 0;

static PyObject *__pyx_tp_new_8rasterio_5_base___pyx_scope_struct_1___get__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_8rasterio_5_base___pyx_scope_struct_1___get__ > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__)))) {
    o = (PyObject*)__pyx_freelist_8rasterio_5_base___pyx_scope_struct_1___get__[--__pyx_freecount_8rasterio_5_base___pyx_scope_struct_1___get__];
    memset(o, 0, sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_8rasterio_5_base___pyx_scope_struct_1___get__(PyObject *o) {
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__ *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__ *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_v_self);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_8rasterio_5_base___pyx_scope_struct_1___get__ < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__)))) {
    __pyx_freelist_8rasterio_5_base___pyx_scope_struct_1___get__[__pyx_freecount_8rasterio_5_base___pyx_scope_struct_1___get__++] = ((struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__ *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_8rasterio_5_base___pyx_scope_struct_1___get__(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__ *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__ *)o;
  if (p->__pyx_v_self) {
    e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_8rasterio_5_base___pyx_scope_struct_1___get__(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__ *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__ *)o;
  tmp = ((PyObject*)p->__pyx_v_self);
  p->__pyx_v_self = ((struct __pyx_obj_8rasterio_5_base_DatasetReader *)Py_None); Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_8rasterio_5_base___pyx_scope_struct_1___get__ = {
  PyVarObject_HEAD_INIT(0, 0)
  "rasterio._base.__pyx_scope_struct_1___get__", /*tp_name*/
  sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_8rasterio_5_base___pyx_scope_struct_1___get__, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_8rasterio_5_base___pyx_scope_struct_1___get__, /*tp_traverse*/
  __pyx_tp_clear_8rasterio_5_base___pyx_scope_struct_1___get__, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_8rasterio_5_base___pyx_scope_struct_1___get__, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *__pyx_freelist_8rasterio_5_base___pyx_scope_struct_2_genexpr[8];
static int __pyx_freecount_8rasterio_5_base___pyx_scope_struct_2_genexpr = 0;

static PyObject *__pyx_tp_new_8rasterio_5_base___pyx_scope_struct_2_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_8rasterio_5_base___pyx_scope_struct_2_genexpr > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr)))) {
    o = (PyObject*)__pyx_freelist_8rasterio_5_base___pyx_scope_struct_2_genexpr[--__pyx_freecount_8rasterio_5_base___pyx_scope_struct_2_genexpr];
    memset(o, 0, sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_8rasterio_5_base___pyx_scope_struct_2_genexpr(PyObject *o) {
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_outer_scope);
  Py_CLEAR(p->__pyx_v_k);
  Py_CLEAR(p->__pyx_v_v);
  Py_CLEAR(p->__pyx_t_0);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_8rasterio_5_base___pyx_scope_struct_2_genexpr < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr)))) {
    __pyx_freelist_8rasterio_5_base___pyx_scope_struct_2_genexpr[__pyx_freecount_8rasterio_5_base___pyx_scope_struct_2_genexpr++] = ((struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_8rasterio_5_base___pyx_scope_struct_2_genexpr(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *)o;
  if (p->__pyx_outer_scope) {
    e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
  }
  if (p->__pyx_v_k) {
    e = (*v)(p->__pyx_v_k, a); if (e) return e;
  }
  if (p->__pyx_v_v) {
    e = (*v)(p->__pyx_v_v, a); if (e) return e;
  }
  if (p->__pyx_t_0) {
    e = (*v)(p->__pyx_t_0, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_8rasterio_5_base___pyx_scope_struct_2_genexpr(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr *)o;
  tmp = ((PyObject*)p->__pyx_outer_scope);
  p->__pyx_outer_scope = ((struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_1___get__ *)Py_None); Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_k);
  p->__pyx_v_k = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_v);
  p->__pyx_v_v = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_t_0);
  p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_8rasterio_5_base___pyx_scope_struct_2_genexpr = {
  PyVarObject_HEAD_INIT(0, 0)
  "rasterio._base.__pyx_scope_struct_2_genexpr", /*tp_name*/
  sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_2_genexpr), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_8rasterio_5_base___pyx_scope_struct_2_genexpr, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_8rasterio_5_base___pyx_scope_struct_2_genexpr, /*tp_traverse*/
  __pyx_tp_clear_8rasterio_5_base___pyx_scope_struct_2_genexpr, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_8rasterio_5_base___pyx_scope_struct_2_genexpr, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index *__pyx_freelist_8rasterio_5_base___pyx_scope_struct_3_window_index[8];
static int __pyx_freecount_8rasterio_5_base___pyx_scope_struct_3_window_index = 0;

static PyObject *__pyx_tp_new_8rasterio_5_base___pyx_scope_struct_3_window_index(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_8rasterio_5_base___pyx_scope_struct_3_window_index > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index)))) {
    o = (PyObject*)__pyx_freelist_8rasterio_5_base___pyx_scope_struct_3_window_index[--__pyx_freecount_8rasterio_5_base___pyx_scope_struct_3_window_index];
    memset(o, 0, sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_8rasterio_5_base___pyx_scope_struct_3_window_index(PyObject *o) {
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_v_window);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_8rasterio_5_base___pyx_scope_struct_3_window_index < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index)))) {
    __pyx_freelist_8rasterio_5_base___pyx_scope_struct_3_window_index[__pyx_freecount_8rasterio_5_base___pyx_scope_struct_3_window_index++] = ((struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_8rasterio_5_base___pyx_scope_struct_3_window_index(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index *)o;
  if (p->__pyx_v_window) {
    e = (*v)(p->__pyx_v_window, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_8rasterio_5_base___pyx_scope_struct_3_window_index(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index *)o;
  tmp = ((PyObject*)p->__pyx_v_window);
  p->__pyx_v_window = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_8rasterio_5_base___pyx_scope_struct_3_window_index = {
  PyVarObject_HEAD_INIT(0, 0)
  "rasterio._base.__pyx_scope_struct_3_window_index", /*tp_name*/
  sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_8rasterio_5_base___pyx_scope_struct_3_window_index, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_8rasterio_5_base___pyx_scope_struct_3_window_index, /*tp_traverse*/
  __pyx_tp_clear_8rasterio_5_base___pyx_scope_struct_3_window_index, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_8rasterio_5_base___pyx_scope_struct_3_window_index, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_4_genexpr *__pyx_freelist_8rasterio_5_base___pyx_scope_struct_4_genexpr[8];
static int __pyx_freecount_8rasterio_5_base___pyx_scope_struct_4_genexpr = 0;

static PyObject *__pyx_tp_new_8rasterio_5_base___pyx_scope_struct_4_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_8rasterio_5_base___pyx_scope_struct_4_genexpr > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_4_genexpr)))) {
    o = (PyObject*)__pyx_freelist_8rasterio_5_base___pyx_scope_struct_4_genexpr[--__pyx_freecount_8rasterio_5_base___pyx_scope_struct_4_genexpr];
    memset(o, 0, sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_4_genexpr));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_8rasterio_5_base___pyx_scope_struct_4_genexpr(PyObject *o) {
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_4_genexpr *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_4_genexpr *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_outer_scope);
  Py_CLEAR(p->__pyx_v_w);
  Py_CLEAR(p->__pyx_t_0);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_8rasterio_5_base___pyx_scope_struct_4_genexpr < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_4_genexpr)))) {
    __pyx_freelist_8rasterio_5_base___pyx_scope_struct_4_genexpr[__pyx_freecount_8rasterio_5_base___pyx_scope_struct_4_genexpr++] = ((struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_4_genexpr *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_8rasterio_5_base___pyx_scope_struct_4_genexpr(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_4_genexpr *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_4_genexpr *)o;
  if (p->__pyx_outer_scope) {
    e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
  }
  if (p->__pyx_v_w) {
    e = (*v)(p->__pyx_v_w, a); if (e) return e;
  }
  if (p->__pyx_t_0) {
    e = (*v)(p->__pyx_t_0, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_8rasterio_5_base___pyx_scope_struct_4_genexpr(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_4_genexpr *p = (struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_4_genexpr *)o;
  tmp = ((PyObject*)p->__pyx_outer_scope);
  p->__pyx_outer_scope = ((struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_3_window_index *)Py_None); Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_w);
  p->__pyx_v_w = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_t_0);
  p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_8rasterio_5_base___pyx_scope_struct_4_genexpr = {
  PyVarObject_HEAD_INIT(0, 0)
  "rasterio._base.__pyx_scope_struct_4_genexpr", /*tp_name*/
  sizeof(struct __pyx_obj_8rasterio_5_base___pyx_scope_struct_4_genexpr), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_8rasterio_5_base___pyx_scope_struct_4_genexpr, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_8rasterio_5_base___pyx_scope_struct_4_genexpr, /*tp_traverse*/
  __pyx_tp_clear_8rasterio_5_base___pyx_scope_struct_4_genexpr, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_8rasterio_5_base___pyx_scope_struct_4_genexpr, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static PyMethodDef __pyx_methods[] = {
  {"crop_window", (PyCFunction)__pyx_pw_8rasterio_5_base_5crop_window, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_4crop_window},
  {"eval_window", (PyCFunction)__pyx_pw_8rasterio_5_base_7eval_window, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8rasterio_5_base_6eval_window},
  {0, 0, 0, 0}
};

#if PY_MAJOR_VERSION >= 3
static struct PyModuleDef __pyx_moduledef = {
  #if PY_VERSION_HEX < 0x03020000
    { PyObject_HEAD_INIT(NULL) NULL, 0, NULL },
  #else
    PyModuleDef_HEAD_INIT,
  #endif
    "_base",
    __pyx_k_Numpy_free_base_classes, /* m_doc */
    -1, /* m_size */
    __pyx_methods /* m_methods */,
    NULL, /* m_reload */
    NULL, /* m_traverse */
    NULL, /* m_clear */
    NULL /* m_free */
};
#endif

static __Pyx_StringTabEntry __pyx_string_tab[] = {
  {&__pyx_kp_s_A_band_index_must_be_provided_wh, __pyx_k_A_band_index_must_be_provided_wh, sizeof(__pyx_k_A_band_index_must_be_provided_wh), 0, 0, 1, 0},
  {&__pyx_n_s_Affine, __pyx_k_Affine, sizeof(__pyx_k_Affine), 0, 0, 1, 1},
  {&__pyx_n_s_AssertionError, __pyx_k_AssertionError, sizeof(__pyx_k_AssertionError), 0, 0, 1, 1},
  {&__pyx_n_s_BoundingBox, __pyx_k_BoundingBox, sizeof(__pyx_k_BoundingBox), 0, 0, 1, 1},
  {&__pyx_n_s_COMPRESSION, __pyx_k_COMPRESSION, sizeof(__pyx_k_COMPRESSION), 0, 0, 1, 1},
  {&__pyx_n_s_CPLE_IllegalArg, __pyx_k_CPLE_IllegalArg, sizeof(__pyx_k_CPLE_IllegalArg), 0, 0, 1, 1},
  {&__pyx_n_s_CPLE_NotSupported, __pyx_k_CPLE_NotSupported, sizeof(__pyx_k_CPLE_NotSupported), 0, 0, 1, 1},
  {&__pyx_n_s_CPLE_OpenFailed, __pyx_k_CPLE_OpenFailed, sizeof(__pyx_k_CPLE_OpenFailed), 0, 0, 1, 1},
  {&__pyx_n_s_CPLErrors, __pyx_k_CPLErrors, sizeof(__pyx_k_CPLErrors), 0, 0, 1, 1},
  {&__pyx_n_s_CRSError, __pyx_k_CRSError, sizeof(__pyx_k_CRSError), 0, 0, 1, 1},
  {&__pyx_kp_s_Can_t_read_closed_raster_file, __pyx_k_Can_t_read_closed_raster_file, sizeof(__pyx_k_Can_t_read_closed_raster_file), 0, 0, 1, 0},
  {&__pyx_n_s_ColorInterp, __pyx_k_ColorInterp, sizeof(__pyx_k_ColorInterp), 0, 0, 1, 1},
  {&__pyx_kp_s_Color_d_d_d_d, __pyx_k_Color_d_d_d_d, sizeof(__pyx_k_Color_d_d_d_d), 0, 0, 1, 0},
  {&__pyx_n_s_Compression, __pyx_k_Compression, sizeof(__pyx_k_Compression), 0, 0, 1, 1},
  {&__pyx_n_s_DatasetReader___get___locals_gen, __pyx_k_DatasetReader___get___locals_gen, sizeof(__pyx_k_DatasetReader___get___locals_gen), 0, 0, 1, 1},
  {&__pyx_n_s_DatasetReader_block_windows, __pyx_k_DatasetReader_block_windows, sizeof(__pyx_k_DatasetReader_block_windows), 0, 0, 1, 1},
  {&__pyx_kp_s_Dataset_has_no_geotransform_set, __pyx_k_Dataset_has_no_geotransform_set, sizeof(__pyx_k_Dataset_has_no_geotransform_set), 0, 0, 1, 0},
  {&__pyx_kp_s_Dataset_r_has_been_closed, __pyx_k_Dataset_r_has_been_closed, sizeof(__pyx_k_Dataset_r_has_been_closed), 0, 0, 1, 0},
  {&__pyx_kp_s_Dataset_r_has_been_stopped, __pyx_k_Dataset_r_has_been_stopped, sizeof(__pyx_k_Dataset_r_has_been_stopped), 0, 0, 1, 0},
  {&__pyx_kp_s_Dataset_r_is_started, __pyx_k_Dataset_r_is_started, sizeof(__pyx_k_Dataset_r_is_started), 0, 0, 1, 0},
  {&__pyx_n_s_EPSG, __pyx_k_EPSG, sizeof(__pyx_k_EPSG), 0, 0, 1, 1},
  {&__pyx_kp_s_Entering_Dataset_r_context, __pyx_k_Entering_Dataset_r_context, sizeof(__pyx_k_Entering_Dataset_r_context), 0, 0, 1, 0},
  {&__pyx_n_s_Env, __pyx_k_Env, sizeof(__pyx_k_Env), 0, 0, 1, 1},
  {&__pyx_kp_s_Exited_Dataset_r_context, __pyx_k_Exited_Dataset_r_context, sizeof(__pyx_k_Exited_Dataset_r_context), 0, 0, 1, 0},
  {&__pyx_kp_s_Failed_to_auto_identify_EPSG_d, __pyx_k_Failed_to_auto_identify_EPSG_d, sizeof(__pyx_k_Failed_to_auto_identify_EPSG_d), 0, 0, 1, 0},
  {&__pyx_n_s_FutureWarning, __pyx_k_FutureWarning, sizeof(__pyx_k_FutureWarning), 0, 0, 1, 1},
  {&__pyx_n_s_GDALError, __pyx_k_GDALError, sizeof(__pyx_k_GDALError), 0, 0, 1, 1},
  {&__pyx_kp_s_GDAL_dataset_has_no_projection, __pyx_k_GDAL_dataset_has_no_projection, sizeof(__pyx_k_GDAL_dataset_has_no_projection), 0, 0, 1, 0},
  {&__pyx_kp_s_Got_coordinate_system, __pyx_k_Got_coordinate_system, sizeof(__pyx_k_Got_coordinate_system), 0, 0, 1, 0},
  {&__pyx_n_s_IMAGE_STRUCTURE, __pyx_k_IMAGE_STRUCTURE, sizeof(__pyx_k_IMAGE_STRUCTURE), 0, 0, 1, 1},
  {&__pyx_n_s_INTERLEAVE, __pyx_k_INTERLEAVE, sizeof(__pyx_k_INTERLEAVE), 0, 0, 1, 1},
  {&__pyx_n_s_IndexError, __pyx_k_IndexError, sizeof(__pyx_k_IndexError), 0, 0, 1, 1},
  {&__pyx_n_s_Interleaving, __pyx_k_Interleaving, sizeof(__pyx_k_Interleaving), 0, 0, 1, 1},
  {&__pyx_kp_s_Invalid_band_index, __pyx_k_Invalid_band_index, sizeof(__pyx_k_Invalid_band_index), 0, 0, 1, 0},
  {&__pyx_kp_s_NULL_band, __pyx_k_NULL_band, sizeof(__pyx_k_NULL_band), 0, 0, 1, 0},
  {&__pyx_kp_s_NULL_color_at_d_skipping, __pyx_k_NULL_color_at_d_skipping, sizeof(__pyx_k_NULL_color_at_d_skipping), 0, 0, 1, 0},
  {&__pyx_kp_s_NULL_color_table, __pyx_k_NULL_color_table, sizeof(__pyx_k_NULL_color_table), 0, 0, 1, 0},
  {&__pyx_kp_s_Nodata_success_d_Nodata_value_f, __pyx_k_Nodata_success_d_Nodata_value_f, sizeof(__pyx_k_Nodata_success_d_Nodata_value_f), 0, 0, 1, 0},
  {&__pyx_kp_s_Null_band, __pyx_k_Null_band, sizeof(__pyx_k_Null_band), 0, 0, 1, 0},
  {&__pyx_kp_s_Null_dataset, __pyx_k_Null_dataset, sizeof(__pyx_k_Null_dataset), 0, 0, 1, 0},
  {&__pyx_kp_s_Null_projection, __pyx_k_Null_projection, sizeof(__pyx_k_Null_projection), 0, 0, 1, 0},
  {&__pyx_kp_s_PROJ_4_to_be_imported_r, __pyx_k_PROJ_4_to_be_imported_r, sizeof(__pyx_k_PROJ_4_to_be_imported_r), 0, 0, 1, 0},
  {&__pyx_kp_s_Params_s, __pyx_k_Params_s, sizeof(__pyx_k_Params_s), 0, 0, 1, 0},
  {&__pyx_n_s_PhotometricInterp, __pyx_k_PhotometricInterp, sizeof(__pyx_k_PhotometricInterp), 0, 0, 1, 1},
  {&__pyx_n_s_RasterioIOError, __pyx_k_RasterioIOError, sizeof(__pyx_k_RasterioIOError), 0, 0, 1, 1},
  {&__pyx_n_s_SOURCE_COLOR_SPACE, __pyx_k_SOURCE_COLOR_SPACE, sizeof(__pyx_k_SOURCE_COLOR_SPACE), 0, 0, 1, 1},
  {&__pyx_kp_s_The_value_of_this_property_will, __pyx_k_The_value_of_this_property_will, sizeof(__pyx_k_The_value_of_this_property_will), 0, 0, 1, 0},
  {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1},
  {&__pyx_kp_s_Unexpected_NULL_spatial_referenc, __pyx_k_Unexpected_NULL_spatial_referenc, sizeof(__pyx_k_Unexpected_NULL_spatial_referenc), 0, 0, 1, 0},
  {&__pyx_kp_s_Unexpected_Null_spatial_referenc, __pyx_k_Unexpected_Null_spatial_referenc, sizeof(__pyx_k_Unexpected_Null_spatial_referenc), 0, 0, 1, 0},
  {&__pyx_kp_s_Unexpected_proj_parameter_s, __pyx_k_Unexpected_proj_parameter_s, sizeof(__pyx_k_Unexpected_proj_parameter_s), 0, 0, 1, 0},
  {&__pyx_n_s_UserWarning, __pyx_k_UserWarning, sizeof(__pyx_k_UserWarning), 0, 0, 1, 1},
  {&__pyx_kp_s_Users_sean_code_frs_wheel_build, __pyx_k_Users_sean_code_frs_wheel_build, sizeof(__pyx_k_Users_sean_code_frs_wheel_build), 0, 0, 1, 0},
  {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1},
  {&__pyx_kp_s__10, __pyx_k__10, sizeof(__pyx_k__10), 0, 0, 1, 0},
  {&__pyx_kp_s__12, __pyx_k__12, sizeof(__pyx_k__12), 0, 0, 1, 0},
  {&__pyx_kp_s__30, __pyx_k__30, sizeof(__pyx_k__30), 0, 0, 1, 0},
  {&__pyx_kp_s__49, __pyx_k__49, sizeof(__pyx_k__49), 0, 0, 1, 0},
  {&__pyx_n_s_a, __pyx_k_a, sizeof(__pyx_k_a), 0, 0, 1, 1},
  {&__pyx_n_s_affine, __pyx_k_affine, sizeof(__pyx_k_affine), 0, 0, 1, 1},
  {&__pyx_n_s_append, __pyx_k_append, sizeof(__pyx_k_append), 0, 0, 1, 1},
  {&__pyx_n_s_archive, __pyx_k_archive, sizeof(__pyx_k_archive), 0, 0, 1, 1},
  {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1},
  {&__pyx_n_s_b, __pyx_k_b, sizeof(__pyx_k_b), 0, 0, 1, 1},
  {&__pyx_n_s_bidx, __pyx_k_bidx, sizeof(__pyx_k_bidx), 0, 0, 1, 1},
  {&__pyx_n_s_block_shapes, __pyx_k_block_shapes, sizeof(__pyx_k_block_shapes), 0, 0, 1, 1},
  {&__pyx_n_s_block_windows, __pyx_k_block_windows, sizeof(__pyx_k_block_windows), 0, 0, 1, 1},
  {&__pyx_n_s_blockxsize, __pyx_k_blockxsize, sizeof(__pyx_k_blockxsize), 0, 0, 1, 1},
  {&__pyx_n_s_blockysize, __pyx_k_blockysize, sizeof(__pyx_k_blockysize), 0, 0, 1, 1},
  {&__pyx_n_s_bottom, __pyx_k_bottom, sizeof(__pyx_k_bottom), 0, 0, 1, 1},
  {&__pyx_n_s_boundless, __pyx_k_boundless, sizeof(__pyx_k_boundless), 0, 0, 1, 1},
  {&__pyx_n_s_bounds, __pyx_k_bounds, sizeof(__pyx_k_bounds), 0, 0, 1, 1},
  {&__pyx_n_s_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 0, 1, 1},
  {&__pyx_kp_s_can_t_read_closed_raster_file, __pyx_k_can_t_read_closed_raster_file, sizeof(__pyx_k_can_t_read_closed_raster_file), 0, 0, 1, 0},
  {&__pyx_n_s_ceil, __pyx_k_ceil, sizeof(__pyx_k_ceil), 0, 0, 1, 1},
  {&__pyx_n_s_check, __pyx_k_check, sizeof(__pyx_k_check), 0, 0, 1, 1},
  {&__pyx_n_s_check_gdal_version, __pyx_k_check_gdal_version, sizeof(__pyx_k_check_gdal_version), 0, 0, 1, 1},
  {&__pyx_n_s_close, __pyx_k_close, sizeof(__pyx_k_close), 0, 0, 1, 1},
  {&__pyx_n_s_closed, __pyx_k_closed, sizeof(__pyx_k_closed), 0, 0, 1, 1},
  {&__pyx_n_s_col, __pyx_k_col, sizeof(__pyx_k_col), 0, 0, 1, 1},
  {&__pyx_n_s_compress, __pyx_k_compress, sizeof(__pyx_k_compress), 0, 0, 1, 1},
  {&__pyx_n_s_compression, __pyx_k_compression, sizeof(__pyx_k_compression), 0, 0, 1, 1},
  {&__pyx_n_s_count, __pyx_k_count, sizeof(__pyx_k_count), 0, 0, 1, 1},
  {&__pyx_n_s_cple, __pyx_k_cple, sizeof(__pyx_k_cple), 0, 0, 1, 1},
  {&__pyx_n_s_crs, __pyx_k_crs, sizeof(__pyx_k_crs), 0, 0, 1, 1},
  {&__pyx_n_s_crs1, __pyx_k_crs1, sizeof(__pyx_k_crs1), 0, 0, 1, 1},
  {&__pyx_n_s_crs2, __pyx_k_crs2, sizeof(__pyx_k_crs2), 0, 0, 1, 1},
  {&__pyx_n_s_d, __pyx_k_d, sizeof(__pyx_k_d), 0, 0, 1, 1},
  {&__pyx_n_s_debug, __pyx_k_debug, sizeof(__pyx_k_debug), 0, 0, 1, 1},
  {&__pyx_n_s_driver, __pyx_k_driver, sizeof(__pyx_k_driver), 0, 0, 1, 1},
  {&__pyx_n_s_dst, __pyx_k_dst, sizeof(__pyx_k_dst), 0, 0, 1, 1},
  {&__pyx_n_s_dst_crs, __pyx_k_dst_crs, sizeof(__pyx_k_dst_crs), 0, 0, 1, 1},
  {&__pyx_n_s_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 0, 0, 1, 1},
  {&__pyx_n_s_dtype_fwd, __pyx_k_dtype_fwd, sizeof(__pyx_k_dtype_fwd), 0, 0, 1, 1},
  {&__pyx_n_s_dtype_ranges, __pyx_k_dtype_ranges, sizeof(__pyx_k_dtype_ranges), 0, 0, 1, 1},
  {&__pyx_n_s_dtypes, __pyx_k_dtypes, sizeof(__pyx_k_dtypes), 0, 0, 1, 1},
  {&__pyx_n_s_encode, __pyx_k_encode, sizeof(__pyx_k_encode), 0, 0, 1, 1},
  {&__pyx_n_s_enter, __pyx_k_enter, sizeof(__pyx_k_enter), 0, 0, 1, 1},
  {&__pyx_n_s_eps, __pyx_k_eps, sizeof(__pyx_k_eps), 0, 0, 1, 1},
  {&__pyx_kp_s_epsg, __pyx_k_epsg, sizeof(__pyx_k_epsg), 0, 0, 1, 0},
  {&__pyx_kp_s_epsg_4326, __pyx_k_epsg_4326, sizeof(__pyx_k_epsg_4326), 0, 0, 1, 0},
  {&__pyx_n_s_err, __pyx_k_err, sizeof(__pyx_k_err), 0, 0, 1, 1},
  {&__pyx_n_s_errmsg, __pyx_k_errmsg, sizeof(__pyx_k_errmsg), 0, 0, 1, 1},
  {&__pyx_n_s_exit, __pyx_k_exit, sizeof(__pyx_k_exit), 0, 0, 1, 1},
  {&__pyx_n_s_failure, __pyx_k_failure, sizeof(__pyx_k_failure), 0, 0, 1, 1},
  {&__pyx_n_s_float, __pyx_k_float, sizeof(__pyx_k_float), 0, 0, 1, 1},
  {&__pyx_n_s_floor, __pyx_k_floor, sizeof(__pyx_k_floor), 0, 0, 1, 1},
  {&__pyx_n_s_from_gdal, __pyx_k_from_gdal, sizeof(__pyx_k_from_gdal), 0, 0, 1, 1},
  {&__pyx_n_s_gdal_version, __pyx_k_gdal_version, sizeof(__pyx_k_gdal_version), 0, 0, 1, 1},
  {&__pyx_n_s_genexpr, __pyx_k_genexpr, sizeof(__pyx_k_genexpr), 0, 0, 1, 1},
  {&__pyx_n_s_get, __pyx_k_get, sizeof(__pyx_k_get), 0, 0, 1, 1},
  {&__pyx_n_s_getLogger, __pyx_k_getLogger, sizeof(__pyx_k_getLogger), 0, 0, 1, 1},
  {&__pyx_n_s_get_crs, __pyx_k_get_crs, sizeof(__pyx_k_get_crs), 0, 0, 1, 1},
  {&__pyx_n_s_get_index, __pyx_k_get_index, sizeof(__pyx_k_get_index), 0, 0, 1, 1},
  {&__pyx_n_s_get_nodatavals, __pyx_k_get_nodatavals, sizeof(__pyx_k_get_nodatavals), 0, 0, 1, 1},
  {&__pyx_n_s_get_transform, __pyx_k_get_transform, sizeof(__pyx_k_get_transform), 0, 0, 1, 1},
  {&__pyx_n_s_get_window, __pyx_k_get_window, sizeof(__pyx_k_get_window), 0, 0, 1, 1},
  {&__pyx_n_s_height, __pyx_k_height, sizeof(__pyx_k_height), 0, 0, 1, 1},
  {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1},
  {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1},
  {&__pyx_n_s_indexes, __pyx_k_indexes, sizeof(__pyx_k_indexes), 0, 0, 1, 1},
  {&__pyx_n_s_info, __pyx_k_info, sizeof(__pyx_k_info), 0, 0, 1, 1},
  {&__pyx_n_s_init, __pyx_k_init, sizeof(__pyx_k_init), 0, 0, 1, 1},
  {&__pyx_n_s_interleave, __pyx_k_interleave, sizeof(__pyx_k_interleave), 0, 0, 1, 1},
  {&__pyx_n_s_interleaving, __pyx_k_interleaving, sizeof(__pyx_k_interleaving), 0, 0, 1, 1},
  {&__pyx_kp_s_invalid_height_d, __pyx_k_invalid_height_d, sizeof(__pyx_k_invalid_height_d), 0, 0, 1, 0},
  {&__pyx_kp_s_invalid_width_d, __pyx_k_invalid_width_d, sizeof(__pyx_k_invalid_width_d), 0, 0, 1, 0},
  {&__pyx_kp_s_invalid_window_col_range_d_d, __pyx_k_invalid_window_col_range_d_d, sizeof(__pyx_k_invalid_window_col_range_d_d), 0, 0, 1, 0},
  {&__pyx_kp_s_invalid_window_row_range_d_d, __pyx_k_invalid_window_row_range_d_d, sizeof(__pyx_k_invalid_window_row_range_d_d), 0, 0, 1, 0},
  {&__pyx_kp_s_invalid_window_structure_expecti, __pyx_k_invalid_window_structure_expecti, sizeof(__pyx_k_invalid_window_structure_expecti), 0, 0, 1, 0},
  {&__pyx_n_s_is_geographic_crs, __pyx_k_is_geographic_crs, sizeof(__pyx_k_is_geographic_crs), 0, 0, 1, 1},
  {&__pyx_n_s_is_projected_crs, __pyx_k_is_projected_crs, sizeof(__pyx_k_is_projected_crs), 0, 0, 1, 1},
  {&__pyx_n_s_is_same_crs, __pyx_k_is_same_crs, sizeof(__pyx_k_is_same_crs), 0, 0, 1, 1},
  {&__pyx_n_s_is_tiled, __pyx_k_is_tiled, sizeof(__pyx_k_is_tiled), 0, 0, 1, 1},
  {&__pyx_n_s_items, __pyx_k_items, sizeof(__pyx_k_items), 0, 0, 1, 1},
  {&__pyx_n_s_join, __pyx_k_join, sizeof(__pyx_k_join), 0, 0, 1, 1},
  {&__pyx_n_s_left, __pyx_k_left, sizeof(__pyx_k_left), 0, 0, 1, 1},
  {&__pyx_n_s_log, __pyx_k_log, sizeof(__pyx_k_log), 0, 0, 1, 1},
  {&__pyx_n_s_logging, __pyx_k_logging, sizeof(__pyx_k_logging), 0, 0, 1, 1},
  {&__pyx_n_s_lower, __pyx_k_lower, sizeof(__pyx_k_lower), 0, 0, 1, 1},
  {&__pyx_n_s_lstrip, __pyx_k_lstrip, sizeof(__pyx_k_lstrip), 0, 0, 1, 1},
  {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1},
  {&__pyx_n_s_major, __pyx_k_major, sizeof(__pyx_k_major), 0, 0, 1, 1},
  {&__pyx_n_s_math, __pyx_k_math, sizeof(__pyx_k_math), 0, 0, 1, 1},
  {&__pyx_n_s_meta, __pyx_k_meta, sizeof(__pyx_k_meta), 0, 0, 1, 1},
  {&__pyx_n_s_minor, __pyx_k_minor, sizeof(__pyx_k_minor), 0, 0, 1, 1},
  {&__pyx_n_s_n, __pyx_k_n, sizeof(__pyx_k_n), 0, 0, 1, 1},
  {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1},
  {&__pyx_n_s_name_2, __pyx_k_name_2, sizeof(__pyx_k_name_2), 0, 0, 1, 1},
  {&__pyx_n_s_no_defs, __pyx_k_no_defs, sizeof(__pyx_k_no_defs), 0, 0, 1, 1},
  {&__pyx_n_s_nodata, __pyx_k_nodata, sizeof(__pyx_k_nodata), 0, 0, 1, 1},
  {&__pyx_n_s_nodatavals, __pyx_k_nodatavals, sizeof(__pyx_k_nodatavals), 0, 0, 1, 1},
  {&__pyx_n_s_ns, __pyx_k_ns, sizeof(__pyx_k_ns), 0, 0, 1, 1},
  {&__pyx_n_s_op, __pyx_k_op, sizeof(__pyx_k_op), 0, 0, 1, 1},
  {&__pyx_n_s_open, __pyx_k_open, sizeof(__pyx_k_open), 0, 0, 1, 1},
  {&__pyx_n_s_options, __pyx_k_options, sizeof(__pyx_k_options), 0, 0, 1, 1},
  {&__pyx_n_s_os, __pyx_k_os, sizeof(__pyx_k_os), 0, 0, 1, 1},
  {&__pyx_n_s_osr_crs, __pyx_k_osr_crs, sizeof(__pyx_k_osr_crs), 0, 0, 1, 1},
  {&__pyx_n_s_osr_crs1, __pyx_k_osr_crs1, sizeof(__pyx_k_osr_crs1), 0, 0, 1, 1},
  {&__pyx_n_s_osr_crs2, __pyx_k_osr_crs2, sizeof(__pyx_k_osr_crs2), 0, 0, 1, 1},
  {&__pyx_n_s_parse_path, __pyx_k_parse_path, sizeof(__pyx_k_parse_path), 0, 0, 1, 1},
  {&__pyx_n_s_path, __pyx_k_path, sizeof(__pyx_k_path), 0, 0, 1, 1},
  {&__pyx_n_s_photometric, __pyx_k_photometric, sizeof(__pyx_k_photometric), 0, 0, 1, 1},
  {&__pyx_n_s_pop, __pyx_k_pop, sizeof(__pyx_k_pop), 0, 0, 1, 1},
  {&__pyx_n_s_precision, __pyx_k_precision, sizeof(__pyx_k_precision), 0, 0, 1, 1},
  {&__pyx_n_s_proj_c, __pyx_k_proj_c, sizeof(__pyx_k_proj_c), 0, 0, 1, 1},
  {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1},
  {&__pyx_n_s_r, __pyx_k_r, sizeof(__pyx_k_r), 0, 0, 1, 1},
  {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1},
  {&__pyx_n_s_rasterio, __pyx_k_rasterio, sizeof(__pyx_k_rasterio), 0, 0, 1, 1},
  {&__pyx_n_s_rasterio__base, __pyx_k_rasterio__base, sizeof(__pyx_k_rasterio__base), 0, 0, 1, 1},
  {&__pyx_n_s_rasterio__err, __pyx_k_rasterio__err, sizeof(__pyx_k_rasterio__err), 0, 0, 1, 1},
  {&__pyx_n_s_rasterio_coords, __pyx_k_rasterio_coords, sizeof(__pyx_k_rasterio_coords), 0, 0, 1, 1},
  {&__pyx_n_s_rasterio_enums, __pyx_k_rasterio_enums, sizeof(__pyx_k_rasterio_enums), 0, 0, 1, 1},
  {&__pyx_n_s_rasterio_env, __pyx_k_rasterio_env, sizeof(__pyx_k_rasterio_env), 0, 0, 1, 1},
  {&__pyx_n_s_rasterio_errors, __pyx_k_rasterio_errors, sizeof(__pyx_k_rasterio_errors), 0, 0, 1, 1},
  {&__pyx_n_s_rasterio_transform, __pyx_k_rasterio_transform, sizeof(__pyx_k_rasterio_transform), 0, 0, 1, 1},
  {&__pyx_n_s_rasterio_vfs, __pyx_k_rasterio_vfs, sizeof(__pyx_k_rasterio_vfs), 0, 0, 1, 1},
  {&__pyx_n_s_read_crs, __pyx_k_read_crs, sizeof(__pyx_k_read_crs), 0, 0, 1, 1},
  {&__pyx_n_s_read_crs_wkt, __pyx_k_read_crs_wkt, sizeof(__pyx_k_read_crs_wkt), 0, 0, 1, 1},
  {&__pyx_n_s_read_transform, __pyx_k_read_transform, sizeof(__pyx_k_read_transform), 0, 0, 1, 1},
  {&__pyx_n_s_res, __pyx_k_res, sizeof(__pyx_k_res), 0, 0, 1, 1},
  {&__pyx_n_s_res_xs, __pyx_k_res_xs, sizeof(__pyx_k_res_xs), 0, 0, 1, 1},
  {&__pyx_n_s_res_ys, __pyx_k_res_ys, sizeof(__pyx_k_res_ys), 0, 0, 1, 1},
  {&__pyx_n_s_res_zs, __pyx_k_res_zs, sizeof(__pyx_k_res_zs), 0, 0, 1, 1},
  {&__pyx_n_s_retval, __pyx_k_retval, sizeof(__pyx_k_retval), 0, 0, 1, 1},
  {&__pyx_n_s_right, __pyx_k_right, sizeof(__pyx_k_right), 0, 0, 1, 1},
  {&__pyx_n_s_rio_creation_kwds, __pyx_k_rio_creation_kwds, sizeof(__pyx_k_rio_creation_kwds), 0, 0, 1, 1},
  {&__pyx_n_s_round, __pyx_k_round, sizeof(__pyx_k_round), 0, 0, 1, 1},
  {&__pyx_n_s_row, __pyx_k_row, sizeof(__pyx_k_row), 0, 0, 1, 1},
  {&__pyx_kp_s_s, __pyx_k_s, sizeof(__pyx_k_s), 0, 0, 1, 0},
  {&__pyx_kp_s_s_RasterReader_name_s_mode_s, __pyx_k_s_RasterReader_name_s_mode_s, sizeof(__pyx_k_s_RasterReader_name_s_mode_s), 0, 0, 1, 0},
  {&__pyx_kp_s_s_s, __pyx_k_s_s, sizeof(__pyx_k_s_s), 0, 0, 1, 0},
  {&__pyx_n_s_scheme, __pyx_k_scheme, sizeof(__pyx_k_scheme), 0, 0, 1, 1},
  {&__pyx_n_s_send, __pyx_k_send, sizeof(__pyx_k_send), 0, 0, 1, 1},
  {&__pyx_n_s_split, __pyx_k_split, sizeof(__pyx_k_split), 0, 0, 1, 1},
  {&__pyx_n_s_sqrt, __pyx_k_sqrt, sizeof(__pyx_k_sqrt), 0, 0, 1, 1},
  {&__pyx_n_s_src, __pyx_k_src, sizeof(__pyx_k_src), 0, 0, 1, 1},
  {&__pyx_n_s_src_crs, __pyx_k_src_crs, sizeof(__pyx_k_src_crs), 0, 0, 1, 1},
  {&__pyx_n_s_stacklevel, __pyx_k_stacklevel, sizeof(__pyx_k_stacklevel), 0, 0, 1, 1},
  {&__pyx_n_s_stop, __pyx_k_stop, sizeof(__pyx_k_stop), 0, 0, 1, 1},
  {&__pyx_n_s_strip, __pyx_k_strip, sizeof(__pyx_k_strip), 0, 0, 1, 1},
  {&__pyx_n_s_sys, __pyx_k_sys, sizeof(__pyx_k_sys), 0, 0, 1, 1},
  {&__pyx_n_s_t, __pyx_k_t, sizeof(__pyx_k_t), 0, 0, 1, 1},
  {&__pyx_n_s_tags, __pyx_k_tags, sizeof(__pyx_k_tags), 0, 0, 1, 1},
  {&__pyx_n_s_tastes_like_gdal, __pyx_k_tastes_like_gdal, sizeof(__pyx_k_tastes_like_gdal), 0, 0, 1, 1},
  {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1},
  {&__pyx_n_s_throw, __pyx_k_throw, sizeof(__pyx_k_throw), 0, 0, 1, 1},
  {&__pyx_n_s_tiled, __pyx_k_tiled, sizeof(__pyx_k_tiled), 0, 0, 1, 1},
  {&__pyx_n_s_to_gdal, __pyx_k_to_gdal, sizeof(__pyx_k_to_gdal), 0, 0, 1, 1},
  {&__pyx_n_s_top, __pyx_k_top, sizeof(__pyx_k_top), 0, 0, 1, 1},
  {&__pyx_n_s_traceback, __pyx_k_traceback, sizeof(__pyx_k_traceback), 0, 0, 1, 1},
  {&__pyx_n_s_transform, __pyx_k_transform, sizeof(__pyx_k_transform), 0, 0, 1, 1},
  {&__pyx_n_s_transform_2, __pyx_k_transform_2, sizeof(__pyx_k_transform_2), 0, 0, 1, 1},
  {&__pyx_n_s_translation, __pyx_k_translation, sizeof(__pyx_k_translation), 0, 0, 1, 1},
  {&__pyx_n_s_type, __pyx_k_type, sizeof(__pyx_k_type), 0, 0, 1, 1},
  {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1},
  {&__pyx_n_s_upper, __pyx_k_upper, sizeof(__pyx_k_upper), 0, 0, 1, 1},
  {&__pyx_kp_s_utf_8, __pyx_k_utf_8, sizeof(__pyx_k_utf_8), 0, 0, 1, 0},
  {&__pyx_n_s_value, __pyx_k_value, sizeof(__pyx_k_value), 0, 0, 1, 1},
  {&__pyx_n_s_ver_b, __pyx_k_ver_b, sizeof(__pyx_k_ver_b), 0, 0, 1, 1},
  {&__pyx_n_s_ver_c, __pyx_k_ver_c, sizeof(__pyx_k_ver_c), 0, 0, 1, 1},
  {&__pyx_n_s_vsi_path, __pyx_k_vsi_path, sizeof(__pyx_k_vsi_path), 0, 0, 1, 1},
  {&__pyx_n_s_warn, __pyx_k_warn, sizeof(__pyx_k_warn), 0, 0, 1, 1},
  {&__pyx_n_s_warnings, __pyx_k_warnings, sizeof(__pyx_k_warnings), 0, 0, 1, 1},
  {&__pyx_n_s_width, __pyx_k_width, sizeof(__pyx_k_width), 0, 0, 1, 1},
  {&__pyx_n_s_window, __pyx_k_window, sizeof(__pyx_k_window), 0, 0, 1, 1},
  {&__pyx_n_s_window_index, __pyx_k_window_index, sizeof(__pyx_k_window_index), 0, 0, 1, 1},
  {&__pyx_n_s_window_index_locals_genexpr, __pyx_k_window_index_locals_genexpr, sizeof(__pyx_k_window_index_locals_genexpr), 0, 0, 1, 1},
  {&__pyx_n_s_window_shape, __pyx_k_window_shape, sizeof(__pyx_k_window_shape), 0, 0, 1, 1},
  {&__pyx_n_s_window_start, __pyx_k_window_start, sizeof(__pyx_k_window_start), 0, 0, 1, 1},
  {&__pyx_n_s_window_stop, __pyx_k_window_stop, sizeof(__pyx_k_window_stop), 0, 0, 1, 1},
  {&__pyx_n_s_wktext, __pyx_k_wktext, sizeof(__pyx_k_wktext), 0, 0, 1, 1},
  {&__pyx_n_s_x, __pyx_k_x, sizeof(__pyx_k_x), 0, 0, 1, 1},
  {&__pyx_n_s_xs, __pyx_k_xs, sizeof(__pyx_k_xs), 0, 0, 1, 1},
  {&__pyx_n_s_y, __pyx_k_y, sizeof(__pyx_k_y), 0, 0, 1, 1},
  {&__pyx_n_s_ys, __pyx_k_ys, sizeof(__pyx_k_ys), 0, 0, 1, 1},
  {&__pyx_n_s_z, __pyx_k_z, sizeof(__pyx_k_z), 0, 0, 1, 1},
  {&__pyx_n_s_zip, __pyx_k_zip, sizeof(__pyx_k_zip), 0, 0, 1, 1},
  {&__pyx_n_s_zs, __pyx_k_zs, sizeof(__pyx_k_zs), 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0}
};
static int __Pyx_InitCachedBuiltins(void) {
  __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) __PYX_ERR(0, 107, __pyx_L1_error)
  __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 126, __pyx_L1_error)
  __pyx_builtin_UserWarning = __Pyx_GetBuiltinName(__pyx_n_s_UserWarning); if (!__pyx_builtin_UserWarning) __PYX_ERR(0, 226, __pyx_L1_error)
  __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 229, __pyx_L1_error)
  __pyx_builtin_zip = __Pyx_GetBuiltinName(__pyx_n_s_zip); if (!__pyx_builtin_zip) __PYX_ERR(0, 358, __pyx_L1_error)
  __pyx_builtin_FutureWarning = __Pyx_GetBuiltinName(__pyx_n_s_FutureWarning); if (!__pyx_builtin_FutureWarning) __PYX_ERR(0, 600, __pyx_L1_error)
  __pyx_builtin_round = __Pyx_GetBuiltinName(__pyx_n_s_round); if (!__pyx_builtin_round) __PYX_ERR(0, 705, __pyx_L1_error)
  __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(0, 764, __pyx_L1_error)
  __pyx_builtin_AssertionError = __Pyx_GetBuiltinName(__pyx_n_s_AssertionError); if (!__pyx_builtin_AssertionError) __PYX_ERR(0, 764, __pyx_L1_error)
  return 0;
  __pyx_L1_error:;
  return -1;
}

static int __Pyx_InitCachedConstants(void) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);

  /* "rasterio/_base.pyx":69
 *         path, archive, scheme = parse_path(self.name)
 *         path = vsi_path(path, archive=archive, scheme=scheme)
 *         name_b = path.encode('utf-8')             # <<<<<<<<<<<<<<
 *         cdef const char *fname = name_b
 *         try:
 */
  __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_s_utf_8); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 69, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple_);
  __Pyx_GIVEREF(__pyx_tuple_);

  /* "rasterio/_base.pyx":72
 *         cdef const char *fname = name_b
 *         try:
 *             with CPLErrors() as cple:             # <<<<<<<<<<<<<<
 *                 self._hds = _gdal.GDALOpen(fname, 0)
 *                 cple.check()
 */
  __pyx_tuple__2 = PyTuple_Pack(3, Py_None, Py_None, Py_None); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 72, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__2);
  __Pyx_GIVEREF(__pyx_tuple__2);

  /* "rasterio/_base.pyx":103
 *         cdef void *hband = NULL
 *         try:
 *             with CPLErrors() as cple:             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *                 cple.check()
 */
  __pyx_tuple__3 = PyTuple_Pack(3, Py_None, Py_None, Py_None); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 103, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__3);
  __Pyx_GIVEREF(__pyx_tuple__3);

  /* "rasterio/_base.pyx":113
 *         cdef void *hband = NULL
 *         try:
 *             with CPLErrors() as cple:             # <<<<<<<<<<<<<<
 *                 hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *                 cple.check()
 */
  __pyx_tuple__4 = PyTuple_Pack(3, Py_None, Py_None, Py_None); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 113, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__4);
  __Pyx_GIVEREF(__pyx_tuple__4);

  /* "rasterio/_base.pyx":126
 *         cdef void *osr = NULL
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")             # <<<<<<<<<<<<<<
 *         crs = {}
 *         cdef const char * wkt = _gdal.GDALGetProjectionRef(self._hds)
 */
  __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_Null_dataset); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 126, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__5);
  __Pyx_GIVEREF(__pyx_tuple__5);

  /* "rasterio/_base.pyx":130
 *         cdef const char * wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:
 *             raise ValueError("Unexpected NULL spatial reference")             # <<<<<<<<<<<<<<
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:
 */
  __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_Unexpected_NULL_spatial_referenc); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 130, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__6);
  __Pyx_GIVEREF(__pyx_tuple__6);

  /* "rasterio/_base.pyx":135
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             if osr == NULL:
 *                 raise ValueError("Unexpected NULL spatial reference")             # <<<<<<<<<<<<<<
 *             log.debug("Got coordinate system")
 * 
 */
  __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_s_Unexpected_NULL_spatial_referenc); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 135, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__7);
  __Pyx_GIVEREF(__pyx_tuple__7);

  /* "rasterio/_base.pyx":136
 *             if osr == NULL:
 *                 raise ValueError("Unexpected NULL spatial reference")
 *             log.debug("Got coordinate system")             # <<<<<<<<<<<<<<
 * 
 *             retval = _gdal.OSRAutoIdentifyEPSG(osr)
 */
  __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_s_Got_coordinate_system); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 136, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__8);
  __Pyx_GIVEREF(__pyx_tuple__8);

  /* "rasterio/_base.pyx":155
 *                 _gdal.OSRExportToProj4(osr, &proj_c)
 *                 if proj_c == NULL:
 *                     raise ValueError("Unexpected Null spatial reference")             # <<<<<<<<<<<<<<
 *                 proj_b = proj_c
 *                 log.debug("Params: %s", proj_b)
 */
  __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_s_Unexpected_Null_spatial_referenc); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 155, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__9);
  __Pyx_GIVEREF(__pyx_tuple__9);

  /* "rasterio/_base.pyx":161
 *                 value = value.strip()
 *                 for param in value.split():
 *                     kv = param.split("=")             # <<<<<<<<<<<<<<
 *                     if len(kv) == 2:
 *                         k, v = kv
 */
  __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_s__10); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 161, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__11);
  __Pyx_GIVEREF(__pyx_tuple__11);

  /* "rasterio/_base.pyx":176
 *                         raise ValueError(
 *                             "Unexpected proj parameter %s" % param)
 *                     k = k.lstrip("+")             # <<<<<<<<<<<<<<
 *                     crs[k] = v
 * 
 */
  __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s__12); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 176, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__13);
  __Pyx_GIVEREF(__pyx_tuple__13);

  /* "rasterio/_base.pyx":182
 *             _gdal.OSRDestroySpatialReference(osr)
 *         else:
 *             log.debug("GDAL dataset has no projection.")             # <<<<<<<<<<<<<<
 *         return crs
 * 
 */
  __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_s_GDAL_dataset_has_no_projection); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(0, 182, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__14);
  __Pyx_GIVEREF(__pyx_tuple__14);

  /* "rasterio/_base.pyx":191
 *         cdef const char * wkt = NULL
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")             # <<<<<<<<<<<<<<
 *         wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:
 */
  __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_s_Null_dataset); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(0, 191, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__15);
  __Pyx_GIVEREF(__pyx_tuple__15);

  /* "rasterio/_base.pyx":194
 *         wkt = _gdal.GDALGetProjectionRef(self._hds)
 *         if wkt is NULL:
 *             raise ValueError("Unexpected NULL spatial reference")             # <<<<<<<<<<<<<<
 *         wkt_b = wkt
 *         if len(wkt_b) > 0:
 */
  __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_s_Unexpected_NULL_spatial_referenc); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(0, 194, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__16);
  __Pyx_GIVEREF(__pyx_tuple__16);

  /* "rasterio/_base.pyx":198
 *         if len(wkt_b) > 0:
 *             osr = _gdal.OSRNewSpatialReference(wkt)
 *             log.debug("Got coordinate system")             # <<<<<<<<<<<<<<
 *             if osr != NULL:
 *                 retval = _gdal.OSRAutoIdentifyEPSG(osr)
 */
  __pyx_tuple__17 = PyTuple_Pack(1, __pyx_kp_s_Got_coordinate_system); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(0, 198, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__17);
  __Pyx_GIVEREF(__pyx_tuple__17);

  /* "rasterio/_base.pyx":205
 *                 _gdal.OSRExportToWkt(osr, &proj_c)
 *                 if proj_c == NULL:
 *                     raise ValueError("Null projection")             # <<<<<<<<<<<<<<
 *                 proj_b = proj_c
 *                 crs_wkt = proj_b.decode('utf-8')
 */
  __pyx_tuple__18 = PyTuple_Pack(1, __pyx_kp_s_Null_projection); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(0, 205, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__18);
  __Pyx_GIVEREF(__pyx_tuple__18);

  /* "rasterio/_base.pyx":211
 *                 _gdal.OSRDestroySpatialReference(osr)
 *         else:
 *             log.debug("GDAL dataset has no projection.")             # <<<<<<<<<<<<<<
 *             crs_wkt = None
 *         return crs_wkt
 */
  __pyx_tuple__19 = PyTuple_Pack(1, __pyx_kp_s_GDAL_dataset_has_no_projection); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(0, 211, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__19);
  __Pyx_GIVEREF(__pyx_tuple__19);

  /* "rasterio/_base.pyx":217
 *     def read_transform(self):
 *         if self._hds == NULL:
 *             raise ValueError("Null dataset")             # <<<<<<<<<<<<<<
 *         cdef double gt[6]
 *         err = _gdal.GDALGetGeoTransform(self._hds, gt)
 */
  __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_s_Null_dataset); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(0, 217, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__20);
  __Pyx_GIVEREF(__pyx_tuple__20);

  /* "rasterio/_base.pyx":267
 *         if not self._count:
 *             if self._hds == NULL:
 *                 raise ValueError("Can't read closed raster file")             # <<<<<<<<<<<<<<
 *             self._count = _gdal.GDALGetRasterCount(self._hds)
 *         return self._count
 */
  __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_s_Can_t_read_closed_raster_file); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(0, 267, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__21);
  __Pyx_GIVEREF(__pyx_tuple__21);

  /* "rasterio/_base.pyx":281
 *         if not self._dtypes:
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 */
  __pyx_tuple__22 = PyTuple_Pack(1, __pyx_kp_s_can_t_read_closed_raster_file); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(0, 281, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__22);
  __Pyx_GIVEREF(__pyx_tuple__22);

  /* "rasterio/_base.pyx":299
 *         if self._block_shapes is None:
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *             self._block_shapes = []
 *             for i in range(self._count):
 */
  __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_s_can_t_read_closed_raster_file); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(0, 299, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__23);
  __Pyx_GIVEREF(__pyx_tuple__23);

  /* "rasterio/_base.pyx":304
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:
 *                     raise ValueError("Null band")             # <<<<<<<<<<<<<<
 *                 _gdal.GDALGetBlockSize(hband, &xsize, &ysize)
 *                 self._block_shapes.append((ysize, xsize))
 */
  __pyx_tuple__24 = PyTuple_Pack(1, __pyx_kp_s_Null_band); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(0, 304, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__24);
  __Pyx_GIVEREF(__pyx_tuple__24);

  /* "rasterio/_base.pyx":316
 *         if not self._nodatavals:
 *             if self._hds == NULL:
 *                 raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *             for i in range(self._count):
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 */
  __pyx_tuple__25 = PyTuple_Pack(1, __pyx_kp_s_can_t_read_closed_raster_file); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(0, 316, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__25);
  __Pyx_GIVEREF(__pyx_tuple__25);

  /* "rasterio/_base.pyx":320
 *                 hband = _gdal.GDALGetRasterBand(self._hds, i+1)
 *                 if hband == NULL:
 *                     raise ValueError("Null band")             # <<<<<<<<<<<<<<
 *                 dtype = dtypes.dtype_fwd[_gdal.GDALGetRasterDataType(hband)]
 *                 nodataval = _gdal.GDALGetRasterNoDataValue(hband, &success)
 */
  __pyx_tuple__26 = PyTuple_Pack(1, __pyx_kp_s_Null_band); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(0, 320, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__26);
  __Pyx_GIVEREF(__pyx_tuple__26);

  /* "rasterio/_base.pyx":386
 *         if bidx < 1:
 *             if len(set(block_shapes)) > 1:
 *                 raise ValueError(             # <<<<<<<<<<<<<<
 *                     "A band index must be provided when band block shapes"
 *                     "are inhomogeneous")
 */
  __pyx_tuple__27 = PyTuple_Pack(1, __pyx_kp_s_A_band_index_must_be_provided_wh); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(0, 386, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__27);
  __Pyx_GIVEREF(__pyx_tuple__27);

  /* "rasterio/_base.pyx":485
 *     @property
 *     def compression(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('COMPRESSION')             # <<<<<<<<<<<<<<
 *         if val:
 *             # 'YCbCr JPEG' will be normalized to 'JPEG'
 */
  __pyx_tuple__29 = PyTuple_Pack(1, __pyx_n_s_COMPRESSION); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(0, 485, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__29);
  __Pyx_GIVEREF(__pyx_tuple__29);

  /* "rasterio/_base.pyx":488
 *         if val:
 *             # 'YCbCr JPEG' will be normalized to 'JPEG'
 *             val = val.split(' ')[-1]             # <<<<<<<<<<<<<<
 *             return Compression(val)
 *         else:
 */
  __pyx_tuple__31 = PyTuple_Pack(1, __pyx_kp_s__30); if (unlikely(!__pyx_tuple__31)) __PYX_ERR(0, 488, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__31);
  __Pyx_GIVEREF(__pyx_tuple__31);

  /* "rasterio/_base.pyx":495
 *     @property
 *     def interleaving(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('INTERLEAVE')             # <<<<<<<<<<<<<<
 *         if val:
 *             return Interleaving(val)
 */
  __pyx_tuple__32 = PyTuple_Pack(1, __pyx_n_s_INTERLEAVE); if (unlikely(!__pyx_tuple__32)) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__32);
  __Pyx_GIVEREF(__pyx_tuple__32);

  /* "rasterio/_base.pyx":503
 *     @property
 *     def photometric(self):
 *         val = self.tags(ns='IMAGE_STRUCTURE').get('SOURCE_COLOR_SPACE')             # <<<<<<<<<<<<<<
 *         if val:
 *             return PhotometricInterp(val)
 */
  __pyx_tuple__33 = PyTuple_Pack(1, __pyx_n_s_SOURCE_COLOR_SPACE); if (unlikely(!__pyx_tuple__33)) __PYX_ERR(0, 503, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__33);
  __Pyx_GIVEREF(__pyx_tuple__33);

  /* "rasterio/_base.pyx":635
 *             hobj = self._hds
 *         if ns:
 *             domain_b = ns.encode('utf-8')             # <<<<<<<<<<<<<<
 *             domain_c = domain_b
 *         else:
 */
  __pyx_tuple__34 = PyTuple_Pack(1, __pyx_kp_s_utf_8); if (unlikely(!__pyx_tuple__34)) __PYX_ERR(0, 635, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__34);
  __Pyx_GIVEREF(__pyx_tuple__34);

  /* "rasterio/_base.pyx":646
 *             item_b = item_c
 *             item = item_b.decode('utf-8')
 *             key, value = item.split('=', 1)             # <<<<<<<<<<<<<<
 *             retval[key] = value
 *         return retval
 */
  __pyx_tuple__35 = PyTuple_Pack(2, __pyx_kp_s__10, __pyx_int_1); if (unlikely(!__pyx_tuple__35)) __PYX_ERR(0, 646, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__35);
  __Pyx_GIVEREF(__pyx_tuple__35);

  /* "rasterio/_base.pyx":655
 * 
 *         if self._hds == NULL:
 *           raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")
 */
  __pyx_tuple__36 = PyTuple_Pack(1, __pyx_kp_s_can_t_read_closed_raster_file); if (unlikely(!__pyx_tuple__36)) __PYX_ERR(0, 655, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__36);
  __Pyx_GIVEREF(__pyx_tuple__36);

  /* "rasterio/_base.pyx":657
 *           raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")             # <<<<<<<<<<<<<<
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:
 */
  __pyx_tuple__37 = PyTuple_Pack(1, __pyx_kp_s_Invalid_band_index); if (unlikely(!__pyx_tuple__37)) __PYX_ERR(0, 657, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__37);
  __Pyx_GIVEREF(__pyx_tuple__37);

  /* "rasterio/_base.pyx":660
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:
 *             raise ValueError("NULL band")             # <<<<<<<<<<<<<<
 *         value = _gdal.GDALGetRasterColorInterpretation(hBand)
 *         return ColorInterp(value)
 */
  __pyx_tuple__38 = PyTuple_Pack(1, __pyx_kp_s_NULL_band); if (unlikely(!__pyx_tuple__38)) __PYX_ERR(0, 660, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__38);
  __Pyx_GIVEREF(__pyx_tuple__38);

  /* "rasterio/_base.pyx":671
 *         cdef const _gdal.GDALColorEntry * color
 *         if self._hds == NULL:
 *             raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")
 */
  __pyx_tuple__39 = PyTuple_Pack(1, __pyx_kp_s_can_t_read_closed_raster_file); if (unlikely(!__pyx_tuple__39)) __PYX_ERR(0, 671, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__39);
  __Pyx_GIVEREF(__pyx_tuple__39);

  /* "rasterio/_base.pyx":673
 *             raise ValueError("can't read closed raster file")
 *         if bidx not in self.indexes:
 *             raise ValueError("Invalid band index")             # <<<<<<<<<<<<<<
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:
 */
  __pyx_tuple__40 = PyTuple_Pack(1, __pyx_kp_s_Invalid_band_index); if (unlikely(!__pyx_tuple__40)) __PYX_ERR(0, 673, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__40);
  __Pyx_GIVEREF(__pyx_tuple__40);

  /* "rasterio/_base.pyx":676
 *         hBand = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hBand == NULL:
 *             raise ValueError("NULL band")             # <<<<<<<<<<<<<<
 *         hTable = _gdal.GDALGetRasterColorTable(hBand)
 *         if hTable == NULL:
 */
  __pyx_tuple__41 = PyTuple_Pack(1, __pyx_kp_s_NULL_band); if (unlikely(!__pyx_tuple__41)) __PYX_ERR(0, 676, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__41);
  __Pyx_GIVEREF(__pyx_tuple__41);

  /* "rasterio/_base.pyx":679
 *         hTable = _gdal.GDALGetRasterColorTable(hBand)
 *         if hTable == NULL:
 *             raise ValueError("NULL color table")             # <<<<<<<<<<<<<<
 *         retval = {}
 * 
 */
  __pyx_tuple__42 = PyTuple_Pack(1, __pyx_kp_s_NULL_color_table); if (unlikely(!__pyx_tuple__42)) __PYX_ERR(0, 679, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__42);
  __Pyx_GIVEREF(__pyx_tuple__42);

  /* "rasterio/_base.pyx":725
 *         cdef int xoff, yoff, width, height
 *         if self._hds == NULL:
 *             raise ValueError("can't read closed raster file")             # <<<<<<<<<<<<<<
 *         hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hband == NULL:
 */
  __pyx_tuple__43 = PyTuple_Pack(1, __pyx_kp_s_can_t_read_closed_raster_file); if (unlikely(!__pyx_tuple__43)) __PYX_ERR(0, 725, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__43);
  __Pyx_GIVEREF(__pyx_tuple__43);

  /* "rasterio/_base.pyx":728
 *         hband = _gdal.GDALGetRasterBand(self._hds, bidx)
 *         if hband == NULL:
 *             raise ValueError("NULL band")             # <<<<<<<<<<<<<<
 *         if not window:
 *             xoff = yoff = 0
 */
  __pyx_tuple__44 = PyTuple_Pack(1, __pyx_kp_s_NULL_band); if (unlikely(!__pyx_tuple__44)) __PYX_ERR(0, 728, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__44);
  __Pyx_GIVEREF(__pyx_tuple__44);

  /* "rasterio/_base.pyx":765
 *         assert len(c) == 2
 *     except (ValueError, TypeError, AssertionError):
 *         raise ValueError("invalid window structure; expecting "             # <<<<<<<<<<<<<<
 *                          "((row_start, row_stop), (col_start, col_stop))")
 *     r_start = r[0] or 0
 */
  __pyx_tuple__45 = PyTuple_Pack(1, __pyx_kp_s_invalid_window_structure_expecti); if (unlikely(!__pyx_tuple__45)) __PYX_ERR(0, 765, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__45);
  __Pyx_GIVEREF(__pyx_tuple__45);

  /* "rasterio/_base.pyx":825
 *     # and sign determined by the op function: positive for floor, negative
 *     # for ceil.
 *     eps = 10.0**-precision * (1.0 - 2.0*op(0.1))             # <<<<<<<<<<<<<<
 *     row = int(op((y - eps - affine[5]) / affine[4]))
 *     col = int(op((x + eps - affine[2]) / affine[0]))
 */
  __pyx_tuple__47 = PyTuple_Pack(1, __pyx_float_0_1); if (unlikely(!__pyx_tuple__47)) __PYX_ERR(0, 825, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__47);
  __Pyx_GIVEREF(__pyx_tuple__47);

  /* "rasterio/_base.pyx":886
 *     if isinstance(crs, dict):
 *         # EPSG is a special case.
 *         init = crs.get('init')             # <<<<<<<<<<<<<<
 *         if init:
 *             auth, val = init.split(':')
 */
  __pyx_tuple__48 = PyTuple_Pack(1, __pyx_n_s_init); if (unlikely(!__pyx_tuple__48)) __PYX_ERR(0, 886, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__48);
  __Pyx_GIVEREF(__pyx_tuple__48);

  /* "rasterio/_base.pyx":888
 *         init = crs.get('init')
 *         if init:
 *             auth, val = init.split(':')             # <<<<<<<<<<<<<<
 *             if auth.upper() == 'EPSG':
 *                 _gdal.OSRImportFromEPSG(osr, int(val))
 */
  __pyx_tuple__50 = PyTuple_Pack(1, __pyx_kp_s__49); if (unlikely(!__pyx_tuple__50)) __PYX_ERR(0, 888, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__50);
  __Pyx_GIVEREF(__pyx_tuple__50);

  /* "rasterio/_base.pyx":900
 *             proj = " ".join(params)
 *             log.debug("PROJ.4 to be imported: %r", proj)
 *             proj_b = proj.encode('utf-8')             # <<<<<<<<<<<<<<
 *             proj_c = proj_b
 *             _gdal.OSRImportFromProj4(osr, proj_c)
 */
  __pyx_tuple__51 = PyTuple_Pack(1, __pyx_kp_s_utf_8); if (unlikely(!__pyx_tuple__51)) __PYX_ERR(0, 900, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__51);
  __Pyx_GIVEREF(__pyx_tuple__51);

  /* "rasterio/_base.pyx":905
 *     # Fall back for CRS strings like "EPSG:3857."
 *     else:
 *         proj_b = crs.encode('utf-8')             # <<<<<<<<<<<<<<
 *         proj_c = proj_b
 *         _gdal.OSRSetFromUserInput(osr, proj_c)
 */
  __pyx_tuple__52 = PyTuple_Pack(1, __pyx_kp_s_utf_8); if (unlikely(!__pyx_tuple__52)) __PYX_ERR(0, 905, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__52);
  __Pyx_GIVEREF(__pyx_tuple__52);

  /* "rasterio/_base.pyx":940
 * 
 *     try:
 *         with CPLErrors() as cple:             # <<<<<<<<<<<<<<
 *             transform = _gdal.OCTNewCoordinateTransformation(src, dst)
 *             cple.check()
 */
  __pyx_tuple__53 = PyTuple_Pack(3, Py_None, Py_None, Py_None); if (unlikely(!__pyx_tuple__53)) __PYX_ERR(0, 940, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__53);
  __Pyx_GIVEREF(__pyx_tuple__53);

  /* "rasterio/_base.pyx":30
 * 
 * 
 * def check_gdal_version(major, minor):             # <<<<<<<<<<<<<<
 *     """Return True if the major and minor versions match."""
 *     return bool(_gdal.GDALCheckVersion(int(major), int(minor), NULL))
 */
  __pyx_tuple__54 = PyTuple_Pack(2, __pyx_n_s_major, __pyx_n_s_minor); if (unlikely(!__pyx_tuple__54)) __PYX_ERR(0, 30, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__54);
  __Pyx_GIVEREF(__pyx_tuple__54);
  __pyx_codeobj__55 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__54, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_sean_code_frs_wheel_build, __pyx_n_s_check_gdal_version, 30, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__55)) __PYX_ERR(0, 30, __pyx_L1_error)

  /* "rasterio/_base.pyx":35
 * 
 * 
 * def gdal_version():             # <<<<<<<<<<<<<<
 *     """Return the version as a major.minor.patchlevel string."""
 *     cdef const char *ver_c = NULL
 */
  __pyx_tuple__56 = PyTuple_Pack(2, __pyx_n_s_ver_c, __pyx_n_s_ver_b); if (unlikely(!__pyx_tuple__56)) __PYX_ERR(0, 35, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__56);
  __Pyx_GIVEREF(__pyx_tuple__56);
  __pyx_codeobj__57 = (PyObject*)__Pyx_PyCode_New(0, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__56, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_sean_code_frs_wheel_build, __pyx_n_s_gdal_version, 35, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__57)) __PYX_ERR(0, 35, __pyx_L1_error)

  /* "rasterio/_base.pyx":796
 * 
 * 
 * def get_index(x, y, affine, op=math.floor, precision=6):             # <<<<<<<<<<<<<<
 *     """
 *     Returns the (row, col) index of the pixel containing (x, y) given a
 */
  __pyx_tuple__58 = PyTuple_Pack(8, __pyx_n_s_x, __pyx_n_s_y, __pyx_n_s_affine, __pyx_n_s_op, __pyx_n_s_precision, __pyx_n_s_eps, __pyx_n_s_row, __pyx_n_s_col); if (unlikely(!__pyx_tuple__58)) __PYX_ERR(0, 796, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__58);
  __Pyx_GIVEREF(__pyx_tuple__58);
  __pyx_codeobj__59 = (PyObject*)__Pyx_PyCode_New(5, 0, 8, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__58, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_sean_code_frs_wheel_build, __pyx_n_s_get_index, 796, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__59)) __PYX_ERR(0, 796, __pyx_L1_error)

  /* "rasterio/_base.pyx":831
 * 
 * 
 * def get_window(left, bottom, right, top, affine, precision=6):             # <<<<<<<<<<<<<<
 *     """
 *     Returns a window tuple given coordinate bounds and the coordinate reference
 */
  __pyx_tuple__60 = PyTuple_Pack(9, __pyx_n_s_left, __pyx_n_s_bottom, __pyx_n_s_right, __pyx_n_s_top, __pyx_n_s_affine, __pyx_n_s_precision, __pyx_n_s_window_start, __pyx_n_s_window_stop, __pyx_n_s_window); if (unlikely(!__pyx_tuple__60)) __PYX_ERR(0, 831, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__60);
  __Pyx_GIVEREF(__pyx_tuple__60);
  __pyx_codeobj__61 = (PyObject*)__Pyx_PyCode_New(6, 0, 9, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__60, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_sean_code_frs_wheel_build, __pyx_n_s_get_window, 831, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__61)) __PYX_ERR(0, 831, __pyx_L1_error)

  /* "rasterio/_base.pyx":859
 * 
 * 
 * def window_shape(window, height=-1, width=-1):             # <<<<<<<<<<<<<<
 *     """Returns shape of a window.
 * 
 */
  __pyx_tuple__62 = PyTuple_Pack(7, __pyx_n_s_window, __pyx_n_s_height, __pyx_n_s_width, __pyx_n_s_a, __pyx_n_s_b, __pyx_n_s_c, __pyx_n_s_d); if (unlikely(!__pyx_tuple__62)) __PYX_ERR(0, 859, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__62);
  __Pyx_GIVEREF(__pyx_tuple__62);
  __pyx_codeobj__63 = (PyObject*)__Pyx_PyCode_New(3, 0, 7, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__62, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_sean_code_frs_wheel_build, __pyx_n_s_window_shape, 859, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__63)) __PYX_ERR(0, 859, __pyx_L1_error)

  /* "rasterio/_base.pyx":869
 * 
 * 
 * def window_index(window):             # <<<<<<<<<<<<<<
 *     return tuple(slice(*w) for w in window)
 * 
 */
  __pyx_tuple__64 = PyTuple_Pack(3, __pyx_n_s_window, __pyx_n_s_genexpr, __pyx_n_s_genexpr); if (unlikely(!__pyx_tuple__64)) __PYX_ERR(0, 869, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__64);
  __Pyx_GIVEREF(__pyx_tuple__64);
  __pyx_codeobj__65 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__64, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_sean_code_frs_wheel_build, __pyx_n_s_window_index, 869, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__65)) __PYX_ERR(0, 869, __pyx_L1_error)

  /* "rasterio/_base.pyx":873
 * 
 * 
 * def tastes_like_gdal(t):             # <<<<<<<<<<<<<<
 *     return t[2] == t[4] == 0.0 and t[1] > 0 and t[5] < 0
 * 
 */
  __pyx_tuple__66 = PyTuple_Pack(1, __pyx_n_s_t); if (unlikely(!__pyx_tuple__66)) __PYX_ERR(0, 873, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__66);
  __Pyx_GIVEREF(__pyx_tuple__66);
  __pyx_codeobj__67 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__66, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_sean_code_frs_wheel_build, __pyx_n_s_tastes_like_gdal, 873, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__67)) __PYX_ERR(0, 873, __pyx_L1_error)

  /* "rasterio/_base.pyx":911
 * 
 * 
 * def _transform(src_crs, dst_crs, xs, ys, zs):             # <<<<<<<<<<<<<<
 *     cdef double *x = NULL
 *     cdef double *y = NULL
 */
  __pyx_tuple__68 = PyTuple_Pack(21, __pyx_n_s_src_crs, __pyx_n_s_dst_crs, __pyx_n_s_xs, __pyx_n_s_ys, __pyx_n_s_zs, __pyx_n_s_x, __pyx_n_s_y, __pyx_n_s_z, __pyx_n_s_proj_c, __pyx_n_s_src, __pyx_n_s_dst, __pyx_n_s_transform, __pyx_n_s_i, __pyx_n_s_n, __pyx_n_s_cple, __pyx_n_s_res, __pyx_n_s_res_xs, __pyx_n_s_res_ys, __pyx_n_s_res_zs, __pyx_n_s_retval, __pyx_n_s_err); if (unlikely(!__pyx_tuple__68)) __PYX_ERR(0, 911, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__68);
  __Pyx_GIVEREF(__pyx_tuple__68);
  __pyx_codeobj__69 = (PyObject*)__Pyx_PyCode_New(5, 0, 21, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__68, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_sean_code_frs_wheel_build, __pyx_n_s_transform_2, 911, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__69)) __PYX_ERR(0, 911, __pyx_L1_error)

  /* "rasterio/_base.pyx":968
 * 
 * 
 * def is_geographic_crs(crs):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsGeographic(osr_crs)
 */
  __pyx_tuple__70 = PyTuple_Pack(3, __pyx_n_s_crs, __pyx_n_s_osr_crs, __pyx_n_s_retval); if (unlikely(!__pyx_tuple__70)) __PYX_ERR(0, 968, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__70);
  __Pyx_GIVEREF(__pyx_tuple__70);
  __pyx_codeobj__71 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__70, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_sean_code_frs_wheel_build, __pyx_n_s_is_geographic_crs, 968, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__71)) __PYX_ERR(0, 968, __pyx_L1_error)

  /* "rasterio/_base.pyx":975
 * 
 * 
 * def is_projected_crs(crs):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsProjected(osr_crs)
 */
  __pyx_tuple__72 = PyTuple_Pack(3, __pyx_n_s_crs, __pyx_n_s_osr_crs, __pyx_n_s_retval); if (unlikely(!__pyx_tuple__72)) __PYX_ERR(0, 975, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__72);
  __Pyx_GIVEREF(__pyx_tuple__72);
  __pyx_codeobj__73 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__72, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_sean_code_frs_wheel_build, __pyx_n_s_is_projected_crs, 975, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__73)) __PYX_ERR(0, 975, __pyx_L1_error)

  /* "rasterio/_base.pyx":982
 * 
 * 
 * def is_same_crs(crs1, crs2):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs1 = _osr_from_crs(crs1)
 *     cdef void *osr_crs2 = _osr_from_crs(crs2)
 */
  __pyx_tuple__74 = PyTuple_Pack(5, __pyx_n_s_crs1, __pyx_n_s_crs2, __pyx_n_s_osr_crs1, __pyx_n_s_osr_crs2, __pyx_n_s_retval); if (unlikely(!__pyx_tuple__74)) __PYX_ERR(0, 982, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__74);
  __Pyx_GIVEREF(__pyx_tuple__74);
  __pyx_codeobj__75 = (PyObject*)__Pyx_PyCode_New(2, 0, 5, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__74, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_sean_code_frs_wheel_build, __pyx_n_s_is_same_crs, 982, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__75)) __PYX_ERR(0, 982, __pyx_L1_error)
  __Pyx_RefNannyFinishContext();
  return 0;
  __pyx_L1_error:;
  __Pyx_RefNannyFinishContext();
  return -1;
}

static int __Pyx_InitGlobals(void) {
  __pyx_umethod_PyList_Type_pop.type = (PyObject*)&PyList_Type;
  if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error);
  __pyx_float_0_0 = PyFloat_FromDouble(0.0); if (unlikely(!__pyx_float_0_0)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_float_0_1 = PyFloat_FromDouble(0.1); if (unlikely(!__pyx_float_0_1)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_float_1_0 = PyFloat_FromDouble(1.0); if (unlikely(!__pyx_float_1_0)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_float_2_0 = PyFloat_FromDouble(2.0); if (unlikely(!__pyx_float_2_0)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_float_10_0 = PyFloat_FromDouble(10.0); if (unlikely(!__pyx_float_10_0)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_int_6 = PyInt_FromLong(6); if (unlikely(!__pyx_int_6)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) __PYX_ERR(0, 1, __pyx_L1_error)
  return 0;
  __pyx_L1_error:;
  return -1;
}

#if PY_MAJOR_VERSION < 3
PyMODINIT_FUNC init_base(void); /*proto*/
PyMODINIT_FUNC init_base(void)
#else
PyMODINIT_FUNC PyInit__base(void); /*proto*/
PyMODINIT_FUNC PyInit__base(void)
#endif
{
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannyDeclarations
  #if CYTHON_REFNANNY
  __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny");
  if (!__Pyx_RefNanny) {
      PyErr_Clear();
      __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny");
      if (!__Pyx_RefNanny)
          Py_FatalError("failed to import 'refnanny' module");
  }
  #endif
  __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__base(void)", 0);
  if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error)
  #ifdef __Pyx_CyFunction_USED
  if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  #endif
  #ifdef __Pyx_FusedFunction_USED
  if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  #endif
  #ifdef __Pyx_Coroutine_USED
  if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  #endif
  #ifdef __Pyx_Generator_USED
  if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  #endif
  #ifdef __Pyx_StopAsyncIteration_USED
  if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  #endif
  /*--- Library function declarations ---*/
  /*--- Threads initialization code ---*/
  #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS
  #ifdef WITH_THREAD /* Python build with threading support? */
  PyEval_InitThreads();
  #endif
  #endif
  /*--- Module creation code ---*/
  #if PY_MAJOR_VERSION < 3
  __pyx_m = Py_InitModule4("_base", __pyx_methods, __pyx_k_Numpy_free_base_classes, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
  #else
  __pyx_m = PyModule_Create(&__pyx_moduledef);
  #endif
  if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error)
  Py_INCREF(__pyx_d);
  __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error)
  #if CYTHON_COMPILING_IN_PYPY
  Py_INCREF(__pyx_b);
  #endif
  if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error);
  /*--- Initialize various global constants etc. ---*/
  if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
  if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  #endif
  if (__pyx_module_is_main_rasterio___base) {
    if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  }
  #if PY_MAJOR_VERSION >= 3
  {
    PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error)
    if (!PyDict_GetItemString(modules, "rasterio._base")) {
      if (unlikely(PyDict_SetItemString(modules, "rasterio._base", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error)
    }
  }
  #endif
  /*--- Builtin init code ---*/
  if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  /*--- Constants init code ---*/
  if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  /*--- Global init code ---*/
  /*--- Variable export code ---*/
  /*--- Function export code ---*/
  if (__Pyx_ExportFunction("_osr_from_crs", (void (*)(void))__pyx_f_8rasterio_5_base__osr_from_crs, "void *(PyObject *)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  /*--- Type init code ---*/
  __pyx_vtabptr_8rasterio_5_base_DatasetReader = &__pyx_vtable_8rasterio_5_base_DatasetReader;
  __pyx_vtable_8rasterio_5_base_DatasetReader.band = (void *(*)(struct __pyx_obj_8rasterio_5_base_DatasetReader *, int))__pyx_f_8rasterio_5_base_13DatasetReader_band;
  if (PyType_Ready(&__pyx_type_8rasterio_5_base_DatasetReader) < 0) __PYX_ERR(0, 43, __pyx_L1_error)
  __pyx_type_8rasterio_5_base_DatasetReader.tp_print = 0;
  if (__Pyx_SetVtable(__pyx_type_8rasterio_5_base_DatasetReader.tp_dict, __pyx_vtabptr_8rasterio_5_base_DatasetReader) < 0) __PYX_ERR(0, 43, __pyx_L1_error)
  if (PyObject_SetAttrString(__pyx_m, "DatasetReader", (PyObject *)&__pyx_type_8rasterio_5_base_DatasetReader) < 0) __PYX_ERR(0, 43, __pyx_L1_error)
  __pyx_ptype_8rasterio_5_base_DatasetReader = &__pyx_type_8rasterio_5_base_DatasetReader;
  if (PyType_Ready(&__pyx_type_8rasterio_5_base___pyx_scope_struct__block_windows) < 0) __PYX_ERR(0, 363, __pyx_L1_error)
  __pyx_type_8rasterio_5_base___pyx_scope_struct__block_windows.tp_print = 0;
  __pyx_ptype_8rasterio_5_base___pyx_scope_struct__block_windows = &__pyx_type_8rasterio_5_base___pyx_scope_struct__block_windows;
  if (PyType_Ready(&__pyx_type_8rasterio_5_base___pyx_scope_struct_1___get__) < 0) __PYX_ERR(0, 521, __pyx_L1_error)
  __pyx_type_8rasterio_5_base___pyx_scope_struct_1___get__.tp_print = 0;
  __pyx_ptype_8rasterio_5_base___pyx_scope_struct_1___get__ = &__pyx_type_8rasterio_5_base___pyx_scope_struct_1___get__;
  if (PyType_Ready(&__pyx_type_8rasterio_5_base___pyx_scope_struct_2_genexpr) < 0) __PYX_ERR(0, 523, __pyx_L1_error)
  __pyx_type_8rasterio_5_base___pyx_scope_struct_2_genexpr.tp_print = 0;
  __pyx_ptype_8rasterio_5_base___pyx_scope_struct_2_genexpr = &__pyx_type_8rasterio_5_base___pyx_scope_struct_2_genexpr;
  if (PyType_Ready(&__pyx_type_8rasterio_5_base___pyx_scope_struct_3_window_index) < 0) __PYX_ERR(0, 869, __pyx_L1_error)
  __pyx_type_8rasterio_5_base___pyx_scope_struct_3_window_index.tp_print = 0;
  __pyx_ptype_8rasterio_5_base___pyx_scope_struct_3_window_index = &__pyx_type_8rasterio_5_base___pyx_scope_struct_3_window_index;
  if (PyType_Ready(&__pyx_type_8rasterio_5_base___pyx_scope_struct_4_genexpr) < 0) __PYX_ERR(0, 870, __pyx_L1_error)
  __pyx_type_8rasterio_5_base___pyx_scope_struct_4_genexpr.tp_print = 0;
  __pyx_ptype_8rasterio_5_base___pyx_scope_struct_4_genexpr = &__pyx_type_8rasterio_5_base___pyx_scope_struct_4_genexpr;
  /*--- Type import code ---*/
  /*--- Variable import code ---*/
  /*--- Function import code ---*/
  /*--- Execution code ---*/
  #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
  if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  #endif

  /* "rasterio/_base.pyx":6
 * from __future__ import absolute_import
 * 
 * import logging             # <<<<<<<<<<<<<<
 * import math
 * import os
 */
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_logging, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 6, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_logging, __pyx_t_1) < 0) __PYX_ERR(0, 6, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":7
 * 
 * import logging
 * import math             # <<<<<<<<<<<<<<
 * import os
 * import sys
 */
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_math, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 7, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_math, __pyx_t_1) < 0) __PYX_ERR(0, 7, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":8
 * import logging
 * import math
 * import os             # <<<<<<<<<<<<<<
 * import sys
 * import warnings
 */
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_os, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 8, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_os, __pyx_t_1) < 0) __PYX_ERR(0, 8, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":9
 * import math
 * import os
 * import sys             # <<<<<<<<<<<<<<
 * import warnings
 * 
 */
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_sys, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 9, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_sys, __pyx_t_1) < 0) __PYX_ERR(0, 9, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":10
 * import os
 * import sys
 * import warnings             # <<<<<<<<<<<<<<
 * 
 * from libc.stdlib cimport malloc, free
 */
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_warnings, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 10, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_warnings, __pyx_t_1) < 0) __PYX_ERR(0, 10, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":16
 * from rasterio cimport _gdal, _ogr
 * from rasterio._err import (
 *     CPLErrors, GDALError, CPLE_IllegalArg, CPLE_OpenFailed, CPLE_NotSupported)             # <<<<<<<<<<<<<<
 * from rasterio import dtypes
 * from rasterio.coords import BoundingBox
 */
  __pyx_t_1 = PyList_New(5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_CPLErrors);
  __Pyx_GIVEREF(__pyx_n_s_CPLErrors);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_CPLErrors);
  __Pyx_INCREF(__pyx_n_s_GDALError);
  __Pyx_GIVEREF(__pyx_n_s_GDALError);
  PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_GDALError);
  __Pyx_INCREF(__pyx_n_s_CPLE_IllegalArg);
  __Pyx_GIVEREF(__pyx_n_s_CPLE_IllegalArg);
  PyList_SET_ITEM(__pyx_t_1, 2, __pyx_n_s_CPLE_IllegalArg);
  __Pyx_INCREF(__pyx_n_s_CPLE_OpenFailed);
  __Pyx_GIVEREF(__pyx_n_s_CPLE_OpenFailed);
  PyList_SET_ITEM(__pyx_t_1, 3, __pyx_n_s_CPLE_OpenFailed);
  __Pyx_INCREF(__pyx_n_s_CPLE_NotSupported);
  __Pyx_GIVEREF(__pyx_n_s_CPLE_NotSupported);
  PyList_SET_ITEM(__pyx_t_1, 4, __pyx_n_s_CPLE_NotSupported);

  /* "rasterio/_base.pyx":15
 * 
 * from rasterio cimport _gdal, _ogr
 * from rasterio._err import (             # <<<<<<<<<<<<<<
 *     CPLErrors, GDALError, CPLE_IllegalArg, CPLE_OpenFailed, CPLE_NotSupported)
 * from rasterio import dtypes
 */
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_rasterio__err, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 15, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_CPLErrors); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_CPLErrors, __pyx_t_1) < 0) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_GDALError); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_GDALError, __pyx_t_1) < 0) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_CPLE_IllegalArg); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_CPLE_IllegalArg, __pyx_t_1) < 0) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_CPLE_OpenFailed); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_CPLE_OpenFailed, __pyx_t_1) < 0) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_CPLE_NotSupported); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_CPLE_NotSupported, __pyx_t_1) < 0) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":17
 * from rasterio._err import (
 *     CPLErrors, GDALError, CPLE_IllegalArg, CPLE_OpenFailed, CPLE_NotSupported)
 * from rasterio import dtypes             # <<<<<<<<<<<<<<
 * from rasterio.coords import BoundingBox
 * from rasterio.enums import (
 */
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 17, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_dtypes);
  __Pyx_GIVEREF(__pyx_n_s_dtypes);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_dtypes);
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_rasterio, __pyx_t_2, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 17, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_dtypes); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 17, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_dtypes, __pyx_t_2) < 0) __PYX_ERR(0, 17, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":18
 *     CPLErrors, GDALError, CPLE_IllegalArg, CPLE_OpenFailed, CPLE_NotSupported)
 * from rasterio import dtypes
 * from rasterio.coords import BoundingBox             # <<<<<<<<<<<<<<
 * from rasterio.enums import (
 *     ColorInterp, Compression, Interleaving, PhotometricInterp)
 */
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_BoundingBox);
  __Pyx_GIVEREF(__pyx_n_s_BoundingBox);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_BoundingBox);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_rasterio_coords, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_BoundingBox); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_BoundingBox, __pyx_t_1) < 0) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":20
 * from rasterio.coords import BoundingBox
 * from rasterio.enums import (
 *     ColorInterp, Compression, Interleaving, PhotometricInterp)             # <<<<<<<<<<<<<<
 * from rasterio.env import Env
 * from rasterio.errors import RasterioIOError, CRSError
 */
  __pyx_t_2 = PyList_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 20, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_ColorInterp);
  __Pyx_GIVEREF(__pyx_n_s_ColorInterp);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_ColorInterp);
  __Pyx_INCREF(__pyx_n_s_Compression);
  __Pyx_GIVEREF(__pyx_n_s_Compression);
  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_Compression);
  __Pyx_INCREF(__pyx_n_s_Interleaving);
  __Pyx_GIVEREF(__pyx_n_s_Interleaving);
  PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_Interleaving);
  __Pyx_INCREF(__pyx_n_s_PhotometricInterp);
  __Pyx_GIVEREF(__pyx_n_s_PhotometricInterp);
  PyList_SET_ITEM(__pyx_t_2, 3, __pyx_n_s_PhotometricInterp);

  /* "rasterio/_base.pyx":19
 * from rasterio import dtypes
 * from rasterio.coords import BoundingBox
 * from rasterio.enums import (             # <<<<<<<<<<<<<<
 *     ColorInterp, Compression, Interleaving, PhotometricInterp)
 * from rasterio.env import Env
 */
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_rasterio_enums, __pyx_t_2, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_ColorInterp); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ColorInterp, __pyx_t_2) < 0) __PYX_ERR(0, 20, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_Compression); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Compression, __pyx_t_2) < 0) __PYX_ERR(0, 20, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_Interleaving); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Interleaving, __pyx_t_2) < 0) __PYX_ERR(0, 20, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_PhotometricInterp); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_PhotometricInterp, __pyx_t_2) < 0) __PYX_ERR(0, 20, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":21
 * from rasterio.enums import (
 *     ColorInterp, Compression, Interleaving, PhotometricInterp)
 * from rasterio.env import Env             # <<<<<<<<<<<<<<
 * from rasterio.errors import RasterioIOError, CRSError
 * from rasterio.transform import Affine
 */
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 21, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_Env);
  __Pyx_GIVEREF(__pyx_n_s_Env);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_Env);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_rasterio_env, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 21, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_Env); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 21, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Env, __pyx_t_1) < 0) __PYX_ERR(0, 21, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":22
 *     ColorInterp, Compression, Interleaving, PhotometricInterp)
 * from rasterio.env import Env
 * from rasterio.errors import RasterioIOError, CRSError             # <<<<<<<<<<<<<<
 * from rasterio.transform import Affine
 * from rasterio.vfs import parse_path, vsi_path
 */
  __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 22, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_RasterioIOError);
  __Pyx_GIVEREF(__pyx_n_s_RasterioIOError);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_RasterioIOError);
  __Pyx_INCREF(__pyx_n_s_CRSError);
  __Pyx_GIVEREF(__pyx_n_s_CRSError);
  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_CRSError);
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_rasterio_errors, __pyx_t_2, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 22, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_RasterioIOError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 22, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_RasterioIOError, __pyx_t_2) < 0) __PYX_ERR(0, 22, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_CRSError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 22, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_CRSError, __pyx_t_2) < 0) __PYX_ERR(0, 22, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":23
 * from rasterio.env import Env
 * from rasterio.errors import RasterioIOError, CRSError
 * from rasterio.transform import Affine             # <<<<<<<<<<<<<<
 * from rasterio.vfs import parse_path, vsi_path
 * 
 */
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 23, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_Affine);
  __Pyx_GIVEREF(__pyx_n_s_Affine);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_Affine);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_rasterio_transform, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 23, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_Affine); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 23, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Affine, __pyx_t_1) < 0) __PYX_ERR(0, 23, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "rasterio/_base.pyx":24
 * from rasterio.errors import RasterioIOError, CRSError
 * from rasterio.transform import Affine
 * from rasterio.vfs import parse_path, vsi_path             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_parse_path);
  __Pyx_GIVEREF(__pyx_n_s_parse_path);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_parse_path);
  __Pyx_INCREF(__pyx_n_s_vsi_path);
  __Pyx_GIVEREF(__pyx_n_s_vsi_path);
  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_vsi_path);
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_rasterio_vfs, __pyx_t_2, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_parse_path); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_parse_path, __pyx_t_2) < 0) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_vsi_path); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_vsi_path, __pyx_t_2) < 0) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":27
 * 
 * 
 * log = logging.getLogger(__name__)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_logging); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 27, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_getLogger); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 27, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_name_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 27, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  if (!__pyx_t_4) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 27, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 27, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL;
    __Pyx_GIVEREF(__pyx_t_2);
    PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_2);
    __pyx_t_2 = 0;
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 27, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  }
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_log, __pyx_t_1) < 0) __PYX_ERR(0, 27, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":30
 * 
 * 
 * def check_gdal_version(major, minor):             # <<<<<<<<<<<<<<
 *     """Return True if the major and minor versions match."""
 *     return bool(_gdal.GDALCheckVersion(int(major), int(minor), NULL))
 */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_1check_gdal_version, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 30, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_check_gdal_version, __pyx_t_1) < 0) __PYX_ERR(0, 30, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":35
 * 
 * 
 * def gdal_version():             # <<<<<<<<<<<<<<
 *     """Return the version as a major.minor.patchlevel string."""
 *     cdef const char *ver_c = NULL
 */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_3gdal_version, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_gdal_version, __pyx_t_1) < 0) __PYX_ERR(0, 35, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":436
 *         return c+a*col, f+e*row
 * 
 *     def index(self, x, y, op=math.floor, precision=6):             # <<<<<<<<<<<<<<
 *         """Returns the (row, col) index of the pixel containing (x, y)."""
 *         return get_index(x, y, self.affine, op=op, precision=precision)
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_math); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 436, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_floor); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 436, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_k__28 = __pyx_t_3;
  __Pyx_GIVEREF(__pyx_t_3);
  __pyx_t_3 = 0;

  /* "rasterio/_base.pyx":796
 * 
 * 
 * def get_index(x, y, affine, op=math.floor, precision=6):             # <<<<<<<<<<<<<<
 *     """
 *     Returns the (row, col) index of the pixel containing (x, y) given a
 */
  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_math); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 796, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_floor); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 796, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_k__46 = __pyx_t_1;
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_9get_index, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 796, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_index, __pyx_t_1) < 0) __PYX_ERR(0, 796, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":831
 * 
 * 
 * def get_window(left, bottom, right, top, affine, precision=6):             # <<<<<<<<<<<<<<
 *     """
 *     Returns a window tuple given coordinate bounds and the coordinate reference
 */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_11get_window, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 831, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_window, __pyx_t_1) < 0) __PYX_ERR(0, 831, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":859
 * 
 * 
 * def window_shape(window, height=-1, width=-1):             # <<<<<<<<<<<<<<
 *     """Returns shape of a window.
 * 
 */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_13window_shape, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 859, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_window_shape, __pyx_t_1) < 0) __PYX_ERR(0, 859, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":869
 * 
 * 
 * def window_index(window):             # <<<<<<<<<<<<<<
 *     return tuple(slice(*w) for w in window)
 * 
 */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_15window_index, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 869, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_window_index, __pyx_t_1) < 0) __PYX_ERR(0, 869, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":873
 * 
 * 
 * def tastes_like_gdal(t):             # <<<<<<<<<<<<<<
 *     return t[2] == t[4] == 0.0 and t[1] > 0 and t[5] < 0
 * 
 */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_17tastes_like_gdal, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 873, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_tastes_like_gdal, __pyx_t_1) < 0) __PYX_ERR(0, 873, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":911
 * 
 * 
 * def _transform(src_crs, dst_crs, xs, ys, zs):             # <<<<<<<<<<<<<<
 *     cdef double *x = NULL
 *     cdef double *y = NULL
 */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_19_transform, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 911, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_transform_2, __pyx_t_1) < 0) __PYX_ERR(0, 911, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":968
 * 
 * 
 * def is_geographic_crs(crs):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsGeographic(osr_crs)
 */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_21is_geographic_crs, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 968, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_geographic_crs, __pyx_t_1) < 0) __PYX_ERR(0, 968, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":975
 * 
 * 
 * def is_projected_crs(crs):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs = _osr_from_crs(crs)
 *     cdef int retval = _gdal.OSRIsProjected(osr_crs)
 */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_23is_projected_crs, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 975, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_projected_crs, __pyx_t_1) < 0) __PYX_ERR(0, 975, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":982
 * 
 * 
 * def is_same_crs(crs1, crs2):             # <<<<<<<<<<<<<<
 *     cdef void *osr_crs1 = _osr_from_crs(crs1)
 *     cdef void *osr_crs2 = _osr_from_crs(crs2)
 */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_8rasterio_5_base_25is_same_crs, NULL, __pyx_n_s_rasterio__base); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 982, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_same_crs, __pyx_t_1) < 0) __PYX_ERR(0, 982, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "rasterio/_base.pyx":1
 * # cython: boundscheck=False             # <<<<<<<<<<<<<<
 * """Numpy-free base classes."""
 * 
 */
  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /*--- Wrapped vars code ---*/

  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  if (__pyx_m) {
    if (__pyx_d) {
      __Pyx_AddTraceback("init rasterio._base", __pyx_clineno, __pyx_lineno, __pyx_filename);
    }
    Py_DECREF(__pyx_m); __pyx_m = 0;
  } else if (!PyErr_Occurred()) {
    PyErr_SetString(PyExc_ImportError, "init rasterio._base");
  }
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  #if PY_MAJOR_VERSION < 3
  return;
  #else
  return __pyx_m;
  #endif
}

/* --- Runtime support code --- */
/* Refnanny */
#if CYTHON_REFNANNY
static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
    PyObject *m = NULL, *p = NULL;
    void *r = NULL;
    m = PyImport_ImportModule((char *)modname);
    if (!m) goto end;
    p = PyObject_GetAttrString(m, (char *)"RefNannyAPI");
    if (!p) goto end;
    r = PyLong_AsVoidPtr(p);
end:
    Py_XDECREF(p);
    Py_XDECREF(m);
    return (__Pyx_RefNannyAPIStruct *)r;
}
#endif

/* GetBuiltinName */
static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
    PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name);
    if (unlikely(!result)) {
        PyErr_Format(PyExc_NameError,
#if PY_MAJOR_VERSION >= 3
            "name '%U' is not defined", name);
#else
            "name '%.200s' is not defined", PyString_AS_STRING(name));
#endif
    }
    return result;
}

/* RaiseArgTupleInvalid */
static void __Pyx_RaiseArgtupleInvalid(
    const char* func_name,
    int exact,
    Py_ssize_t num_min,
    Py_ssize_t num_max,
    Py_ssize_t num_found)
{
    Py_ssize_t num_expected;
    const char *more_or_less;
    if (num_found < num_min) {
        num_expected = num_min;
        more_or_less = "at least";
    } else {
        num_expected = num_max;
        more_or_less = "at most";
    }
    if (exact) {
        more_or_less = "exactly";
    }
    PyErr_Format(PyExc_TypeError,
                 "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)",
                 func_name, more_or_less, num_expected,
                 (num_expected == 1) ? "" : "s", num_found);
}

/* RaiseDoubleKeywords */
static void __Pyx_RaiseDoubleKeywordsError(
    const char* func_name,
    PyObject* kw_name)
{
    PyErr_Format(PyExc_TypeError,
        #if PY_MAJOR_VERSION >= 3
        "%s() got multiple values for keyword argument '%U'", func_name, kw_name);
        #else
        "%s() got multiple values for keyword argument '%s'", func_name,
        PyString_AsString(kw_name));
        #endif
}

/* ParseKeywords */
static int __Pyx_ParseOptionalKeywords(
    PyObject *kwds,
    PyObject **argnames[],
    PyObject *kwds2,
    PyObject *values[],
    Py_ssize_t num_pos_args,
    const char* function_name)
{
    PyObject *key = 0, *value = 0;
    Py_ssize_t pos = 0;
    PyObject*** name;
    PyObject*** first_kw_arg = argnames + num_pos_args;
    while (PyDict_Next(kwds, &pos, &key, &value)) {
        name = first_kw_arg;
        while (*name && (**name != key)) name++;
        if (*name) {
            values[name-argnames] = value;
            continue;
        }
        name = first_kw_arg;
        #if PY_MAJOR_VERSION < 3
        if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) {
            while (*name) {
                if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key))
                        && _PyString_Eq(**name, key)) {
                    values[name-argnames] = value;
                    break;
                }
                name++;
            }
            if (*name) continue;
            else {
                PyObject*** argname = argnames;
                while (argname != first_kw_arg) {
                    if ((**argname == key) || (
                            (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key))
                             && _PyString_Eq(**argname, key))) {
                        goto arg_passed_twice;
                    }
                    argname++;
                }
            }
        } else
        #endif
        if (likely(PyUnicode_Check(key))) {
            while (*name) {
                int cmp = (**name == key) ? 0 :
                #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
                    (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :
                #endif
                    PyUnicode_Compare(**name, key);
                if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
                if (cmp == 0) {
                    values[name-argnames] = value;
                    break;
                }
                name++;
            }
            if (*name) continue;
            else {
                PyObject*** argname = argnames;
                while (argname != first_kw_arg) {
                    int cmp = (**argname == key) ? 0 :
                    #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
                        (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :
                    #endif
                        PyUnicode_Compare(**argname, key);
                    if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
                    if (cmp == 0) goto arg_passed_twice;
                    argname++;
                }
            }
        } else
            goto invalid_keyword_type;
        if (kwds2) {
            if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
        } else {
            goto invalid_keyword;
        }
    }
    return 0;
arg_passed_twice:
    __Pyx_RaiseDoubleKeywordsError(function_name, key);
    goto bad;
invalid_keyword_type:
    PyErr_Format(PyExc_TypeError,
        "%.200s() keywords must be strings", function_name);
    goto bad;
invalid_keyword:
    PyErr_Format(PyExc_TypeError,
    #if PY_MAJOR_VERSION < 3
        "%.200s() got an unexpected keyword argument '%.200s'",
        function_name, PyString_AsString(key));
    #else
        "%s() got an unexpected keyword argument '%U'",
        function_name, key);
    #endif
bad:
    return -1;
}

/* decode_c_string */
static CYTHON_INLINE PyObject* __Pyx_decode_c_string(
         const char* cstring, Py_ssize_t start, Py_ssize_t stop,
         const char* encoding, const char* errors,
         PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) {
    Py_ssize_t length;
    if (unlikely((start < 0) | (stop < 0))) {
        size_t slen = strlen(cstring);
        if (unlikely(slen > (size_t) PY_SSIZE_T_MAX)) {
            PyErr_SetString(PyExc_OverflowError,
                            "c-string too long to convert to Python");
            return NULL;
        }
        length = (Py_ssize_t) slen;
        if (start < 0) {
            start += length;
            if (start < 0)
                start = 0;
        }
        if (stop < 0)
            stop += length;
    }
    length = stop - start;
    if (unlikely(length <= 0))
        return PyUnicode_FromUnicode(NULL, 0);
    cstring += start;
    if (decode_func) {
        return decode_func(cstring, length, errors);
    } else {
        return PyUnicode_Decode(cstring, length, encoding, errors);
    }
}

/* GetModuleGlobalName */
static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) {
    PyObject *result;
#if CYTHON_COMPILING_IN_CPYTHON
    result = PyDict_GetItem(__pyx_d, name);
    if (likely(result)) {
        Py_INCREF(result);
    } else {
#else
    result = PyObject_GetItem(__pyx_d, name);
    if (!result) {
        PyErr_Clear();
#endif
        result = __Pyx_GetBuiltinName(name);
    }
    return result;
}

/* PyObjectCall */
  #if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) {
    PyObject *result;
    ternaryfunc call = func->ob_type->tp_call;
    if (unlikely(!call))
        return PyObject_Call(func, arg, kw);
    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
        return NULL;
    result = (*call)(func, arg, kw);
    Py_LeaveRecursiveCall();
    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
        PyErr_SetString(
            PyExc_SystemError,
            "NULL result without error in PyObject_Call");
    }
    return result;
}
#endif

/* 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) {
#ifdef __Pyx_CyFunction_USED
    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
#else
    if (likely(PyCFunction_Check(func))) {
#endif
        if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) {
            return __Pyx_PyObject_CallMethO(func, arg);
        }
    }
    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

/* 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");
}

/* IterFinish */
    static CYTHON_INLINE int __Pyx_IterFinish(void) {
#if CYTHON_COMPILING_IN_CPYTHON
    PyThreadState *tstate = PyThreadState_GET();
    PyObject* exc_type = tstate->curexc_type;
    if (unlikely(exc_type)) {
        if (likely(exc_type == PyExc_StopIteration) || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)) {
            PyObject *exc_value, *exc_tb;
            exc_value = tstate->curexc_value;
            exc_tb = tstate->curexc_traceback;
            tstate->curexc_type = 0;
            tstate->curexc_value = 0;
            tstate->curexc_traceback = 0;
            Py_DECREF(exc_type);
            Py_XDECREF(exc_value);
            Py_XDECREF(exc_tb);
            return 0;
        } else {
            return -1;
        }
    }
    return 0;
#else
    if (unlikely(PyErr_Occurred())) {
        if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) {
            PyErr_Clear();
            return 0;
        } else {
            return -1;
        }
    }
    return 0;
#endif
}

/* UnpackItemEndCheck */
    static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {
    if (unlikely(retval)) {
        Py_DECREF(retval);
        __Pyx_RaiseTooManyValuesError(expected);
        return -1;
    } else {
        return __Pyx_IterFinish();
    }
    return 0;
}

/* PyObjectCallNoArg */
    #if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) {
#ifdef __Pyx_CyFunction_USED
    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
#else
    if (likely(PyCFunction_Check(func))) {
#endif
        if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) {
            return __Pyx_PyObject_CallMethO(func, NULL);
        }
    }
    return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL);
}
#endif

/* SaveResetException */
      #if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
    *type = tstate->exc_type;
    *value = tstate->exc_value;
    *tb = tstate->exc_traceback;
    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;
    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;
    Py_XDECREF(tmp_type);
    Py_XDECREF(tmp_value);
    Py_XDECREF(tmp_tb);
}
#endif

/* GetException */
      #if CYTHON_COMPILING_IN_CPYTHON
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_COMPILING_IN_CPYTHON
    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_COMPILING_IN_CPYTHON
    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_COMPILING_IN_CPYTHON
    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;
    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;
}

/* PyErrFetchRestore */
        #if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) {
    PyObject *tmp_type, *tmp_value, *tmp_tb;
    tmp_type = tstate->curexc_type;
    tmp_value = tstate->curexc_value;
    tmp_tb = tstate->curexc_traceback;
    tstate->curexc_type = type;
    tstate->curexc_value = value;
    tstate->curexc_traceback = tb;
    Py_XDECREF(tmp_type);
    Py_XDECREF(tmp_value);
    Py_XDECREF(tmp_tb);
}
static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
    *type = tstate->curexc_type;
    *value = tstate->curexc_value;
    *tb = tstate->curexc_traceback;
    tstate->curexc_type = 0;
    tstate->curexc_value = 0;
    tstate->curexc_traceback = 0;
}
#endif

/* PyErrExceptionMatches */
        #if CYTHON_COMPILING_IN_CPYTHON
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;
    return 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;
        }
    }
    if (PyType_Check(type)) {
#if CYTHON_COMPILING_IN_PYPY
        if (!value) {
            Py_INCREF(Py_None);
            value = Py_None;
        }
#endif
        PyErr_NormalizeException(&type, &value, &tb);
    } else {
        if (value) {
            PyErr_SetString(PyExc_TypeError,
                "instance exception may not have a separate value");
            goto raise_error;
        }
        value = type;
        type = (PyObject*) Py_TYPE(type);
        Py_INCREF(type);
        if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {
            PyErr_SetString(PyExc_TypeError,
                "raise: exception class must be a subclass of BaseException");
            goto raise_error;
        }
    }
    __Pyx_PyThreadState_assign
    __Pyx_ErrRestore(type, value, tb);
    return;
raise_error:
    Py_XDECREF(value);
    Py_XDECREF(type);
    Py_XDECREF(tb);
    return;
}
#else
static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
    PyObject* owned_instance = NULL;
    if (tb == Py_None) {
        tb = 0;
    } else if (tb && !PyTraceBack_Check(tb)) {
        PyErr_SetString(PyExc_TypeError,
            "raise: arg 3 must be a traceback or None");
        goto bad;
    }
    if (value == Py_None)
        value = 0;
    if (PyExceptionInstance_Check(type)) {
        if (value) {
            PyErr_SetString(PyExc_TypeError,
                "instance exception may not have a separate value");
            goto bad;
        }
        value = type;
        type = (PyObject*) Py_TYPE(value);
    } else if (PyExceptionClass_Check(type)) {
        PyObject *instance_class = NULL;
        if (value && PyExceptionInstance_Check(value)) {
            instance_class = (PyObject*) Py_TYPE(value);
            if (instance_class != type) {
                int is_subclass = PyObject_IsSubclass(instance_class, type);
                if (!is_subclass) {
                    instance_class = NULL;
                } else if (unlikely(is_subclass == -1)) {
                    goto bad;
                } else {
                    type = instance_class;
                }
            }
        }
        if (!instance_class) {
            PyObject *args;
            if (!value)
                args = PyTuple_New(0);
            else if (PyTuple_Check(value)) {
                Py_INCREF(value);
                args = value;
            } else
                args = PyTuple_Pack(1, value);
            if (!args)
                goto bad;
            owned_instance = PyObject_Call(type, args, NULL);
            Py_DECREF(args);
            if (!owned_instance)
                goto bad;
            value = owned_instance;
            if (!PyExceptionInstance_Check(value)) {
                PyErr_Format(PyExc_TypeError,
                             "calling %R should have returned an instance of "
                             "BaseException, not %R",
                             type, Py_TYPE(value));
                goto bad;
            }
        }
    } else {
        PyErr_SetString(PyExc_TypeError,
            "raise: exception class must be a subclass of BaseException");
        goto bad;
    }
#if PY_VERSION_HEX >= 0x03030000
    if (cause) {
#else
    if (cause && cause != Py_None) {
#endif
        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 = PyThreadState_GET();
        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

/* BytesEquals */
          static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) {
#if CYTHON_COMPILING_IN_PYPY
    return PyObject_RichCompareBool(s1, s2, equals);
#else
    if (s1 == s2) {
        return (equals == Py_EQ);
    } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) {
        const char *ps1, *ps2;
        Py_ssize_t length = PyBytes_GET_SIZE(s1);
        if (length != PyBytes_GET_SIZE(s2))
            return (equals == Py_NE);
        ps1 = PyBytes_AS_STRING(s1);
        ps2 = PyBytes_AS_STRING(s2);
        if (ps1[0] != ps2[0]) {
            return (equals == Py_NE);
        } else if (length == 1) {
            return (equals == Py_EQ);
        } else {
            int result = memcmp(ps1, ps2, (size_t)length);
            return (equals == Py_EQ) ? (result == 0) : (result != 0);
        }
    } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) {
        return (equals == Py_NE);
    } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) {
        return (equals == Py_NE);
    } else {
        int result;
        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
        if (!py_result)
            return -1;
        result = __Pyx_PyObject_IsTrue(py_result);
        Py_DECREF(py_result);
        return result;
    }
#endif
}

/* UnicodeEquals */
          static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) {
#if CYTHON_COMPILING_IN_PYPY
    return PyObject_RichCompareBool(s1, s2, equals);
#else
#if PY_MAJOR_VERSION < 3
    PyObject* owned_ref = NULL;
#endif
    int s1_is_unicode, s2_is_unicode;
    if (s1 == s2) {
        goto return_eq;
    }
    s1_is_unicode = PyUnicode_CheckExact(s1);
    s2_is_unicode = PyUnicode_CheckExact(s2);
#if PY_MAJOR_VERSION < 3
    if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) {
        owned_ref = PyUnicode_FromObject(s2);
        if (unlikely(!owned_ref))
            return -1;
        s2 = owned_ref;
        s2_is_unicode = 1;
    } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) {
        owned_ref = PyUnicode_FromObject(s1);
        if (unlikely(!owned_ref))
            return -1;
        s1 = owned_ref;
        s1_is_unicode = 1;
    } else if (((!s2_is_unicode) & (!s1_is_unicode))) {
        return __Pyx_PyBytes_Equals(s1, s2, equals);
    }
#endif
    if (s1_is_unicode & s2_is_unicode) {
        Py_ssize_t length;
        int kind;
        void *data1, *data2;
        if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0))
            return -1;
        length = __Pyx_PyUnicode_GET_LENGTH(s1);
        if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) {
            goto return_ne;
        }
        kind = __Pyx_PyUnicode_KIND(s1);
        if (kind != __Pyx_PyUnicode_KIND(s2)) {
            goto return_ne;
        }
        data1 = __Pyx_PyUnicode_DATA(s1);
        data2 = __Pyx_PyUnicode_DATA(s2);
        if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) {
            goto return_ne;
        } else if (length == 1) {
            goto return_eq;
        } else {
            int result = memcmp(data1, data2, (size_t)(length * kind));
            #if PY_MAJOR_VERSION < 3
            Py_XDECREF(owned_ref);
            #endif
            return (equals == Py_EQ) ? (result == 0) : (result != 0);
        }
    } else if ((s1 == Py_None) & s2_is_unicode) {
        goto return_ne;
    } else if ((s2 == Py_None) & s1_is_unicode) {
        goto return_ne;
    } else {
        int result;
        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
        if (!py_result)
            return -1;
        result = __Pyx_PyObject_IsTrue(py_result);
        Py_DECREF(py_result);
        return result;
    }
return_eq:
    #if PY_MAJOR_VERSION < 3
    Py_XDECREF(owned_ref);
    #endif
    return (equals == Py_EQ);
return_ne:
    #if PY_MAJOR_VERSION < 3
    Py_XDECREF(owned_ref);
    #endif
    return (equals == Py_NE);
#endif
}

/* PyIntBinop */
          #if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyInt_EqObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED int inplace) {
    if (op1 == op2) {
        Py_RETURN_TRUE;
    }
    #if PY_MAJOR_VERSION < 3
    if (likely(PyInt_CheckExact(op1))) {
        const long b = intval;
        long a = PyInt_AS_LONG(op1);
        if (a == b) {
            Py_RETURN_TRUE;
        } else {
            Py_RETURN_FALSE;
        }
    }
    #endif
    #if CYTHON_USE_PYLONG_INTERNALS && PY_MAJOR_VERSION >= 3
    if (likely(PyLong_CheckExact(op1))) {
        const long b = intval;
        long a;
        const digit* digits = ((PyLongObject*)op1)->ob_digit;
        const Py_ssize_t size = Py_SIZE(op1);
        if (likely(__Pyx_sst_abs(size) <= 1)) {
            a = likely(size) ? digits[0] : 0;
            if (size == -1) a = -a;
        } else {
            switch (size) {
                case -2:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    }
                case 2:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    }
                case -3:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    }
                case 3:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    }
                case -4:
                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                        a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    }
                case 4:
                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                        a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    }
                #if PyLong_SHIFT < 30 && PyLong_SHIFT != 15
                default: return PyLong_Type.tp_richcompare(op1, op2, Py_EQ);
                #else
                default: Py_RETURN_FALSE;
                #endif
            }
        }
            if (a == b) {
                Py_RETURN_TRUE;
            } else {
                Py_RETURN_FALSE;
            }
    }
    #endif
    if (PyFloat_CheckExact(op1)) {
        const long b = intval;
        double a = PyFloat_AS_DOUBLE(op1);
            if ((double)a == (double)b) {
                Py_RETURN_TRUE;
            } else {
                Py_RETURN_FALSE;
            }
    }
    return PyObject_RichCompare(op1, op2, Py_EQ);
}
#endif

/* PyIntBinop */
          #if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyInt_RemainderObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED int inplace) {
    #if PY_MAJOR_VERSION < 3
    if (likely(PyInt_CheckExact(op1))) {
        const long b = intval;
        long x;
        long a = PyInt_AS_LONG(op1);
            x = a % b;
            x += ((x != 0) & ((x ^ b) < 0)) * b;
            return PyInt_FromLong(x);
    }
    #endif
    #if CYTHON_USE_PYLONG_INTERNALS && PY_MAJOR_VERSION >= 3
    if (likely(PyLong_CheckExact(op1))) {
        const long b = intval;
        long a, x;
        const PY_LONG_LONG llb = intval;
        PY_LONG_LONG lla, llx;
        const digit* digits = ((PyLongObject*)op1)->ob_digit;
        const Py_ssize_t size = Py_SIZE(op1);
        if (likely(__Pyx_sst_abs(size) <= 1)) {
            a = likely(size) ? digits[0] : 0;
            if (size == -1) a = -a;
        } else {
            switch (size) {
                case -2:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) {
                        lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
                        goto long_long;
                    }
                case 2:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) {
                        lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
                        goto long_long;
                    }
                case -3:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) {
                        lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
                        goto long_long;
                    }
                case 3:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) {
                        lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
                        goto long_long;
                    }
                case -4:
                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                        a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) {
                        lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
                        goto long_long;
                    }
                case 4:
                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                        a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) {
                        lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
                        goto long_long;
                    }
                default: return PyLong_Type.tp_as_number->nb_remainder(op1, op2);
            }
        }
                x = a % b;
                x += ((x != 0) & ((x ^ b) < 0)) * b;
            return PyLong_FromLong(x);
        long_long:
                llx = lla % llb;
                llx += ((llx != 0) & ((llx ^ llb) < 0)) * llb;
            return PyLong_FromLongLong(llx);
    }
    #endif
    return (inplace ? PyNumber_InPlaceRemainder : PyNumber_Remainder)(op1, op2);
}
#endif

/* GetItemInt */
          static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
    PyObject *r;
    if (!j) return NULL;
    r = PyObject_GetItem(o, j);
    Py_DECREF(j);
    return r;
}
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
                                                              CYTHON_NCP_UNUSED int wraparound,
                                                              CYTHON_NCP_UNUSED int boundscheck) {
#if CYTHON_COMPILING_IN_CPYTHON
    if (wraparound & unlikely(i < 0)) i += PyList_GET_SIZE(o);
    if ((!boundscheck) || likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
        PyObject *r = PyList_GET_ITEM(o, i);
        Py_INCREF(r);
        return r;
    }
    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
#else
    return PySequence_GetItem(o, i);
#endif
}
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
                                                              CYTHON_NCP_UNUSED int wraparound,
                                                              CYTHON_NCP_UNUSED int boundscheck) {
#if CYTHON_COMPILING_IN_CPYTHON
    if (wraparound & unlikely(i < 0)) i += PyTuple_GET_SIZE(o);
    if ((!boundscheck) || likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
        PyObject *r = PyTuple_GET_ITEM(o, i);
        Py_INCREF(r);
        return r;
    }
    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
#else
    return PySequence_GetItem(o, i);
#endif
}
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list,
                                                     CYTHON_NCP_UNUSED int wraparound,
                                                     CYTHON_NCP_UNUSED int boundscheck) {
#if CYTHON_COMPILING_IN_CPYTHON
    if (is_list || PyList_CheckExact(o)) {
        Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
        if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) {
            PyObject *r = PyList_GET_ITEM(o, n);
            Py_INCREF(r);
            return r;
        }
    }
    else if (PyTuple_CheckExact(o)) {
        Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);
        if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) {
            PyObject *r = PyTuple_GET_ITEM(o, n);
            Py_INCREF(r);
            return r;
        }
    } else {
        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
        if (likely(m && m->sq_item)) {
            if (wraparound && unlikely(i < 0) && likely(m->sq_length)) {
                Py_ssize_t l = m->sq_length(o);
                if (likely(l >= 0)) {
                    i += l;
                } else {
                    if (!PyErr_ExceptionMatches(PyExc_OverflowError))
                        return NULL;
                    PyErr_Clear();
                }
            }
            return m->sq_item(o, i);
        }
    }
#else
    if (is_list || PySequence_Check(o)) {
        return PySequence_GetItem(o, i);
    }
#endif
    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
}

/* None */
          static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) {
    PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname);
}

/* SetItemInt */
          static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) {
    int r;
    if (!j) return -1;
    r = PyObject_SetItem(o, j, v);
    Py_DECREF(j);
    return r;
}
static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, int is_list,
                                               CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) {
#if CYTHON_COMPILING_IN_CPYTHON
    if (is_list || PyList_CheckExact(o)) {
        Py_ssize_t n = (!wraparound) ? i : ((likely(i >= 0)) ? i : i + PyList_GET_SIZE(o));
        if ((!boundscheck) || likely((n >= 0) & (n < PyList_GET_SIZE(o)))) {
            PyObject* old = PyList_GET_ITEM(o, n);
            Py_INCREF(v);
            PyList_SET_ITEM(o, n, v);
            Py_DECREF(old);
            return 1;
        }
    } else {
        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
        if (likely(m && m->sq_ass_item)) {
            if (wraparound && unlikely(i < 0) && likely(m->sq_length)) {
                Py_ssize_t l = m->sq_length(o);
                if (likely(l >= 0)) {
                    i += l;
                } else {
                    if (!PyErr_ExceptionMatches(PyExc_OverflowError))
                        return -1;
                    PyErr_Clear();
                }
            }
            return m->sq_ass_item(o, i, v);
        }
    }
#else
#if CYTHON_COMPILING_IN_PYPY
    if (is_list || (PySequence_Check(o) && !PyDict_Check(o))) {
#else
    if (is_list || PySequence_Check(o)) {
#endif
        return PySequence_SetItem(o, i, v);
    }
#endif
    return __Pyx_SetItemInt_Generic(o, PyInt_FromSsize_t(i), v);
}

/* PyIntBinop */
            #if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED int inplace) {
    #if PY_MAJOR_VERSION < 3
    if (likely(PyInt_CheckExact(op1))) {
        const long b = intval;
        long x;
        long a = PyInt_AS_LONG(op1);
            x = (long)((unsigned long)a + b);
            if (likely((x^a) >= 0 || (x^b) >= 0))
                return PyInt_FromLong(x);
            return PyLong_Type.tp_as_number->nb_add(op1, op2);
    }
    #endif
    #if CYTHON_USE_PYLONG_INTERNALS && PY_MAJOR_VERSION >= 3
    if (likely(PyLong_CheckExact(op1))) {
        const long b = intval;
        long a, x;
        const PY_LONG_LONG llb = intval;
        PY_LONG_LONG lla, llx;
        const digit* digits = ((PyLongObject*)op1)->ob_digit;
        const Py_ssize_t size = Py_SIZE(op1);
        if (likely(__Pyx_sst_abs(size) <= 1)) {
            a = likely(size) ? digits[0] : 0;
            if (size == -1) a = -a;
        } else {
            switch (size) {
                case -2:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) {
                        lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
                        goto long_long;
                    }
                case 2:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) {
                        lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
                        goto long_long;
                    }
                case -3:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) {
                        lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
                        goto long_long;
                    }
                case 3:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) {
                        lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
                        goto long_long;
                    }
                case -4:
                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                        a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) {
                        lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
                        goto long_long;
                    }
                case 4:
                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                        a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) {
                        lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
                        goto long_long;
                    }
                default: return PyLong_Type.tp_as_number->nb_add(op1, op2);
            }
        }
                x = a + b;
            return PyLong_FromLong(x);
        long_long:
                llx = lla + llb;
            return PyLong_FromLongLong(llx);
    }
    #endif
    if (PyFloat_CheckExact(op1)) {
        const long b = intval;
        double a = PyFloat_AS_DOUBLE(op1);
            double result;
            PyFPE_START_PROTECT("add", return NULL)
            result = ((double)a) + (double)b;
            PyFPE_END_PROTECT(result)
            return PyFloat_FromDouble(result);
    }
    return (inplace ? PyNumber_InPlaceAdd : PyNumber_Add)(op1, op2);
}
#endif

/* PyObjectCallMethod1 */
            static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg) {
    PyObject *method, *result = NULL;
    method = __Pyx_PyObject_GetAttrStr(obj, method_name);
    if (unlikely(!method)) goto bad;
#if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyMethod_Check(method))) {
        PyObject *self = PyMethod_GET_SELF(method);
        if (likely(self)) {
            PyObject *args;
            PyObject *function = PyMethod_GET_FUNCTION(method);
            args = PyTuple_New(2);
            if (unlikely(!args)) goto bad;
            Py_INCREF(self);
            PyTuple_SET_ITEM(args, 0, self);
            Py_INCREF(arg);
            PyTuple_SET_ITEM(args, 1, arg);
            Py_INCREF(function);
            Py_DECREF(method); method = NULL;
            result = __Pyx_PyObject_Call(function, args, NULL);
            Py_DECREF(args);
            Py_DECREF(function);
            return result;
        }
    }
#endif
    result = __Pyx_PyObject_CallOneArg(method, arg);
bad:
    Py_XDECREF(method);
    return result;
}

/* append */
            static CYTHON_INLINE int __Pyx_PyObject_Append(PyObject* L, PyObject* x) {
    if (likely(PyList_CheckExact(L))) {
        if (unlikely(__Pyx_PyList_Append(L, x) < 0)) return -1;
    } else {
        PyObject* retval = __Pyx_PyObject_CallMethod1(L, __pyx_n_s_append, x);
        if (unlikely(!retval))
            return -1;
        Py_DECREF(retval);
    }
    return 0;
}

/* PyIntBinop */
            #if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyInt_SubtractObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED int inplace) {
    #if PY_MAJOR_VERSION < 3
    if (likely(PyInt_CheckExact(op1))) {
        const long b = intval;
        long x;
        long a = PyInt_AS_LONG(op1);
            x = (long)((unsigned long)a - b);
            if (likely((x^a) >= 0 || (x^~b) >= 0))
                return PyInt_FromLong(x);
            return PyLong_Type.tp_as_number->nb_subtract(op1, op2);
    }
    #endif
    #if CYTHON_USE_PYLONG_INTERNALS && PY_MAJOR_VERSION >= 3
    if (likely(PyLong_CheckExact(op1))) {
        const long b = intval;
        long a, x;
        const PY_LONG_LONG llb = intval;
        PY_LONG_LONG lla, llx;
        const digit* digits = ((PyLongObject*)op1)->ob_digit;
        const Py_ssize_t size = Py_SIZE(op1);
        if (likely(__Pyx_sst_abs(size) <= 1)) {
            a = likely(size) ? digits[0] : 0;
            if (size == -1) a = -a;
        } else {
            switch (size) {
                case -2:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) {
                        lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
                        goto long_long;
                    }
                case 2:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) {
                        lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
                        goto long_long;
                    }
                case -3:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) {
                        lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
                        goto long_long;
                    }
                case 3:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) {
                        lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
                        goto long_long;
                    }
                case -4:
                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                        a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) {
                        lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
                        goto long_long;
                    }
                case 4:
                    if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                        a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                        break;
                    } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) {
                        lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]));
                        goto long_long;
                    }
                default: return PyLong_Type.tp_as_number->nb_subtract(op1, op2);
            }
        }
                x = a - b;
            return PyLong_FromLong(x);
        long_long:
                llx = lla - llb;
            return PyLong_FromLongLong(llx);
    }
    #endif
    if (PyFloat_CheckExact(op1)) {
        const long b = intval;
        double a = PyFloat_AS_DOUBLE(op1);
            double result;
            PyFPE_START_PROTECT("subtract", return NULL)
            result = ((double)a) - (double)b;
            PyFPE_END_PROTECT(result)
            return PyFloat_FromDouble(result);
    }
    return (inplace ? PyNumber_InPlaceSubtract : PyNumber_Subtract)(op1, op2);
}
#endif

/* None */
            static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname) {
    PyErr_Format(PyExc_NameError, "free variable '%s' referenced before assignment in enclosing scope", varname);
}

/* PyFloatBinop */
            #if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyFloat_DivideObjC(PyObject *op1, PyObject *op2, double floatval, CYTHON_UNUSED int inplace) {
    const double b = floatval;
    double a, result;
    if (likely(PyFloat_CheckExact(op1))) {
        a = PyFloat_AS_DOUBLE(op1);
    } else
    #if PY_MAJOR_VERSION < 3
    if (likely(PyInt_CheckExact(op1))) {
        a = (double) PyInt_AS_LONG(op1);
    } else
    #endif
    if (likely(PyLong_CheckExact(op1))) {
        #if CYTHON_USE_PYLONG_INTERNALS && PY_MAJOR_VERSION >= 3
        const digit* digits = ((PyLongObject*)op1)->ob_digit;
        const Py_ssize_t size = Py_SIZE(op1);
        switch (size) {
            case  0: a = 0.0; break;
            case -1: a = -(double) digits[0]; break;
            case  1: a = (double) digits[0]; break;
            case -2:
            case 2:
                if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT && ((8 * sizeof(unsigned long) < 53) || (1 * PyLong_SHIFT < 53))) {
                    a = (double) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                    if ((8 * sizeof(unsigned long) < 53) || (2 * PyLong_SHIFT < 53) || (a < (double) (1L<<53))) {
                        if (size == -2)
                            a = -a;
                        break;
                    }
                }
            case -3:
            case 3:
                if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT && ((8 * sizeof(unsigned long) < 53) || (2 * PyLong_SHIFT < 53))) {
                    a = (double) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                    if ((8 * sizeof(unsigned long) < 53) || (3 * PyLong_SHIFT < 53) || (a < (double) (1L<<53))) {
                        if (size == -3)
                            a = -a;
                        break;
                    }
                }
            case -4:
            case 4:
                if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT && ((8 * sizeof(unsigned long) < 53) || (3 * PyLong_SHIFT < 53))) {
                    a = (double) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                    if ((8 * sizeof(unsigned long) < 53) || (4 * PyLong_SHIFT < 53) || (a < (double) (1L<<53))) {
                        if (size == -4)
                            a = -a;
                        break;
                    }
                }
            default:
        #else
        {
        #endif
            a = PyLong_AsDouble(op1);
            if (unlikely(a == -1.0 && PyErr_Occurred())) return NULL;
        }
    } else {
        return (inplace ? __Pyx_PyNumber_InPlaceDivide(op1, op2) : __Pyx_PyNumber_Divide(op1, op2));
    }
        PyFPE_START_PROTECT("divide", return NULL)
        result = a / b;
        PyFPE_END_PROTECT(result)
        return PyFloat_FromDouble(result);
}
#endif

/* PyObjectCallMethod0 */
              static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) {
    PyObject *method, *result = NULL;
    method = __Pyx_PyObject_GetAttrStr(obj, method_name);
    if (unlikely(!method)) goto bad;
#if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyMethod_Check(method))) {
        PyObject *self = PyMethod_GET_SELF(method);
        if (likely(self)) {
            PyObject *function = PyMethod_GET_FUNCTION(method);
            result = __Pyx_PyObject_CallOneArg(function, self);
            Py_DECREF(method);
            return result;
        }
    }
#endif
    result = __Pyx_PyObject_CallNoArg(method);
    Py_DECREF(method);
bad:
    return result;
}

/* UnpackUnboundCMethod */
              static int __Pyx_TryUnpackUnboundCMethod(__Pyx_CachedCFunction* target) {
    PyObject *method;
    method = __Pyx_PyObject_GetAttrStr(target->type, *target->method_name);
    if (unlikely(!method))
        return -1;
    target->method = method;
#if CYTHON_COMPILING_IN_CPYTHON
    #if PY_MAJOR_VERSION >= 3
    if (likely(PyObject_TypeCheck(method, &PyMethodDescr_Type)))
    #endif
    {
        PyMethodDescrObject *descr = (PyMethodDescrObject*) method;
        target->func = descr->d_method->ml_meth;
        target->flag = descr->d_method->ml_flags & (METH_VARARGS | METH_KEYWORDS | METH_O | METH_NOARGS);
    }
#endif
    return 0;
}

/* CallUnboundCMethod0 */
              static PyObject* __Pyx__CallUnboundCMethod0(__Pyx_CachedCFunction* cfunc, PyObject* self) {
    PyObject *args, *result = NULL;
    if (unlikely(!cfunc->method) && unlikely(__Pyx_TryUnpackUnboundCMethod(cfunc) < 0)) return NULL;
#if CYTHON_COMPILING_IN_CPYTHON
    args = PyTuple_New(1);
    if (unlikely(!args)) goto bad;
    Py_INCREF(self);
    PyTuple_SET_ITEM(args, 0, self);
#else
    args = PyTuple_Pack(1, self);
    if (unlikely(!args)) goto bad;
#endif
    result = __Pyx_PyObject_Call(cfunc->method, args, NULL);
    Py_DECREF(args);
bad:
    return result;
}

/* pop */
              static CYTHON_INLINE PyObject* __Pyx__PyObject_Pop(PyObject* L) {
#if CYTHON_COMPILING_IN_CPYTHON
    if (Py_TYPE(L) == &PySet_Type) {
        return PySet_Pop(L);
    }
#endif
    return __Pyx_PyObject_CallMethod0(L, __pyx_n_s_pop);
}
#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyList_Pop(PyObject* L) {
    if (likely(PyList_GET_SIZE(L) > (((PyListObject*)L)->allocated >> 1))) {
        Py_SIZE(L) -= 1;
        return PyList_GET_ITEM(L, PyList_GET_SIZE(L));
    }
    return __Pyx_CallUnboundCMethod0(&__pyx_umethod_PyList_Type_pop, L);
}
#endif

/* pyobject_as_double */
              static double __Pyx__PyObject_AsDouble(PyObject* obj) {
    PyObject* float_value;
#if CYTHON_COMPILING_IN_PYPY
    float_value = PyNumber_Float(obj);  if (0) goto bad;
#else
    PyNumberMethods *nb = Py_TYPE(obj)->tp_as_number;
    if (likely(nb) && likely(nb->nb_float)) {
        float_value = nb->nb_float(obj);
        if (likely(float_value) && unlikely(!PyFloat_Check(float_value))) {
            PyErr_Format(PyExc_TypeError,
                "__float__ returned non-float (type %.200s)",
                Py_TYPE(float_value)->tp_name);
            Py_DECREF(float_value);
            goto bad;
        }
    } else if (PyUnicode_CheckExact(obj) || PyBytes_CheckExact(obj)) {
#if PY_MAJOR_VERSION >= 3
        float_value = PyFloat_FromString(obj);
#else
        float_value = PyFloat_FromString(obj, 0);
#endif
    } else {
        PyObject* args = PyTuple_New(1);
        if (unlikely(!args)) goto bad;
        PyTuple_SET_ITEM(args, 0, obj);
        float_value = PyObject_Call((PyObject*)&PyFloat_Type, args, 0);
        PyTuple_SET_ITEM(args, 0, 0);
        Py_DECREF(args);
    }
#endif
    if (likely(float_value)) {
        double value = PyFloat_AS_DOUBLE(float_value);
        Py_DECREF(float_value);
        return value;
    }
bad:
    return (double)-1;
}

/* PyFloatBinop */
              #if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx_PyFloat_SubtractCObj(PyObject *op1, PyObject *op2, double floatval, CYTHON_UNUSED int inplace) {
    const double a = floatval;
    double b, result;
    if (likely(PyFloat_CheckExact(op2))) {
        b = PyFloat_AS_DOUBLE(op2);
    } else
    #if PY_MAJOR_VERSION < 3
    if (likely(PyInt_CheckExact(op2))) {
        b = (double) PyInt_AS_LONG(op2);
    } else
    #endif
    if (likely(PyLong_CheckExact(op2))) {
        #if CYTHON_USE_PYLONG_INTERNALS && PY_MAJOR_VERSION >= 3
        const digit* digits = ((PyLongObject*)op2)->ob_digit;
        const Py_ssize_t size = Py_SIZE(op2);
        switch (size) {
            case  0: b = 0.0; break;
            case -1: b = -(double) digits[0]; break;
            case  1: b = (double) digits[0]; break;
            case -2:
            case 2:
                if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT && ((8 * sizeof(unsigned long) < 53) || (1 * PyLong_SHIFT < 53))) {
                    b = (double) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                    if ((8 * sizeof(unsigned long) < 53) || (2 * PyLong_SHIFT < 53) || (b < (double) (1L<<53))) {
                        if (size == -2)
                            b = -b;
                        break;
                    }
                }
            case -3:
            case 3:
                if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT && ((8 * sizeof(unsigned long) < 53) || (2 * PyLong_SHIFT < 53))) {
                    b = (double) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                    if ((8 * sizeof(unsigned long) < 53) || (3 * PyLong_SHIFT < 53) || (b < (double) (1L<<53))) {
                        if (size == -3)
                            b = -b;
                        break;
                    }
                }
            case -4:
            case 4:
                if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT && ((8 * sizeof(unsigned long) < 53) || (3 * PyLong_SHIFT < 53))) {
                    b = (double) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]));
                    if ((8 * sizeof(unsigned long) < 53) || (4 * PyLong_SHIFT < 53) || (b < (double) (1L<<53))) {
                        if (size == -4)
                            b = -b;
                        break;
                    }
                }
            default:
        #else
        {
        #endif
            b = PyLong_AsDouble(op2);
            if (unlikely(b == -1.0 && PyErr_Occurred())) return NULL;
        }
    } else {
        return (inplace ? PyNumber_InPlaceSubtract : PyNumber_Subtract)(op1, op2);
    }
        PyFPE_START_PROTECT("subtract", return NULL)
        result = a - b;
        PyFPE_END_PROTECT(result)
        return PyFloat_FromDouble(result);
}
#endif

/* StringJoin */
                #if !CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyBytes_Join(PyObject* sep, PyObject* values) {
    return PyObject_CallMethodObjArgs(sep, __pyx_n_s_join, values, NULL);
}
#endif

/* WriteUnraisableException */
                static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
                                  CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename,
                                  int full_traceback, CYTHON_UNUSED int nogil) {
    PyObject *old_exc, *old_val, *old_tb;
    PyObject *ctx;
    __Pyx_PyThreadState_declare
#ifdef WITH_THREAD
    PyGILState_STATE state;
    if (nogil)
        state = PyGILState_Ensure();
#ifdef _MSC_VER
    else state = (PyGILState_STATE)-1;
#endif
#endif
    __Pyx_PyThreadState_assign
    __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);
    if (full_traceback) {
        Py_XINCREF(old_exc);
        Py_XINCREF(old_val);
        Py_XINCREF(old_tb);
        __Pyx_ErrRestore(old_exc, old_val, old_tb);
        PyErr_PrintEx(1);
    }
    #if PY_MAJOR_VERSION < 3
    ctx = PyString_FromString(name);
    #else
    ctx = PyUnicode_FromString(name);
    #endif
    __Pyx_ErrRestore(old_exc, old_val, old_tb);
    if (!ctx) {
        PyErr_WriteUnraisable(Py_None);
    } else {
        PyErr_WriteUnraisable(ctx);
        Py_DECREF(ctx);
    }
#ifdef WITH_THREAD
    if (nogil)
        PyGILState_Release(state);
#endif
}

/* SwapException */
                #if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
    PyObject *tmp_type, *tmp_value, *tmp_tb;
    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;
    *type = tmp_type;
    *value = tmp_value;
    *tb = tmp_tb;
}
#else
static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) {
    PyObject *tmp_type, *tmp_value, *tmp_tb;
    PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb);
    PyErr_SetExcInfo(*type, *value, *tb);
    *type = tmp_type;
    *value = tmp_value;
    *tb = tmp_tb;
}
#endif

/* SetVTable */
                static int __Pyx_SetVtable(PyObject *dict, void *vtable) {
#if PY_VERSION_HEX >= 0x02070000
    PyObject *ob = PyCapsule_New(vtable, 0, 0);
#else
    PyObject *ob = PyCObject_FromVoidPtr(vtable, 0);
#endif
    if (!ob)
        goto bad;
    if (PyDict_SetItem(dict, __pyx_n_s_pyx_vtable, ob) < 0)
        goto bad;
    Py_DECREF(ob);
    return 0;
bad:
    Py_XDECREF(ob);
    return -1;
}

/* Import */
                static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) {
    PyObject *empty_list = 0;
    PyObject *module = 0;
    PyObject *global_dict = 0;
    PyObject *empty_dict = 0;
    PyObject *list;
    #if PY_VERSION_HEX < 0x03030000
    PyObject *py_import;
    py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import);
    if (!py_import)
        goto bad;
    #endif
    if (from_list)
        list = from_list;
    else {
        empty_list = PyList_New(0);
        if (!empty_list)
            goto bad;
        list = empty_list;
    }
    global_dict = PyModule_GetDict(__pyx_m);
    if (!global_dict)
        goto bad;
    empty_dict = PyDict_New();
    if (!empty_dict)
        goto bad;
    {
        #if PY_MAJOR_VERSION >= 3
        if (level == -1) {
            if (strchr(__Pyx_MODULE_NAME, '.')) {
                #if PY_VERSION_HEX < 0x03030000
                PyObject *py_level = PyInt_FromLong(1);
                if (!py_level)
                    goto bad;
                module = PyObject_CallFunctionObjArgs(py_import,
                    name, global_dict, empty_dict, list, py_level, NULL);
                Py_DECREF(py_level);
                #else
                module = PyImport_ImportModuleLevelObject(
                    name, global_dict, empty_dict, list, 1);
                #endif
                if (!module) {
                    if (!PyErr_ExceptionMatches(PyExc_ImportError))
                        goto bad;
                    PyErr_Clear();
                }
            }
            level = 0;
        }
        #endif
        if (!module) {
            #if PY_VERSION_HEX < 0x03030000
            PyObject *py_level = PyInt_FromLong(level);
            if (!py_level)
                goto bad;
            module = PyObject_CallFunctionObjArgs(py_import,
                name, global_dict, empty_dict, list, py_level, NULL);
            Py_DECREF(py_level);
            #else
            module = PyImport_ImportModuleLevelObject(
                name, global_dict, empty_dict, list, level);
            #endif
        }
    }
bad:
    #if PY_VERSION_HEX < 0x03030000
    Py_XDECREF(py_import);
    #endif
    Py_XDECREF(empty_list);
    Py_XDECREF(empty_dict);
    return module;
}

/* ImportFrom */
                static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) {
    PyObject* value = __Pyx_PyObject_GetAttrStr(module, name);
    if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) {
        PyErr_Format(PyExc_ImportError,
        #if PY_MAJOR_VERSION < 3
            "cannot import name %.230s", PyString_AS_STRING(name));
        #else
            "cannot import name %S", name);
        #endif
    }
    return value;
}

/* CodeObjectCache */
                static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {
    int start = 0, mid = 0, end = count - 1;
    if (end >= 0 && code_line > entries[end].code_line) {
        return count;
    }
    while (start < end) {
        mid = start + (end - start) / 2;
        if (code_line < entries[mid].code_line) {
            end = mid;
        } else if (code_line > entries[mid].code_line) {
             start = mid + 1;
        } else {
            return mid;
        }
    }
    if (code_line <= entries[mid].code_line) {
        return mid;
    } else {
        return mid + 1;
    }
}
static PyCodeObject *__pyx_find_code_object(int code_line) {
    PyCodeObject* code_object;
    int pos;
    if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {
        return NULL;
    }
    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
    if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {
        return NULL;
    }
    code_object = __pyx_code_cache.entries[pos].code_object;
    Py_INCREF(code_object);
    return code_object;
}
static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
    int pos, i;
    __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;
    if (unlikely(!code_line)) {
        return;
    }
    if (unlikely(!entries)) {
        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));
        if (likely(entries)) {
            __pyx_code_cache.entries = entries;
            __pyx_code_cache.max_count = 64;
            __pyx_code_cache.count = 1;
            entries[0].code_line = code_line;
            entries[0].code_object = code_object;
            Py_INCREF(code_object);
        }
        return;
    }
    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
    if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {
        PyCodeObject* tmp = entries[pos].code_object;
        entries[pos].code_object = code_object;
        Py_DECREF(tmp);
        return;
    }
    if (__pyx_code_cache.count == __pyx_code_cache.max_count) {
        int new_max = __pyx_code_cache.max_count + 64;
        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(
            __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry));
        if (unlikely(!entries)) {
            return;
        }
        __pyx_code_cache.entries = entries;
        __pyx_code_cache.max_count = new_max;
    }
    for (i=__pyx_code_cache.count; i>pos; i--) {
        entries[i] = entries[i-1];
    }
    entries[pos].code_line = code_line;
    entries[pos].code_object = code_object;
    __pyx_code_cache.count++;
    Py_INCREF(code_object);
}

/* AddTraceback */
                #include "compile.h"
#include "frameobject.h"
#include "traceback.h"
static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
            const char *funcname, int c_line,
            int py_line, const char *filename) {
    PyCodeObject *py_code = 0;
    PyObject *py_srcfile = 0;
    PyObject *py_funcname = 0;
    #if PY_MAJOR_VERSION < 3
    py_srcfile = PyString_FromString(filename);
    #else
    py_srcfile = PyUnicode_FromString(filename);
    #endif
    if (!py_srcfile) goto bad;
    if (c_line) {
        #if PY_MAJOR_VERSION < 3
        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
        #else
        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
        #endif
    }
    else {
        #if PY_MAJOR_VERSION < 3
        py_funcname = PyString_FromString(funcname);
        #else
        py_funcname = PyUnicode_FromString(funcname);
        #endif
    }
    if (!py_funcname) goto bad;
    py_code = __Pyx_PyCode_New(
        0,
        0,
        0,
        0,
        0,
        __pyx_empty_bytes, /*PyObject *code,*/
        __pyx_empty_tuple, /*PyObject *consts,*/
        __pyx_empty_tuple, /*PyObject *names,*/
        __pyx_empty_tuple, /*PyObject *varnames,*/
        __pyx_empty_tuple, /*PyObject *freevars,*/
        __pyx_empty_tuple, /*PyObject *cellvars,*/
        py_srcfile,   /*PyObject *filename,*/
        py_funcname,  /*PyObject *name,*/
        py_line,
        __pyx_empty_bytes  /*PyObject *lnotab*/
    );
    Py_DECREF(py_srcfile);
    Py_DECREF(py_funcname);
    return py_code;
bad:
    Py_XDECREF(py_srcfile);
    Py_XDECREF(py_funcname);
    return NULL;
}
static void __Pyx_AddTraceback(const char *funcname, int c_line,
                               int py_line, const char *filename) {
    PyCodeObject *py_code = 0;
    PyFrameObject *py_frame = 0;
    py_code = __pyx_find_code_object(c_line ? c_line : py_line);
    if (!py_code) {
        py_code = __Pyx_CreateCodeObjectForTraceback(
            funcname, c_line, py_line, filename);
        if (!py_code) goto bad;
        __pyx_insert_code_object(c_line ? c_line : py_line, py_code);
    }
    py_frame = PyFrame_New(
        PyThreadState_GET(), /*PyThreadState *tstate,*/
        py_code,             /*PyCodeObject *code,*/
        __pyx_d,      /*PyObject *globals,*/
        0                    /*PyObject *locals*/
    );
    if (!py_frame) goto bad;
    py_frame->f_lineno = py_line;
    PyTraceBack_Here(py_frame);
bad:
    Py_XDECREF(py_code);
    Py_XDECREF(py_frame);
}

/* CIntFromPyVerify */
                #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\
    __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0)
#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\
    __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1)
#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\
    {\
        func_type value = func_value;\
        if (sizeof(target_type) < sizeof(func_type)) {\
            if (unlikely(value != (func_type) (target_type) value)) {\
                func_type zero = 0;\
                if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\
                    return (target_type) -1;\
                if (is_unsigned && unlikely(value < zero))\
                    goto raise_neg_overflow;\
                else\
                    goto raise_overflow;\
            }\
        }\
        return (target_type) value;\
    }

/* CIntToPy */
                static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) {
    const int neg_one = (int) -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);
        } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) {
            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
        }
    } else {
        if (sizeof(int) <= sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) {
            return PyLong_FromLongLong((PY_LONG_LONG) value);
        }
    }
    {
        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) -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);
        } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) {
            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
        }
    } else {
        if (sizeof(long) <= sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) {
            return PyLong_FromLongLong((PY_LONG_LONG) value);
        }
    }
    {
        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_short(short value) {
    const short neg_one = (short) -1, const_zero = (short) 0;
    const int is_unsigned = neg_one > const_zero;
    if (is_unsigned) {
        if (sizeof(short) < sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(short) <= sizeof(unsigned long)) {
            return PyLong_FromUnsignedLong((unsigned long) value);
        } else if (sizeof(short) <= sizeof(unsigned PY_LONG_LONG)) {
            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
        }
    } else {
        if (sizeof(short) <= sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(short) <= sizeof(PY_LONG_LONG)) {
            return PyLong_FromLongLong((PY_LONG_LONG) value);
        }
    }
    {
        int one = 1; int little = (int)*(unsigned char *)&one;
        unsigned char *bytes = (unsigned char *)&value;
        return _PyLong_FromByteArray(bytes, sizeof(short),
                                     little, !is_unsigned);
    }
}

/* CIntFromPy */
                static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) {
    const int neg_one = (int) -1, const_zero = (int) 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_MAJOR_VERSION < 3
    if (likely(PyInt_Check(x))) {
        if (sizeof(int) < sizeof(long)) {
            __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x))
        } else {
            long val = PyInt_AS_LONG(x);
            if (is_unsigned && unlikely(val < 0)) {
                goto raise_neg_overflow;
            }
            return (int) val;
        }
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
#if CYTHON_USE_PYLONG_INTERNALS
            const digit* digits = ((PyLongObject*)x)->ob_digit;
            switch (Py_SIZE(x)) {
                case  0: return (int) 0;
                case  1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0])
                case 2:
                    if (8 * sizeof(int) > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) {
                            return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]));
                        }
                    }
                    break;
                case 3:
                    if (8 * sizeof(int) > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) {
                            return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]));
                        }
                    }
                    break;
                case 4:
                    if (8 * sizeof(int) > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) {
                            return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]));
                        }
                    }
                    break;
            }
#endif
#if CYTHON_COMPILING_IN_CPYTHON
            if (unlikely(Py_SIZE(x) < 0)) {
                goto raise_neg_overflow;
            }
#else
            {
                int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
                if (unlikely(result < 0))
                    return (int) -1;
                if (unlikely(result == 1))
                    goto raise_neg_overflow;
            }
#endif
            if (sizeof(int) <= sizeof(unsigned long)) {
                __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x))
            } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) {
                __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
            }
        } else {
#if CYTHON_USE_PYLONG_INTERNALS
            const digit* digits = ((PyLongObject*)x)->ob_digit;
            switch (Py_SIZE(x)) {
                case  0: return (int) 0;
                case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0]))
                case  1: __PYX_VERIFY_RETURN_INT(int,  digit, +digits[0])
                case -2:
                    if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
                            return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
                        }
                    }
                    break;
                case 2:
                    if (8 * sizeof(int) > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
                            return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
                        }
                    }
                    break;
                case -3:
                    if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
                            return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
                        }
                    }
                    break;
                case 3:
                    if (8 * sizeof(int) > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
                            return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
                        }
                    }
                    break;
                case -4:
                    if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) {
                            return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
                        }
                    }
                    break;
                case 4:
                    if (8 * sizeof(int) > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) {
                            return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
                        }
                    }
                    break;
            }
#endif
            if (sizeof(int) <= sizeof(long)) {
                __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x))
            } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) {
                __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x))
            }
        }
        {
#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
            PyErr_SetString(PyExc_RuntimeError,
                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
#else
            int val;
            PyObject *v = __Pyx_PyNumber_IntOrLong(x);
 #if PY_MAJOR_VERSION < 3
            if (likely(v) && !PyLong_Check(v)) {
                PyObject *tmp = v;
                v = PyNumber_Long(tmp);
                Py_DECREF(tmp);
            }
 #endif
            if (likely(v)) {
                int one = 1; int is_little = (int)*(unsigned char *)&one;
                unsigned char *bytes = (unsigned char *)&val;
                int ret = _PyLong_AsByteArray((PyLongObject *)v,
                                              bytes, sizeof(val),
                                              is_little, !is_unsigned);
                Py_DECREF(v);
                if (likely(!ret))
                    return val;
            }
#endif
            return (int) -1;
        }
    } else {
        int val;
        PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
        if (!tmp) return (int) -1;
        val = __Pyx_PyInt_As_int(tmp);
        Py_DECREF(tmp);
        return val;
    }
raise_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "value too large to convert to int");
    return (int) -1;
raise_neg_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "can't convert negative value to int");
    return (int) -1;
}

/* CIntFromPy */
                static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) {
    const long neg_one = (long) -1, const_zero = (long) 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_MAJOR_VERSION < 3
    if (likely(PyInt_Check(x))) {
        if (sizeof(long) < sizeof(long)) {
            __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x))
        } else {
            long val = PyInt_AS_LONG(x);
            if (is_unsigned && unlikely(val < 0)) {
                goto raise_neg_overflow;
            }
            return (long) val;
        }
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
#if CYTHON_USE_PYLONG_INTERNALS
            const digit* digits = ((PyLongObject*)x)->ob_digit;
            switch (Py_SIZE(x)) {
                case  0: return (long) 0;
                case  1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0])
                case 2:
                    if (8 * sizeof(long) > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) {
                            return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]));
                        }
                    }
                    break;
                case 3:
                    if (8 * sizeof(long) > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) {
                            return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]));
                        }
                    }
                    break;
                case 4:
                    if (8 * sizeof(long) > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) {
                            return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]));
                        }
                    }
                    break;
            }
#endif
#if CYTHON_COMPILING_IN_CPYTHON
            if (unlikely(Py_SIZE(x) < 0)) {
                goto raise_neg_overflow;
            }
#else
            {
                int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
                if (unlikely(result < 0))
                    return (long) -1;
                if (unlikely(result == 1))
                    goto raise_neg_overflow;
            }
#endif
            if (sizeof(long) <= sizeof(unsigned long)) {
                __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x))
            } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) {
                __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
            }
        } else {
#if CYTHON_USE_PYLONG_INTERNALS
            const digit* digits = ((PyLongObject*)x)->ob_digit;
            switch (Py_SIZE(x)) {
                case  0: return (long) 0;
                case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0]))
                case  1: __PYX_VERIFY_RETURN_INT(long,  digit, +digits[0])
                case -2:
                    if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                            return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
                        }
                    }
                    break;
                case 2:
                    if (8 * sizeof(long) > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                            return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
                        }
                    }
                    break;
                case -3:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                            return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
                        }
                    }
                    break;
                case 3:
                    if (8 * sizeof(long) > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                            return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
                        }
                    }
                    break;
                case -4:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                            return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
                        }
                    }
                    break;
                case 4:
                    if (8 * sizeof(long) > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                            return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
                        }
                    }
                    break;
            }
#endif
            if (sizeof(long) <= sizeof(long)) {
                __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x))
            } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) {
                __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x))
            }
        }
        {
#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
            PyErr_SetString(PyExc_RuntimeError,
                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
#else
            long val;
            PyObject *v = __Pyx_PyNumber_IntOrLong(x);
 #if PY_MAJOR_VERSION < 3
            if (likely(v) && !PyLong_Check(v)) {
                PyObject *tmp = v;
                v = PyNumber_Long(tmp);
                Py_DECREF(tmp);
            }
 #endif
            if (likely(v)) {
                int one = 1; int is_little = (int)*(unsigned char *)&one;
                unsigned char *bytes = (unsigned char *)&val;
                int ret = _PyLong_AsByteArray((PyLongObject *)v,
                                              bytes, sizeof(val),
                                              is_little, !is_unsigned);
                Py_DECREF(v);
                if (likely(!ret))
                    return val;
            }
#endif
            return (long) -1;
        }
    } else {
        long val;
        PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
        if (!tmp) return (long) -1;
        val = __Pyx_PyInt_As_long(tmp);
        Py_DECREF(tmp);
        return val;
    }
raise_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "value too large to convert to long");
    return (long) -1;
raise_neg_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "can't convert negative value to long");
    return (long) -1;
}

/* CIntFromPy */
                static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *x) {
    const size_t neg_one = (size_t) -1, const_zero = (size_t) 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_MAJOR_VERSION < 3
    if (likely(PyInt_Check(x))) {
        if (sizeof(size_t) < sizeof(long)) {
            __PYX_VERIFY_RETURN_INT(size_t, long, PyInt_AS_LONG(x))
        } else {
            long val = PyInt_AS_LONG(x);
            if (is_unsigned && unlikely(val < 0)) {
                goto raise_neg_overflow;
            }
            return (size_t) val;
        }
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
#if CYTHON_USE_PYLONG_INTERNALS
            const digit* digits = ((PyLongObject*)x)->ob_digit;
            switch (Py_SIZE(x)) {
                case  0: return (size_t) 0;
                case  1: __PYX_VERIFY_RETURN_INT(size_t, digit, digits[0])
                case 2:
                    if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(size_t) >= 2 * PyLong_SHIFT) {
                            return (size_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
                        }
                    }
                    break;
                case 3:
                    if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(size_t) >= 3 * PyLong_SHIFT) {
                            return (size_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
                        }
                    }
                    break;
                case 4:
                    if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(size_t) >= 4 * PyLong_SHIFT) {
                            return (size_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
                        }
                    }
                    break;
            }
#endif
#if CYTHON_COMPILING_IN_CPYTHON
            if (unlikely(Py_SIZE(x) < 0)) {
                goto raise_neg_overflow;
            }
#else
            {
                int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
                if (unlikely(result < 0))
                    return (size_t) -1;
                if (unlikely(result == 1))
                    goto raise_neg_overflow;
            }
#endif
            if (sizeof(size_t) <= sizeof(unsigned long)) {
                __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned long, PyLong_AsUnsignedLong(x))
            } else if (sizeof(size_t) <= sizeof(unsigned PY_LONG_LONG)) {
                __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
            }
        } else {
#if CYTHON_USE_PYLONG_INTERNALS
            const digit* digits = ((PyLongObject*)x)->ob_digit;
            switch (Py_SIZE(x)) {
                case  0: return (size_t) 0;
                case -1: __PYX_VERIFY_RETURN_INT(size_t, sdigit, (sdigit) (-(sdigit)digits[0]))
                case  1: __PYX_VERIFY_RETURN_INT(size_t,  digit, +digits[0])
                case -2:
                    if (8 * sizeof(size_t) - 1 > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) {
                            return (size_t) (((size_t)-1)*(((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])));
                        }
                    }
                    break;
                case 2:
                    if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) {
                            return (size_t) ((((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])));
                        }
                    }
                    break;
                case -3:
                    if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) {
                            return (size_t) (((size_t)-1)*(((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])));
                        }
                    }
                    break;
                case 3:
                    if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) {
                            return (size_t) ((((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])));
                        }
                    }
                    break;
                case -4:
                    if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) {
                            return (size_t) (((size_t)-1)*(((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])));
                        }
                    }
                    break;
                case 4:
                    if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) {
                            return (size_t) ((((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])));
                        }
                    }
                    break;
            }
#endif
            if (sizeof(size_t) <= sizeof(long)) {
                __PYX_VERIFY_RETURN_INT_EXC(size_t, long, PyLong_AsLong(x))
            } else if (sizeof(size_t) <= sizeof(PY_LONG_LONG)) {
                __PYX_VERIFY_RETURN_INT_EXC(size_t, PY_LONG_LONG, PyLong_AsLongLong(x))
            }
        }
        {
#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
            PyErr_SetString(PyExc_RuntimeError,
                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
#else
            size_t val;
            PyObject *v = __Pyx_PyNumber_IntOrLong(x);
 #if PY_MAJOR_VERSION < 3
            if (likely(v) && !PyLong_Check(v)) {
                PyObject *tmp = v;
                v = PyNumber_Long(tmp);
                Py_DECREF(tmp);
            }
 #endif
            if (likely(v)) {
                int one = 1; int is_little = (int)*(unsigned char *)&one;
                unsigned char *bytes = (unsigned char *)&val;
                int ret = _PyLong_AsByteArray((PyLongObject *)v,
                                              bytes, sizeof(val),
                                              is_little, !is_unsigned);
                Py_DECREF(v);
                if (likely(!ret))
                    return val;
            }
#endif
            return (size_t) -1;
        }
    } else {
        size_t val;
        PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
        if (!tmp) return (size_t) -1;
        val = __Pyx_PyInt_As_size_t(tmp);
        Py_DECREF(tmp);
        return val;
    }
raise_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "value too large to convert to size_t");
    return (size_t) -1;
raise_neg_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "can't convert negative value to size_t");
    return (size_t) -1;
}

/* FetchCommonType */
                static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) {
    PyObject* fake_module;
    PyTypeObject* cached_type = NULL;
    fake_module = PyImport_AddModule((char*) "_cython_" CYTHON_ABI);
    if (!fake_module) return NULL;
    Py_INCREF(fake_module);
    cached_type = (PyTypeObject*) PyObject_GetAttrString(fake_module, type->tp_name);
    if (cached_type) {
        if (!PyType_Check((PyObject*)cached_type)) {
            PyErr_Format(PyExc_TypeError,
                "Shared Cython type %.200s is not a type object",
                type->tp_name);
            goto bad;
        }
        if (cached_type->tp_basicsize != type->tp_basicsize) {
            PyErr_Format(PyExc_TypeError,
                "Shared Cython type %.200s has the wrong size, try recompiling",
                type->tp_name);
            goto bad;
        }
    } else {
        if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad;
        PyErr_Clear();
        if (PyType_Ready(type) < 0) goto bad;
        if (PyObject_SetAttrString(fake_module, type->tp_name, (PyObject*) type) < 0)
            goto bad;
        Py_INCREF(type);
        cached_type = type;
    }
done:
    Py_DECREF(fake_module);
    return cached_type;
bad:
    Py_XDECREF(cached_type);
    cached_type = NULL;
    goto done;
}

/* CoroutineBase */
                #include <structmember.h>
#include <frameobject.h>
static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value);
static PyObject *__Pyx_Coroutine_Close(PyObject *self);
static PyObject *__Pyx_Coroutine_Throw(PyObject *gen, PyObject *args);
#define __Pyx_Coroutine_Undelegate(gen) Py_CLEAR((gen)->yieldfrom)
#if 1 || PY_VERSION_HEX < 0x030300B0
static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue) {
    PyObject *et, *ev, *tb;
    PyObject *value = NULL;
    __Pyx_PyThreadState_declare
    __Pyx_PyThreadState_assign
    __Pyx_ErrFetch(&et, &ev, &tb);
    if (!et) {
        Py_XDECREF(tb);
        Py_XDECREF(ev);
        Py_INCREF(Py_None);
        *pvalue = Py_None;
        return 0;
    }
    if (likely(et == PyExc_StopIteration)) {
#if PY_VERSION_HEX >= 0x030300A0
        if (ev && Py_TYPE(ev) == (PyTypeObject*)PyExc_StopIteration) {
            value = ((PyStopIterationObject *)ev)->value;
            Py_INCREF(value);
            Py_DECREF(ev);
            Py_XDECREF(tb);
            Py_DECREF(et);
            *pvalue = value;
            return 0;
        }
#endif
        if (!ev || !PyObject_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration)) {
            if (!ev) {
                Py_INCREF(Py_None);
                ev = Py_None;
            } else if (PyTuple_Check(ev)) {
                if (PyTuple_GET_SIZE(ev) >= 1) {
                    PyObject *value;
#if CYTHON_COMPILING_IN_CPYTHON
                    value = PySequence_ITEM(ev, 0);
#else
                    value = PyTuple_GET_ITEM(ev, 0);
                    Py_INCREF(value);
#endif
                    Py_DECREF(ev);
                    ev = value;
                } else {
                    Py_INCREF(Py_None);
                    Py_DECREF(ev);
                    ev = Py_None;
                }
            }
            Py_XDECREF(tb);
            Py_DECREF(et);
            *pvalue = ev;
            return 0;
        }
    } else if (!PyErr_GivenExceptionMatches(et, PyExc_StopIteration)) {
        __Pyx_ErrRestore(et, ev, tb);
        return -1;
    }
    PyErr_NormalizeException(&et, &ev, &tb);
    if (unlikely(!PyObject_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration))) {
        __Pyx_ErrRestore(et, ev, tb);
        return -1;
    }
    Py_XDECREF(tb);
    Py_DECREF(et);
#if PY_VERSION_HEX >= 0x030300A0
    value = ((PyStopIterationObject *)ev)->value;
    Py_INCREF(value);
    Py_DECREF(ev);
#else
    {
        PyObject* args = __Pyx_PyObject_GetAttrStr(ev, __pyx_n_s_args);
        Py_DECREF(ev);
        if (likely(args)) {
            value = PySequence_GetItem(args, 0);
            Py_DECREF(args);
        }
        if (unlikely(!value)) {
            __Pyx_ErrRestore(NULL, NULL, NULL);
            Py_INCREF(Py_None);
            value = Py_None;
        }
    }
#endif
    *pvalue = value;
    return 0;
}
#endif
static CYTHON_INLINE
void __Pyx_Coroutine_ExceptionClear(__pyx_CoroutineObject *self) {
    PyObject *exc_type = self->exc_type;
    PyObject *exc_value = self->exc_value;
    PyObject *exc_traceback = self->exc_traceback;
    self->exc_type = NULL;
    self->exc_value = NULL;
    self->exc_traceback = NULL;
    Py_XDECREF(exc_type);
    Py_XDECREF(exc_value);
    Py_XDECREF(exc_traceback);
}
static CYTHON_INLINE
int __Pyx_Coroutine_CheckRunning(__pyx_CoroutineObject *gen) {
    if (unlikely(gen->is_running)) {
        PyErr_SetString(PyExc_ValueError,
                        "generator already executing");
        return 1;
    }
    return 0;
}
static CYTHON_INLINE
PyObject *__Pyx_Coroutine_SendEx(__pyx_CoroutineObject *self, PyObject *value) {
    PyObject *retval;
    __Pyx_PyThreadState_declare
    assert(!self->is_running);
    if (unlikely(self->resume_label == 0)) {
        if (unlikely(value && value != Py_None)) {
            PyErr_SetString(PyExc_TypeError,
                            "can't send non-None value to a "
                            "just-started generator");
            return NULL;
        }
    }
    if (unlikely(self->resume_label == -1)) {
        PyErr_SetNone(PyExc_StopIteration);
        return NULL;
    }
    __Pyx_PyThreadState_assign
    if (value) {
#if CYTHON_COMPILING_IN_PYPY
#else
        if (self->exc_traceback) {
            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
            PyFrameObject *f = tb->tb_frame;
            Py_XINCREF(__pyx_tstate->frame);
            assert(f->f_back == NULL);
            f->f_back = __pyx_tstate->frame;
        }
#endif
        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
                            &self->exc_traceback);
    } else {
        __Pyx_Coroutine_ExceptionClear(self);
    }
    self->is_running = 1;
    retval = self->body((PyObject *) self, value);
    self->is_running = 0;
    if (retval) {
        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
                            &self->exc_traceback);
#if CYTHON_COMPILING_IN_PYPY
#else
        if (self->exc_traceback) {
            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
            PyFrameObject *f = tb->tb_frame;
            Py_CLEAR(f->f_back);
        }
#endif
    } else {
        __Pyx_Coroutine_ExceptionClear(self);
    }
    return retval;
}
static CYTHON_INLINE
PyObject *__Pyx_Coroutine_MethodReturn(PyObject *retval) {
    if (unlikely(!retval && !PyErr_Occurred())) {
        PyErr_SetNone(PyExc_StopIteration);
    }
    return retval;
}
static CYTHON_INLINE
PyObject *__Pyx_Coroutine_FinishDelegation(__pyx_CoroutineObject *gen) {
    PyObject *ret;
    PyObject *val = NULL;
    __Pyx_Coroutine_Undelegate(gen);
    __Pyx_PyGen_FetchStopIterationValue(&val);
    ret = __Pyx_Coroutine_SendEx(gen, val);
    Py_XDECREF(val);
    return ret;
}
static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) {
    PyObject *retval;
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self;
    PyObject *yf = gen->yieldfrom;
    if (unlikely(__Pyx_Coroutine_CheckRunning(gen)))
        return NULL;
    if (yf) {
        PyObject *ret;
        gen->is_running = 1;
        #ifdef __Pyx_Generator_USED
        if (__Pyx_Generator_CheckExact(yf)) {
            ret = __Pyx_Coroutine_Send(yf, value);
        } else
        #endif
        #ifdef __Pyx_Coroutine_USED
        if (__Pyx_Coroutine_CheckExact(yf)) {
            ret = __Pyx_Coroutine_Send(yf, value);
        } else
        #endif
        {
            if (value == Py_None)
                ret = Py_TYPE(yf)->tp_iternext(yf);
            else
                ret = __Pyx_PyObject_CallMethod1(yf, __pyx_n_s_send, value);
        }
        gen->is_running = 0;
        if (likely(ret)) {
            return ret;
        }
        retval = __Pyx_Coroutine_FinishDelegation(gen);
    } else {
        retval = __Pyx_Coroutine_SendEx(gen, value);
    }
    return __Pyx_Coroutine_MethodReturn(retval);
}
static int __Pyx_Coroutine_CloseIter(__pyx_CoroutineObject *gen, PyObject *yf) {
    PyObject *retval = NULL;
    int err = 0;
    #ifdef __Pyx_Generator_USED
    if (__Pyx_Generator_CheckExact(yf)) {
        retval = __Pyx_Coroutine_Close(yf);
        if (!retval)
            return -1;
    } else
    #endif
    #ifdef __Pyx_Coroutine_USED
    if (__Pyx_Coroutine_CheckExact(yf)) {
        retval = __Pyx_Coroutine_Close(yf);
        if (!retval)
            return -1;
    } else
    #endif
    {
        PyObject *meth;
        gen->is_running = 1;
        meth = __Pyx_PyObject_GetAttrStr(yf, __pyx_n_s_close);
        if (unlikely(!meth)) {
            if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
                PyErr_WriteUnraisable(yf);
            }
            PyErr_Clear();
        } else {
            retval = PyObject_CallFunction(meth, NULL);
            Py_DECREF(meth);
            if (!retval)
                err = -1;
        }
        gen->is_running = 0;
    }
    Py_XDECREF(retval);
    return err;
}
static PyObject *__Pyx_Generator_Next(PyObject *self) {
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self;
    PyObject *yf = gen->yieldfrom;
    if (unlikely(__Pyx_Coroutine_CheckRunning(gen)))
        return NULL;
    if (yf) {
        PyObject *ret;
        gen->is_running = 1;
        ret = Py_TYPE(yf)->tp_iternext(yf);
        gen->is_running = 0;
        if (likely(ret)) {
            return ret;
        }
        return __Pyx_Coroutine_FinishDelegation(gen);
    }
    return __Pyx_Coroutine_SendEx(gen, Py_None);
}
static PyObject *__Pyx_Coroutine_Close(PyObject *self) {
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
    PyObject *retval, *raised_exception;
    PyObject *yf = gen->yieldfrom;
    int err = 0;
    if (unlikely(__Pyx_Coroutine_CheckRunning(gen)))
        return NULL;
    if (yf) {
        Py_INCREF(yf);
        err = __Pyx_Coroutine_CloseIter(gen, yf);
        __Pyx_Coroutine_Undelegate(gen);
        Py_DECREF(yf);
    }
    if (err == 0)
        PyErr_SetNone(PyExc_GeneratorExit);
    retval = __Pyx_Coroutine_SendEx(gen, NULL);
    if (retval) {
        Py_DECREF(retval);
        PyErr_SetString(PyExc_RuntimeError,
                        "generator ignored GeneratorExit");
        return NULL;
    }
    raised_exception = PyErr_Occurred();
    if (!raised_exception
        || raised_exception == PyExc_StopIteration
        || raised_exception == PyExc_GeneratorExit
        || PyErr_GivenExceptionMatches(raised_exception, PyExc_GeneratorExit)
        || PyErr_GivenExceptionMatches(raised_exception, PyExc_StopIteration))
    {
        if (raised_exception) PyErr_Clear();
        Py_INCREF(Py_None);
        return Py_None;
    }
    return NULL;
}
static PyObject *__Pyx_Coroutine_Throw(PyObject *self, PyObject *args) {
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
    PyObject *typ;
    PyObject *tb = NULL;
    PyObject *val = NULL;
    PyObject *yf = gen->yieldfrom;
    if (!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb))
        return NULL;
    if (unlikely(__Pyx_Coroutine_CheckRunning(gen)))
        return NULL;
    if (yf) {
        PyObject *ret;
        Py_INCREF(yf);
        if (PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit)) {
            int err = __Pyx_Coroutine_CloseIter(gen, yf);
            Py_DECREF(yf);
            __Pyx_Coroutine_Undelegate(gen);
            if (err < 0)
                return __Pyx_Coroutine_MethodReturn(__Pyx_Coroutine_SendEx(gen, NULL));
            goto throw_here;
        }
        gen->is_running = 1;
        #ifdef __Pyx_Generator_USED
        if (__Pyx_Generator_CheckExact(yf)) {
            ret = __Pyx_Coroutine_Throw(yf, args);
        } else
        #endif
        #ifdef __Pyx_Coroutine_USED
        if (__Pyx_Coroutine_CheckExact(yf)) {
            ret = __Pyx_Coroutine_Throw(yf, args);
        } else
        #endif
        {
            PyObject *meth = __Pyx_PyObject_GetAttrStr(yf, __pyx_n_s_throw);
            if (unlikely(!meth)) {
                Py_DECREF(yf);
                if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
                    gen->is_running = 0;
                    return NULL;
                }
                PyErr_Clear();
                __Pyx_Coroutine_Undelegate(gen);
                gen->is_running = 0;
                goto throw_here;
            }
            ret = PyObject_CallObject(meth, args);
            Py_DECREF(meth);
        }
        gen->is_running = 0;
        Py_DECREF(yf);
        if (!ret) {
            ret = __Pyx_Coroutine_FinishDelegation(gen);
        }
        return __Pyx_Coroutine_MethodReturn(ret);
    }
throw_here:
    __Pyx_Raise(typ, val, tb, NULL);
    return __Pyx_Coroutine_MethodReturn(__Pyx_Coroutine_SendEx(gen, NULL));
}
static int __Pyx_Coroutine_traverse(PyObject *self, visitproc visit, void *arg) {
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
    Py_VISIT(gen->closure);
    Py_VISIT(gen->classobj);
    Py_VISIT(gen->yieldfrom);
    Py_VISIT(gen->exc_type);
    Py_VISIT(gen->exc_value);
    Py_VISIT(gen->exc_traceback);
    return 0;
}
static int __Pyx_Coroutine_clear(PyObject *self) {
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
    Py_CLEAR(gen->closure);
    Py_CLEAR(gen->classobj);
    Py_CLEAR(gen->yieldfrom);
    Py_CLEAR(gen->exc_type);
    Py_CLEAR(gen->exc_value);
    Py_CLEAR(gen->exc_traceback);
    Py_CLEAR(gen->gi_name);
    Py_CLEAR(gen->gi_qualname);
    return 0;
}
static void __Pyx_Coroutine_dealloc(PyObject *self) {
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
    PyObject_GC_UnTrack(gen);
    if (gen->gi_weakreflist != NULL)
        PyObject_ClearWeakRefs(self);
    if (gen->resume_label > 0) {
        PyObject_GC_Track(self);
#if PY_VERSION_HEX >= 0x030400a1
        if (PyObject_CallFinalizerFromDealloc(self))
#else
        Py_TYPE(gen)->tp_del(self);
        if (self->ob_refcnt > 0)
#endif
        {
            return;
        }
        PyObject_GC_UnTrack(self);
    }
    __Pyx_Coroutine_clear(self);
    PyObject_GC_Del(gen);
}
static void __Pyx_Coroutine_del(PyObject *self) {
    PyObject *res;
    PyObject *error_type, *error_value, *error_traceback;
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
    __Pyx_PyThreadState_declare
    if (gen->resume_label <= 0)
        return ;
#if PY_VERSION_HEX < 0x030400a1
    assert(self->ob_refcnt == 0);
    self->ob_refcnt = 1;
#endif
    __Pyx_PyThreadState_assign
    __Pyx_ErrFetch(&error_type, &error_value, &error_traceback);
    res = __Pyx_Coroutine_Close(self);
    if (res == NULL)
        PyErr_WriteUnraisable(self);
    else
        Py_DECREF(res);
    __Pyx_ErrRestore(error_type, error_value, error_traceback);
#if PY_VERSION_HEX < 0x030400a1
    assert(self->ob_refcnt > 0);
    if (--self->ob_refcnt == 0) {
        return;
    }
    {
        Py_ssize_t refcnt = self->ob_refcnt;
        _Py_NewReference(self);
        self->ob_refcnt = refcnt;
    }
#if CYTHON_COMPILING_IN_CPYTHON
    assert(PyType_IS_GC(self->ob_type) &&
           _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
    _Py_DEC_REFTOTAL;
#endif
#ifdef COUNT_ALLOCS
    --Py_TYPE(self)->tp_frees;
    --Py_TYPE(self)->tp_allocs;
#endif
#endif
}
static PyObject *
__Pyx_Coroutine_get_name(__pyx_CoroutineObject *self)
{
    Py_INCREF(self->gi_name);
    return self->gi_name;
}
static int
__Pyx_Coroutine_set_name(__pyx_CoroutineObject *self, PyObject *value)
{
    PyObject *tmp;
#if PY_MAJOR_VERSION >= 3
    if (unlikely(value == NULL || !PyUnicode_Check(value))) {
#else
    if (unlikely(value == NULL || !PyString_Check(value))) {
#endif
        PyErr_SetString(PyExc_TypeError,
                        "__name__ must be set to a string object");
        return -1;
    }
    tmp = self->gi_name;
    Py_INCREF(value);
    self->gi_name = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_Coroutine_get_qualname(__pyx_CoroutineObject *self)
{
    Py_INCREF(self->gi_qualname);
    return self->gi_qualname;
}
static int
__Pyx_Coroutine_set_qualname(__pyx_CoroutineObject *self, PyObject *value)
{
    PyObject *tmp;
#if PY_MAJOR_VERSION >= 3
    if (unlikely(value == NULL || !PyUnicode_Check(value))) {
#else
    if (unlikely(value == NULL || !PyString_Check(value))) {
#endif
        PyErr_SetString(PyExc_TypeError,
                        "__qualname__ must be set to a string object");
        return -1;
    }
    tmp = self->gi_qualname;
    Py_INCREF(value);
    self->gi_qualname = value;
    Py_XDECREF(tmp);
    return 0;
}
static __pyx_CoroutineObject *__Pyx__Coroutine_New(PyTypeObject* type, __pyx_coroutine_body_t body,
                                                   PyObject *closure, PyObject *name, PyObject *qualname) {
    __pyx_CoroutineObject *gen = PyObject_GC_New(__pyx_CoroutineObject, type);
    if (gen == NULL)
        return NULL;
    gen->body = body;
    gen->closure = closure;
    Py_XINCREF(closure);
    gen->is_running = 0;
    gen->resume_label = 0;
    gen->classobj = NULL;
    gen->yieldfrom = NULL;
    gen->exc_type = NULL;
    gen->exc_value = NULL;
    gen->exc_traceback = NULL;
    gen->gi_weakreflist = NULL;
    Py_XINCREF(qualname);
    gen->gi_qualname = qualname;
    Py_XINCREF(name);
    gen->gi_name = name;
    PyObject_GC_Track(gen);
    return gen;
}

/* PatchModuleWithCoroutine */
                    static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code) {
#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
    int result;
    PyObject *globals, *result_obj;
    globals = PyDict_New();  if (unlikely(!globals)) goto ignore;
    result = PyDict_SetItemString(globals, "_cython_coroutine_type",
    #ifdef __Pyx_Coroutine_USED
        (PyObject*)__pyx_CoroutineType);
    #else
        Py_None);
    #endif
    if (unlikely(result < 0)) goto ignore;
    result = PyDict_SetItemString(globals, "_cython_generator_type",
    #ifdef __Pyx_Generator_USED
        (PyObject*)__pyx_GeneratorType);
    #else
        Py_None);
    #endif
    if (unlikely(result < 0)) goto ignore;
    if (unlikely(PyDict_SetItemString(globals, "_module", module) < 0)) goto ignore;
    if (unlikely(PyDict_SetItemString(globals, "__builtins__", __pyx_b) < 0)) goto ignore;
    result_obj = PyRun_String(py_code, Py_file_input, globals, globals);
    if (unlikely(!result_obj)) goto ignore;
    Py_DECREF(result_obj);
    Py_DECREF(globals);
    return module;
ignore:
    Py_XDECREF(globals);
    PyErr_WriteUnraisable(module);
    if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, "Cython module failed to patch module with custom type", 1) < 0)) {
        Py_DECREF(module);
        module = NULL;
    }
#else
    py_code++;
#endif
    return module;
}

/* PatchGeneratorABC */
                    #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
static PyObject* __Pyx_patch_abc_module(PyObject *module);
static PyObject* __Pyx_patch_abc_module(PyObject *module) {
    module = __Pyx_Coroutine_patch_module(
        module, ""
"if _cython_generator_type is not None:\n"
"    try: Generator = _module.Generator\n"
"    except AttributeError: pass\n"
"    else: Generator.register(_cython_generator_type)\n"
"if _cython_coroutine_type is not None:\n"
"    try: Coroutine = _module.Coroutine\n"
"    except AttributeError: pass\n"
"    else: Coroutine.register(_cython_coroutine_type)\n"
    );
    return module;
}
#endif
static int __Pyx_patch_abc(void) {
#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
    static int abc_patched = 0;
    if (!abc_patched) {
        PyObject *module;
        module = PyImport_ImportModule((PY_VERSION_HEX >= 0x03030000) ? "collections.abc" : "collections");
        if (!module) {
            PyErr_WriteUnraisable(NULL);
            if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning,
                    ((PY_VERSION_HEX >= 0x03030000) ?
                        "Cython module failed to register with collections.abc module" :
                        "Cython module failed to register with collections module"), 1) < 0)) {
                return -1;
            }
        } else {
            module = __Pyx_patch_abc_module(module);
            abc_patched = 1;
            if (unlikely(!module))
                return -1;
            Py_DECREF(module);
        }
        module = PyImport_ImportModule("backports_abc");
        if (module) {
            module = __Pyx_patch_abc_module(module);
            Py_XDECREF(module);
        }
        if (!module) {
            PyErr_Clear();
        }
    }
#else
    if (0) __Pyx_Coroutine_patch_module(NULL, NULL);
#endif
    return 0;
}

/* Generator */
                    static PyMethodDef __pyx_Generator_methods[] = {
    {"send", (PyCFunction) __Pyx_Coroutine_Send, METH_O,
     (char*) PyDoc_STR("send(arg) -> send 'arg' into generator,\nreturn next yielded value or raise StopIteration.")},
    {"throw", (PyCFunction) __Pyx_Coroutine_Throw, METH_VARARGS,
     (char*) PyDoc_STR("throw(typ[,val[,tb]]) -> raise exception in generator,\nreturn next yielded value or raise StopIteration.")},
    {"close", (PyCFunction) __Pyx_Coroutine_Close, METH_NOARGS,
     (char*) PyDoc_STR("close() -> raise GeneratorExit inside generator.")},
    {0, 0, 0, 0}
};
static PyMemberDef __pyx_Generator_memberlist[] = {
    {(char *) "gi_running", T_BOOL, offsetof(__pyx_CoroutineObject, is_running), READONLY, NULL},
    {(char*) "gi_yieldfrom", T_OBJECT, offsetof(__pyx_CoroutineObject, yieldfrom), READONLY,
     (char*) PyDoc_STR("object being iterated by 'yield from', or None")},
    {0, 0, 0, 0, 0}
};
static PyGetSetDef __pyx_Generator_getsets[] = {
    {(char *) "__name__", (getter)__Pyx_Coroutine_get_name, (setter)__Pyx_Coroutine_set_name,
     (char*) PyDoc_STR("name of the generator"), 0},
    {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname,
     (char*) PyDoc_STR("qualified name of the generator"), 0},
    {0, 0, 0, 0, 0}
};
static PyTypeObject __pyx_GeneratorType_type = {
    PyVarObject_HEAD_INIT(0, 0)
    "generator",
    sizeof(__pyx_CoroutineObject),
    0,
    (destructor) __Pyx_Coroutine_dealloc,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE,
    0,
    (traverseproc) __Pyx_Coroutine_traverse,
    0,
    0,
    offsetof(__pyx_CoroutineObject, gi_weakreflist),
    0,
    (iternextfunc) __Pyx_Generator_Next,
    __pyx_Generator_methods,
    __pyx_Generator_memberlist,
    __pyx_Generator_getsets,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
#if PY_VERSION_HEX >= 0x030400a1
    0,
#else
    __Pyx_Coroutine_del,
#endif
    0,
#if PY_VERSION_HEX >= 0x030400a1
    __Pyx_Coroutine_del,
#endif
};
static int __pyx_Generator_init(void) {
    __pyx_GeneratorType_type.tp_getattro = PyObject_GenericGetAttr;
    __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter;
    __pyx_GeneratorType = __Pyx_FetchCommonType(&__pyx_GeneratorType_type);
    if (unlikely(!__pyx_GeneratorType)) {
        return -1;
    }
    return 0;
}

/* CheckBinaryVersion */
                    static int __Pyx_check_binary_version(void) {
    char ctversion[4], rtversion[4];
    PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION);
    PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion());
    if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) {
        char message[200];
        PyOS_snprintf(message, sizeof(message),
                      "compiletime version %s of module '%.100s' "
                      "does not match runtime version %s",
                      ctversion, __Pyx_MODULE_NAME, rtversion);
        return PyErr_WarnEx(NULL, message, 1);
    }
    return 0;
}

/* FunctionExport */
                    static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig) {
    PyObject *d = 0;
    PyObject *cobj = 0;
    union {
        void (*fp)(void);
        void *p;
    } tmp;
    d = PyObject_GetAttrString(__pyx_m, (char *)"__pyx_capi__");
    if (!d) {
        PyErr_Clear();
        d = PyDict_New();
        if (!d)
            goto bad;
        Py_INCREF(d);
        if (PyModule_AddObject(__pyx_m, (char *)"__pyx_capi__", d) < 0)
            goto bad;
    }
    tmp.fp = f;
#if PY_VERSION_HEX >= 0x02070000
    cobj = PyCapsule_New(tmp.p, sig, 0);
#else
    cobj = PyCObject_FromVoidPtrAndDesc(tmp.p, (void *)sig, 0);
#endif
    if (!cobj)
        goto bad;
    if (PyDict_SetItemString(d, name, cobj) < 0)
        goto bad;
    Py_DECREF(cobj);
    Py_DECREF(d);
    return 0;
bad:
    Py_XDECREF(cobj);
    Py_XDECREF(d);
    return -1;
}

/* InitStrings */
                    static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
    while (t->p) {
        #if PY_MAJOR_VERSION < 3
        if (t->is_unicode) {
            *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL);
        } else if (t->intern) {
            *t->p = PyString_InternFromString(t->s);
        } else {
            *t->p = PyString_FromStringAndSize(t->s, t->n - 1);
        }
        #else
        if (t->is_unicode | t->is_str) {
            if (t->intern) {
                *t->p = PyUnicode_InternFromString(t->s);
            } else if (t->encoding) {
                *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL);
            } else {
                *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);
            }
        } else {
            *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1);
        }
        #endif
        if (!*t->p)
            return -1;
        ++t;
    }
    return 0;
}

static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) {
    return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str));
}
static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) {
    Py_ssize_t ignore;
    return __Pyx_PyObject_AsStringAndSize(o, &ignore);
}
static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) {
#if CYTHON_COMPILING_IN_CPYTHON && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
    if (
#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
            __Pyx_sys_getdefaultencoding_not_ascii &&
#endif
            PyUnicode_Check(o)) {
#if PY_VERSION_HEX < 0x03030000
        char* defenc_c;
        PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL);
        if (!defenc) return NULL;
        defenc_c = PyBytes_AS_STRING(defenc);
#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
        {
            char* end = defenc_c + PyBytes_GET_SIZE(defenc);
            char* c;
            for (c = defenc_c; c < end; c++) {
                if ((unsigned char) (*c) >= 128) {
                    PyUnicode_AsASCIIString(o);
                    return NULL;
                }
            }
        }
#endif
        *length = PyBytes_GET_SIZE(defenc);
        return defenc_c;
#else
        if (__Pyx_PyUnicode_READY(o) == -1) return NULL;
#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
        if (PyUnicode_IS_ASCII(o)) {
            *length = PyUnicode_GET_LENGTH(o);
            return PyUnicode_AsUTF8(o);
        } else {
            PyUnicode_AsASCIIString(o);
            return NULL;
        }
#else
        return PyUnicode_AsUTF8AndSize(o, length);
#endif
#endif
    } else
#endif
#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE))
    if (PyByteArray_Check(o)) {
        *length = PyByteArray_GET_SIZE(o);
        return PyByteArray_AS_STRING(o);
    } else
#endif
    {
        char* result;
        int r = PyBytes_AsStringAndSize(o, &result, length);
        if (unlikely(r < 0)) {
            return NULL;
        } else {
            return result;
        }
    }
}
static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
   int is_true = x == Py_True;
   if (is_true | (x == Py_False) | (x == Py_None)) return is_true;
   else return PyObject_IsTrue(x);
}
static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) {
  PyNumberMethods *m;
  const char *name = NULL;
  PyObject *res = NULL;
#if PY_MAJOR_VERSION < 3
  if (PyInt_Check(x) || PyLong_Check(x))
#else
  if (PyLong_Check(x))
#endif
    return __Pyx_NewRef(x);
  m = Py_TYPE(x)->tp_as_number;
#if PY_MAJOR_VERSION < 3
  if (m && m->nb_int) {
    name = "int";
    res = PyNumber_Int(x);
  }
  else if (m && m->nb_long) {
    name = "long";
    res = PyNumber_Long(x);
  }
#else
  if (m && m->nb_int) {
    name = "int";
    res = PyNumber_Long(x);
  }
#endif
  if (res) {
#if PY_MAJOR_VERSION < 3
    if (!PyInt_Check(res) && !PyLong_Check(res)) {
#else
    if (!PyLong_Check(res)) {
#endif
      PyErr_Format(PyExc_TypeError,
                   "__%.4s__ returned non-%.4s (type %.200s)",
                   name, name, Py_TYPE(res)->tp_name);
      Py_DECREF(res);
      return NULL;
    }
  }
  else if (!PyErr_Occurred()) {
    PyErr_SetString(PyExc_TypeError,
                    "an integer is required");
  }
  return res;
}
static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
  Py_ssize_t ival;
  PyObject *x;
#if PY_MAJOR_VERSION < 3
  if (likely(PyInt_CheckExact(b))) {
    if (sizeof(Py_ssize_t) >= sizeof(long))
        return PyInt_AS_LONG(b);
    else
        return PyInt_AsSsize_t(x);
  }
#endif
  if (likely(PyLong_CheckExact(b))) {
    #if CYTHON_USE_PYLONG_INTERNALS
    const digit* digits = ((PyLongObject*)b)->ob_digit;
    const Py_ssize_t size = Py_SIZE(b);
    if (likely(__Pyx_sst_abs(size) <= 1)) {
        ival = likely(size) ? digits[0] : 0;
        if (size == -1) ival = -ival;
        return ival;
    } else {
      switch (size) {
         case 2:
           if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) {
             return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
           }
           break;
         case -2:
           if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) {
             return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
           }
           break;
         case 3:
           if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) {
             return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
           }
           break;
         case -3:
           if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) {
             return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
           }
           break;
         case 4:
           if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) {
             return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
           }
           break;
         case -4:
           if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) {
             return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
           }
           break;
      }
    }
    #endif
    return PyLong_AsSsize_t(b);
  }
  x = PyNumber_Index(b);
  if (!x) return -1;
  ival = PyInt_AsSsize_t(x);
  Py_DECREF(x);
  return ival;
}
static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
    return PyInt_FromSize_t(ival);
}


#endif /* Py_PYTHON_H */
