/* Generated by Cython 0.13 on Sun Nov 14 23:43:04 2010 */

#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.
#else

#include <stddef.h> /* For offsetof */
#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

#if PY_VERSION_HEX < 0x02040000
  #define METH_COEXIST 0
  #define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type)
  #define PyDict_Contains(d,o)   PySequence_Contains(d,o)
#endif

#if PY_VERSION_HEX < 0x02050000
  typedef int Py_ssize_t;
  #define PY_SSIZE_T_MAX INT_MAX
  #define PY_SSIZE_T_MIN INT_MIN
  #define PY_FORMAT_SIZE_T ""
  #define PyInt_FromSsize_t(z) PyInt_FromLong(z)
  #define PyInt_AsSsize_t(o)   PyInt_AsLong(o)
  #define PyNumber_Index(o)    PyNumber_Int(o)
  #define PyIndex_Check(o)     PyNumber_Check(o)
  #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message)
#endif

#if PY_VERSION_HEX < 0x02060000
  #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)
  #define Py_TYPE(ob)   (((PyObject*)(ob))->ob_type)
  #define Py_SIZE(ob)   (((PyVarObject*)(ob))->ob_size)
  #define PyVarObject_HEAD_INIT(type, size) \
          PyObject_HEAD_INIT(type) size,
  #define PyType_Modified(t)

  typedef struct {
     void *buf;
     PyObject *obj;
     Py_ssize_t len;
     Py_ssize_t itemsize;
     int readonly;
     int ndim;
     char *format;
     Py_ssize_t *shape;
     Py_ssize_t *strides;
     Py_ssize_t *suboffsets;
     void *internal;
  } Py_buffer;

  #define PyBUF_SIMPLE 0
  #define PyBUF_WRITABLE 0x0001
  #define PyBUF_FORMAT 0x0004
  #define PyBUF_ND 0x0008
  #define PyBUF_STRIDES (0x0010 | PyBUF_ND)
  #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES)
  #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)
  #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)
  #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)

#endif

#if PY_MAJOR_VERSION < 3
  #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
#else
  #define __Pyx_BUILTIN_MODULE_NAME "builtins"
#endif

#if PY_MAJOR_VERSION >= 3
  #define Py_TPFLAGS_CHECKTYPES 0
  #define Py_TPFLAGS_HAVE_INDEX 0
#endif

#if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3)
  #define Py_TPFLAGS_HAVE_NEWBUFFER 0
#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_VERSION_HEX < 0x02060000
  #define PyBytesObject                PyStringObject
  #define PyBytes_Type                 PyString_Type
  #define PyBytes_Check                PyString_Check
  #define PyBytes_CheckExact           PyString_CheckExact
  #define PyBytes_FromString           PyString_FromString
  #define PyBytes_FromStringAndSize    PyString_FromStringAndSize
  #define PyBytes_FromFormat           PyString_FromFormat
  #define PyBytes_DecodeEscape         PyString_DecodeEscape
  #define PyBytes_AsString             PyString_AsString
  #define PyBytes_AsStringAndSize      PyString_AsStringAndSize
  #define PyBytes_Size                 PyString_Size
  #define PyBytes_AS_STRING            PyString_AS_STRING
  #define PyBytes_GET_SIZE             PyString_GET_SIZE
  #define PyBytes_Repr                 PyString_Repr
  #define PyBytes_Concat               PyString_Concat
  #define PyBytes_ConcatAndDel         PyString_ConcatAndDel
  #define PySet_Check(obj)             PyObject_TypeCheck(obj, &PySet_Type)
  #define PyFrozenSet_Check(obj)       PyObject_TypeCheck(obj, &PyFrozenSet_Type)
#endif

#ifndef PySet_CheckExact
#  define PySet_CheckExact(obj)          (Py_TYPE(obj) == &PySet_Type)
#endif

#if PY_MAJOR_VERSION >= 3
  #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
#endif

#if PY_MAJOR_VERSION >= 3
  #define PyBoolObject PyLongObject
#endif


#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

#if PY_MAJOR_VERSION >= 3
  #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))
#endif

#if PY_VERSION_HEX < 0x02050000
  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),((char *)(n)))
  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a))
  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),((char *)(n)))
#else
  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),(n))
  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a))
  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),(n))
#endif

#if PY_VERSION_HEX < 0x02050000
  #define __Pyx_NAMESTR(n) ((char *)(n))
  #define __Pyx_DOCSTR(n)  ((char *)(n))
#else
  #define __Pyx_NAMESTR(n) (n)
  #define __Pyx_DOCSTR(n)  (n)
#endif

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

#if defined(WIN32) || defined(MS_WINDOWS)
#define _USE_MATH_DEFINES
#endif
#include <math.h>
#define __PYX_HAVE_API__pymorphy___morph

/* inline attribute */
#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

/* unused attribute */
#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)
#   define CYTHON_UNUSED __attribute__ ((__unused__)) 
# else
#   define CYTHON_UNUSED 
# endif
#endif

typedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/


/* Type Conversion Predeclarations */

#define __Pyx_PyBytes_FromUString(s) PyBytes_FromString((char*)s)
#define __Pyx_PyBytes_AsUString(s)   ((unsigned char*) PyBytes_AsString(s))

#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))
static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);
static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);

static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);

#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))


#ifdef __GNUC__
/* Test for GCC > 2.95 */
#if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)) 
#define likely(x)   __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
#else /* __GNUC__ > 2 ... */
#define likely(x)   (x)
#define unlikely(x) (x)
#endif /* __GNUC__ > 2 ... */
#else /* __GNUC__ */
#define likely(x)   (x)
#define unlikely(x) (x)
#endif /* __GNUC__ */
    
static PyObject *__pyx_m;
static PyObject *__pyx_b;
static PyObject *__pyx_empty_tuple;
static PyObject *__pyx_empty_bytes;
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[] = {
  "_morph.py",
  "_morph.pxd",
};

/* Type declarations */

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.pxd":10
 * 
 * 
 * cdef class GramForm(object):             # <<<<<<<<<<<<<<
 *     cpdef public set form
 *     cpdef public set denied_form
 */

struct __pyx_obj_8pymorphy_6_morph_GramForm {
  PyObject_HEAD
  struct __pyx_vtabstruct_8pymorphy_6_morph_GramForm *__pyx_vtab;
  PyObject *form;
  PyObject *denied_form;
};

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.pxd":19
 * 
 * 
 * cdef class Morph(object):             # <<<<<<<<<<<<<<
 *     cpdef object data
 *     cpdef int check_prefixes
 */

struct __pyx_obj_8pymorphy_6_morph_Morph {
  PyObject_HEAD
  struct __pyx_vtabstruct_8pymorphy_6_morph_Morph *__pyx_vtab;
  PyObject *data;
  int check_prefixes;
  int predict_by_prefix;
  int predict_by_suffix;
  int prediction_max_prefix_len;
  int prediction_min_suffix_len;
  int handle_EE;
};


/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":125
 * 
 * 
 * class Morph(object):             # <<<<<<<<<<<<<<
 *     """ ,
 *         data_source
 */

struct __pyx_vtabstruct_8pymorphy_6_morph_Morph {
  PyObject *(*_get_lemma_graminfo)(struct __pyx_obj_8pymorphy_6_morph_Morph *, PyObject *, PyObject *, PyObject *, PyObject *, int __pyx_skip_dispatch);
};
static struct __pyx_vtabstruct_8pymorphy_6_morph_Morph *__pyx_vtabptr_8pymorphy_6_morph_Morph;


/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":51
 *     return set(form), set(denied_form)
 * 
 * class GramForm(object):             # <<<<<<<<<<<<<<
 *     """       """
 * 
 */

struct __pyx_vtabstruct_8pymorphy_6_morph_GramForm {
  struct __pyx_obj_8pymorphy_6_morph_GramForm *(*update)(struct __pyx_obj_8pymorphy_6_morph_GramForm *, PyObject *, int __pyx_skip_dispatch);
  PyObject *(*get_form_string)(struct __pyx_obj_8pymorphy_6_morph_GramForm *, int __pyx_skip_dispatch);
  int (*match)(struct __pyx_obj_8pymorphy_6_morph_GramForm *, struct __pyx_obj_8pymorphy_6_morph_GramForm *, int __pyx_skip_dispatch);
};
static struct __pyx_vtabstruct_8pymorphy_6_morph_GramForm *__pyx_vtabptr_8pymorphy_6_morph_GramForm;

#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) {
    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;
  }
  #define __Pyx_RefNannySetupContext(name)           void *__pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
  #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_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r);} } while(0)
#else
  #define __Pyx_RefNannySetupContext(name)
  #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_XDECREF(r) Py_XDECREF(r)
#endif /* CYTHON_REFNANNY */
#define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);} } while(0)
#define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r);} } while(0)

static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/

static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
    const char *name, int exact); /*proto*/

static CYTHON_INLINE long __Pyx_NegateNonNeg(long b) { return unlikely(b < 0) ? b : !b; }
static CYTHON_INLINE PyObject* __Pyx_PyBoolOrNull_FromLong(long b) {
    return unlikely(b < 0) ? NULL : __Pyx_PyBool_FromLong(b);
}

static void __Pyx_RaiseDoubleKeywordsError(
    const char* func_name, PyObject* kw_name); /*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); /*proto*/

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


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;
}


#define __Pyx_GetItemInt_List(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                    __Pyx_GetItemInt_List_Fast(o, i) : \
                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))

static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i) {
    if (likely(o != Py_None)) {
        if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
            PyObject *r = PyList_GET_ITEM(o, i);
            Py_INCREF(r);
            return r;
        }
        else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) {
            PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i);
            Py_INCREF(r);
            return r;
        }
    }
    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
}

#define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                    __Pyx_GetItemInt_Tuple_Fast(o, i) : \
                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))

static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i) {
    if (likely(o != Py_None)) {
        if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
            PyObject *r = PyTuple_GET_ITEM(o, i);
            Py_INCREF(r);
            return r;
        }
        else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) {
            PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i);
            Py_INCREF(r);
            return r;
        }
    }
    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
}


#define __Pyx_GetItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
                                                    __Pyx_GetItemInt_Fast(o, i) : \
                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))

static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) {
    PyObject *r;
    if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
        r = PyList_GET_ITEM(o, i);
        Py_INCREF(r);
    }
    else if (PyTuple_CheckExact(o) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
        r = PyTuple_GET_ITEM(o, i);
        Py_INCREF(r);
    }
    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) {
        r = PySequence_GetItem(o, i);
    }
    else {
        r = __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
    }
    return r;
}

static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);

static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);

static PyObject *__Pyx_UnpackItem(PyObject *, Py_ssize_t index); /*proto*/
static int __Pyx_EndUnpack(PyObject *, Py_ssize_t expected); /*proto*/

static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/

static PyObject* __Pyx_PyDict_GetItemDefault(PyObject* d, PyObject* key, PyObject* default_value) {
    PyObject* value;
#if PY_MAJOR_VERSION >= 3
    value = PyDict_GetItemWithError(d, key);
    if (unlikely(!value)) {
        if (unlikely(PyErr_Occurred()))
            return NULL;
        value = default_value;
    }
    Py_INCREF(value);
#else
    if (PyString_CheckExact(key) || PyUnicode_CheckExact(key) || PyInt_CheckExact(key)) {
        /* these presumably have safe hash functions */
        value = PyDict_GetItem(d, key);
        if (unlikely(!value)) {
            value = default_value;
        }
        Py_INCREF(value);
    } else {
        PyObject *m;
        m = __Pyx_GetAttrString(d, "get");
        if (!m) return NULL;
        value = PyObject_CallFunctionObjArgs(m, key,
            (default_value == Py_None) ? NULL : default_value, NULL);
        Py_DECREF(m);
    }
#endif
    return value;
}

static CYTHON_INLINE void __Pyx_RaiseNoneIndexingError(void);


#if PY_MAJOR_VERSION >= 3
static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) {
    PyObject *value;
    if (unlikely(d == Py_None)) {
        __Pyx_RaiseNoneIndexingError();
        return NULL;
    }
    value = PyDict_GetItemWithError(d, key);
    if (unlikely(!value)) {
        if (!PyErr_Occurred())
            PyErr_SetObject(PyExc_KeyError, key);
        return NULL;
    }
    Py_INCREF(value);
    return value;
}
#else
    #define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key)
#endif

#if PY_VERSION_HEX < 0x02050000
#ifndef PyAnySet_CheckExact

#define PyAnySet_CheckExact(ob) \
    ((ob)->ob_type == &PySet_Type || \
     (ob)->ob_type == &PyFrozenSet_Type)

#define PySet_New(iterable) \
    PyObject_CallFunctionObjArgs((PyObject *)&PySet_Type, (iterable), NULL)

#define Pyx_PyFrozenSet_New(iterable) \
    PyObject_CallFunctionObjArgs((PyObject *)&PyFrozenSet_Type, (iterable), NULL)

#define PySet_Size(anyset) \
    PyObject_Size((anyset))

#define PySet_Contains(anyset, key) \
    PySequence_Contains((anyset), (key))

#define PySet_Pop(set) \
    PyObject_CallMethod(set, (char *)"pop", NULL)

static CYTHON_INLINE int PySet_Clear(PyObject *set) {
    PyObject *ret = PyObject_CallMethod(set, (char *)"clear", NULL);
    if (!ret) return -1;
    Py_DECREF(ret); return 0;
}

static CYTHON_INLINE int PySet_Discard(PyObject *set, PyObject *key) {
    PyObject *ret = PyObject_CallMethod(set, (char *)"discard", (char *)"O", key);
    if (!ret) return -1;
    Py_DECREF(ret); return 0;
}

static CYTHON_INLINE int PySet_Add(PyObject *set, PyObject *key) {
    PyObject *ret = PyObject_CallMethod(set, (char *)"add", (char *)"O", key);
    if (!ret) return -1;
    Py_DECREF(ret); return 0;
}

#endif /* PyAnySet_CheckExact (<= Py2.4) */

#if PY_VERSION_HEX < 0x02040000
#ifndef Py_SETOBJECT_H
#define Py_SETOBJECT_H

static PyTypeObject *__Pyx_PySet_Type = NULL;
static PyTypeObject *__Pyx_PyFrozenSet_Type = NULL;

#define PySet_Type (*__Pyx_PySet_Type)
#define PyFrozenSet_Type (*__Pyx_PyFrozenSet_Type)

#define PyAnySet_Check(ob) \
    (PyAnySet_CheckExact(ob) || \
     PyType_IsSubtype((ob)->ob_type, &PySet_Type) || \
     PyType_IsSubtype((ob)->ob_type, &PyFrozenSet_Type))

#define PyFrozenSet_CheckExact(ob) ((ob)->ob_type == &PyFrozenSet_Type)

static int __Pyx_Py23SetsImport(void) {
    PyObject *sets=0, *Set=0, *ImmutableSet=0;

    sets = PyImport_ImportModule((char *)"sets");
    if (!sets) goto bad;
    Set = PyObject_GetAttrString(sets, (char *)"Set");
    if (!Set) goto bad;
    ImmutableSet = PyObject_GetAttrString(sets, (char *)"ImmutableSet");
    if (!ImmutableSet) goto bad;
    Py_DECREF(sets);

    __Pyx_PySet_Type       = (PyTypeObject*) Set;
    __Pyx_PyFrozenSet_Type = (PyTypeObject*) ImmutableSet;

    return 0;

 bad:
    Py_XDECREF(sets);
    Py_XDECREF(Set);
    Py_XDECREF(ImmutableSet);
    return -1;
}

#else
static int __Pyx_Py23SetsImport(void) { return 0; }
#endif /* !Py_SETOBJECT_H */
#endif /* < Py2.4  */
#endif /* < Py2.5  */

static CYTHON_INLINE PyObject* __Pyx_PyObject_Append(PyObject* L, PyObject* x) {
    if (likely(PyList_CheckExact(L))) {
        if (PyList_Append(L, x) < 0) return NULL;
        Py_INCREF(Py_None);
        return Py_None; /* this is just to have an accurate signature */
    }
    else {
        PyObject *r, *m;
        m = __Pyx_GetAttrString(L, "append");
        if (!m) return NULL;
        r = PyObject_CallFunctionObjArgs(m, x, NULL);
        Py_DECREF(m);
        return r;
    }
}

static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/

static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);

static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *);

static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *);

static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *);

static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *);

static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *);

static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *);

static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *);

static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *);

static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject *);

static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *);

static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *);

static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *);

static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *);

static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *);

static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *);

static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/

static void __Pyx_WriteUnraisable(const char *name); /*proto*/

static CYTHON_INLINE int __Pyx_StrEq(const char *, const char *); /*proto*/

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

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

static void __Pyx_AddTraceback(const char *funcname); /*proto*/

static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
/* Module declarations from cython */

/* Module declarations from pymorphy._morph */

static PyTypeObject *__pyx_ptype_8pymorphy_6_morph_GramForm = 0;
static PyTypeObject *__pyx_ptype_8pymorphy_6_morph_Morph = 0;
static PyObject *__pyx_f_8pymorphy_6_morph__get_split_variants(PyObject *, int __pyx_skip_dispatch); /*proto*/
static int __pyx_f_8pymorphy_6_morph__array_match(PyObject *, PyObject *, int __pyx_skip_dispatch); /*proto*/
#define __Pyx_MODULE_NAME "pymorphy._morph"
int __pyx_module_is_main_pymorphy___morph = 0;

/* Implementation of pymorphy._morph */
static PyObject *__pyx_builtin_range;
static char __pyx_k_1[] = "";
static char __pyx_k_2[] = "\320\237\320\240\320\230\320\247\320\220\320\241\320\242\320\230\320\225";
static char __pyx_k_3[] = "\320\232\320\240_\320\237\320\240\320\230\320\247\320\220\320\241\320\242\320\230\320\225";
static char __pyx_k_4[] = "\320\230\320\235\320\244\320\230\320\235\320\230\320\242\320\230\320\222";
static char __pyx_k_5[] = "\320\224\320\225\320\225\320\237\320\240\320\230\320\247\320\220\320\241\320\242\320\230\320\225";
static char __pyx_k_6[] = "RU_GRAMINFO_STANDARD";
static char __pyx_k_7[] = ",";
static char __pyx_k_8[] = "!";
static char __pyx_k_9[] = "\320\274\320\275";
static char __pyx_k_10[] = "\320\275\321\201\321\202";
static char __pyx_k_11[] = "\320\277\321\200\321\210";
static char __pyx_k_16[] = "prediction_max_prefix_len";
static char __pyx_k_17[] = "prediction_min_suffix_len";
static char __pyx_k_20[] = "-";
static char __pyx_k_21[] = "_convert_to_standard";
static char __pyx_k_22[] = "\320\241";
static char __pyx_k_23[] = "\320\265\320\264,\320\270\320\274";
static char __pyx_k_24[] = "\320\265\320\264,\321\200\320\264";
static char __pyx_k_25[] = "\320\274\320\275,\321\200\320\264";
static char __pyx_k_26[] = "\320\237";
static char __pyx_k_27[] = "\320\247\320\230\320\241\320\233-\320\237";
static char __pyx_k_28[] = "#";
static char __pyx_k_29[] = "%snobase(%s)";
static char __pyx_k_30[] = "predict(...%s)";
static char __pyx_k_31[] = "prefix(%s).%s";
static char __pyx_k_32[] = "possible_rule_prefixes";
static char __pyx_k_34[] = "hyphen-prefix(%s).%s";
static char __pyx_k_35[] = "+";
static char __pyx_k_36[] = "word-formation(%s + %s)";
static char __pyx_k_37[] = "predict-prefix(%s).%s";
static char __pyx_k_38[] = "\320\225";
static char __pyx_k_39[] = "\320\201";
static char __pyx_k_43[] = "lemma(%s).suffix(%s)";
static char __pyx_k_44[] = "_static_prefix_graminfo";
static char __pyx_k_45[] = "_predict_by_prefix_graminfo";
static char __pyx_k_46[] = "_do_predict_by_suffix";
static char __pyx_k_48[] = "pymorphy.constants";
static char __pyx_k_49[] = "*";
static char __pyx_k_50[] = "pymorphy.backends";
static char __pyx_k_51[] = "_get_split_variants (line 9)";
static char __pyx_k_52[] = "_array_match (line 16)";
static char __pyx_k_53[] = "_convert_to_standard (line 26)";
static char __pyx_k_54[] = "GramForm.clear_number (line 60)";
static char __pyx_k_55[] = "GramForm.clear_case (line 64)";
static char __pyx_k_56[] = "GramForm.clear_gender (line 68)";
static char __pyx_k_57[] = "GramForm.clear_person (line 72)";
static char __pyx_k_58[] = "GramForm.clear_tense (line 76)";
static char __pyx_k_59[] = "GramForm.clear_voice (line 80)";
static char __pyx_k_60[] = "GramForm.update (line 84)";
static char __pyx_k_61[] = "Morph.__init__ (line 130)";
static char __pyx_k_62[] = "Morph.get_graminfo (line 169)";
static char __pyx_k_63[] = "Morph.decline (line 196)";
static char __pyx_k_64[] = "Morph.inflect_ru (line 227)";
static char __pyx_k_65[] = "Morph.pluralize_ru (line 260)";
static char __pyx_k_66[] = "Morph.pluralize_inflected_ru (line 267)";
static char __pyx_k_67[] = "pluralize_inflected_ru";
static char __pyx_k_68[] = "Morph.normalize (line 300)";
static char __pyx_k_69[] = "Morph._drop_cache (line 309)";
static char __pyx_k_70[] = "Morph._decline (line 316)";
static char __pyx_k_71[] = "Morph._get_lemma_graminfo (line 346)";
static char __pyx_k_72[] = "Morph._flexion_graminfo (line 382)";
static char __pyx_k_73[] = "Morph._do_predict_by_suffix (line 389)";
static char __pyx_k_74[] = "Morph._static_prefix_graminfo (line 453)";
static char __pyx_k_75[] = "Morph._predict_hyphenated (line 491)";
static char __pyx_k_76[] = "Morph._predict_by_prefix_graminfo (line 532)";
static char __pyx_k_77[] = "Morph._handle_EE (line 566)";
static char __pyx_k_78[] = "Morph._get_graminfo (line 582)";
static char __pyx_k_79[] = "get_morph (line 629)";
static char __pyx_k__2[] = "2";
static char __pyx_k__add[] = "add";
static char __pyx_k__arr[] = "arr";
static char __pyx_k__ger[] = "ger";
static char __pyx_k__get[] = "get";
static char __pyx_k__inf[] = "inf";
static char __pyx_k__num[] = "num";
static char __pyx_k__copy[] = "copy";
static char __pyx_k__data[] = "data";
static char __pyx_k__form[] = "form";
static char __pyx_k__info[] = "info";
static char __pyx_k__join[] = "join";
static char __pyx_k__load[] = "load";
static char __pyx_k__norm[] = "norm";
static char __pyx_k__path[] = "path";
static char __pyx_k__word[] = "word";
static char __pyx_k__Morph[] = "Morph";
static char __pyx_k__cache[] = "cache";
static char __pyx_k__class[] = "class";
static char __pyx_k__lemma[] = "lemma";
static char __pyx_k__match[] = "match";
static char __pyx_k__range[] = "range";
static char __pyx_k__rules[] = "rules";
static char __pyx_k__split[] = "split";
static char __pyx_k__strip[] = "strip";
static char __pyx_k__ancode[] = "ancode";
static char __pyx_k__cached[] = "cached";
static char __pyx_k__extend[] = "extend";
static char __pyx_k__filter[] = "filter";
static char __pyx_k__lemmas[] = "lemmas";
static char __pyx_k__method[] = "method";
static char __pyx_k__partcp[] = "partcp";
static char __pyx_k__pickle[] = "pickle";
static char __pyx_k__sqlite[] = "sqlite";
static char __pyx_k__suffix[] = "suffix";
static char __pyx_k__update[] = "update";
static char __pyx_k__backend[] = "backend";
static char __pyx_k__decline[] = "decline";
static char __pyx_k__endings[] = "endings";
static char __pyx_k__gramtab[] = "gramtab";
static char __pyx_k__predict[] = "predict";
static char __pyx_k__replace[] = "replace";
static char __pyx_k__GramForm[] = "GramForm";
static char __pyx_k__RU_CASES[] = "RU_CASES";
static char __pyx_k____init__[] = "__init__";
static char __pyx_k____main__[] = "__main__";
static char __pyx_k____test__[] = "__test__";
static char __pyx_k___decline[] = "_decline";
static char __pyx_k__deepcopy[] = "deepcopy";
static char __pyx_k__form_str[] = "form_str";
static char __pyx_k__prefixes[] = "prefixes";
static char __pyx_k__standard[] = "standard";
static char __pyx_k__variants[] = "variants";
static char __pyx_k__RU_TENSES[] = "RU_TENSES";
static char __pyx_k__RU_VOICES[] = "RU_VOICES";
static char __pyx_k__get_morph[] = "get_morph";
static char __pyx_k__gram_form[] = "gram_form";
static char __pyx_k__handle_EE[] = "handle_EE";
static char __pyx_k__normalize[] = "normalize";
static char __pyx_k__RU_GENDERS[] = "RU_GENDERS";
static char __pyx_k__RU_NUMBERS[] = "RU_NUMBERS";
static char __pyx_k__RU_PERSONS[] = "RU_PERSONS";
static char __pyx_k___handle_EE[] = "_handle_EE";
static char __pyx_k__clear_case[] = "clear_case";
static char __pyx_k__gram_class[] = "gram_class";
static char __pyx_k__inflect_ru[] = "inflect_ru";
static char __pyx_k__issuperset[] = "issuperset";
static char __pyx_k__predict_EE[] = "predict_EE";
static char __pyx_k___drop_cache[] = "_drop_cache";
static char __pyx_k__clear_tense[] = "clear_tense";
static char __pyx_k__clear_voice[] = "clear_voice";
static char __pyx_k__data_source[] = "data_source";
static char __pyx_k__denied_form[] = "denied_form";
static char __pyx_k__form_string[] = "form_string";
static char __pyx_k__paradigm_id[] = "paradigm_id";
static char __pyx_k___array_match[] = "_array_match";
static char __pyx_k__clear_gender[] = "clear_gender";
static char __pyx_k__clear_number[] = "clear_number";
static char __pyx_k__clear_person[] = "clear_person";
static char __pyx_k__get_graminfo[] = "get_graminfo";
static char __pyx_k__intersection[] = "intersection";
static char __pyx_k__pluralize_ru[] = "pluralize_ru";
static char __pyx_k___get_graminfo[] = "_get_graminfo";
static char __pyx_k__check_prefixes[] = "check_prefixes";
static char __pyx_k__require_prefix[] = "require_prefix";
static char __pyx_k___parse_gram_str[] = "_parse_gram_str";
static char __pyx_k__get_form_string[] = "get_form_string";
static char __pyx_k__PickleDataSource[] = "PickleDataSource";
static char __pyx_k__ShelveDataSource[] = "ShelveDataSource";
static char __pyx_k___flexion_graminfo[] = "_flexion_graminfo";
static char __pyx_k__difference_update[] = "difference_update";
static char __pyx_k__method_format_str[] = "method_format_str";
static char __pyx_k__predict_by_prefix[] = "predict_by_prefix";
static char __pyx_k__predict_by_suffix[] = "predict_by_suffix";
static char __pyx_k__PRODUCTIVE_CLASSES[] = "PRODUCTIVE_CLASSES";
static char __pyx_k__predict_hyphenated[] = "predict_hyphenated";
static char __pyx_k__RU_CLASSES_STANDARD[] = "RU_CLASSES_STANDARD";
static char __pyx_k___get_lemma_graminfo[] = "_get_lemma_graminfo";
static char __pyx_k___get_split_variants[] = "_get_split_variants";
static char __pyx_k___predict_hyphenated[] = "_predict_hyphenated";
static PyObject *__pyx_kp_u_1;
static PyObject *__pyx_n_u_10;
static PyObject *__pyx_n_u_11;
static PyObject *__pyx_n_s_16;
static PyObject *__pyx_n_s_17;
static PyObject *__pyx_n_u_2;
static PyObject *__pyx_kp_s_20;
static PyObject *__pyx_kp_u_20;
static PyObject *__pyx_n_s_21;
static PyObject *__pyx_n_u_22;
static PyObject *__pyx_kp_u_23;
static PyObject *__pyx_kp_u_24;
static PyObject *__pyx_kp_u_25;
static PyObject *__pyx_n_u_26;
static PyObject *__pyx_kp_u_27;
static PyObject *__pyx_kp_u_28;
static PyObject *__pyx_kp_u_29;
static PyObject *__pyx_n_u_3;
static PyObject *__pyx_kp_u_30;
static PyObject *__pyx_kp_u_31;
static PyObject *__pyx_n_s_32;
static PyObject *__pyx_kp_u_34;
static PyObject *__pyx_kp_u_35;
static PyObject *__pyx_kp_u_36;
static PyObject *__pyx_kp_u_37;
static PyObject *__pyx_n_u_38;
static PyObject *__pyx_n_u_39;
static PyObject *__pyx_n_u_4;
static PyObject *__pyx_kp_u_43;
static PyObject *__pyx_n_s_44;
static PyObject *__pyx_n_s_45;
static PyObject *__pyx_n_s_46;
static PyObject *__pyx_n_s_48;
static PyObject *__pyx_n_s_49;
static PyObject *__pyx_n_u_5;
static PyObject *__pyx_n_s_50;
static PyObject *__pyx_kp_u_51;
static PyObject *__pyx_kp_u_52;
static PyObject *__pyx_kp_u_53;
static PyObject *__pyx_kp_u_54;
static PyObject *__pyx_kp_u_55;
static PyObject *__pyx_kp_u_56;
static PyObject *__pyx_kp_u_57;
static PyObject *__pyx_kp_u_58;
static PyObject *__pyx_kp_u_59;
static PyObject *__pyx_n_s_6;
static PyObject *__pyx_kp_u_60;
static PyObject *__pyx_kp_u_61;
static PyObject *__pyx_kp_u_62;
static PyObject *__pyx_kp_u_63;
static PyObject *__pyx_kp_u_64;
static PyObject *__pyx_kp_u_65;
static PyObject *__pyx_kp_u_66;
static PyObject *__pyx_n_s_67;
static PyObject *__pyx_kp_u_68;
static PyObject *__pyx_kp_u_69;
static PyObject *__pyx_kp_s_7;
static PyObject *__pyx_kp_u_7;
static PyObject *__pyx_kp_u_70;
static PyObject *__pyx_kp_u_71;
static PyObject *__pyx_kp_u_72;
static PyObject *__pyx_kp_u_73;
static PyObject *__pyx_kp_u_74;
static PyObject *__pyx_kp_u_75;
static PyObject *__pyx_kp_u_76;
static PyObject *__pyx_kp_u_77;
static PyObject *__pyx_kp_u_78;
static PyObject *__pyx_kp_u_79;
static PyObject *__pyx_kp_u_8;
static PyObject *__pyx_n_u_9;
static PyObject *__pyx_kp_u__2;
static PyObject *__pyx_n_s__GramForm;
static PyObject *__pyx_n_s__Morph;
static PyObject *__pyx_n_s__PRODUCTIVE_CLASSES;
static PyObject *__pyx_n_s__PickleDataSource;
static PyObject *__pyx_n_s__RU_CASES;
static PyObject *__pyx_n_s__RU_CLASSES_STANDARD;
static PyObject *__pyx_n_s__RU_GENDERS;
static PyObject *__pyx_n_s__RU_NUMBERS;
static PyObject *__pyx_n_s__RU_PERSONS;
static PyObject *__pyx_n_s__RU_TENSES;
static PyObject *__pyx_n_s__RU_VOICES;
static PyObject *__pyx_n_s__ShelveDataSource;
static PyObject *__pyx_n_s____init__;
static PyObject *__pyx_n_s____main__;
static PyObject *__pyx_n_s____test__;
static PyObject *__pyx_n_s___array_match;
static PyObject *__pyx_n_s___decline;
static PyObject *__pyx_n_s___drop_cache;
static PyObject *__pyx_n_s___flexion_graminfo;
static PyObject *__pyx_n_s___get_graminfo;
static PyObject *__pyx_n_s___get_lemma_graminfo;
static PyObject *__pyx_n_s___get_split_variants;
static PyObject *__pyx_n_s___handle_EE;
static PyObject *__pyx_n_s___parse_gram_str;
static PyObject *__pyx_n_s___predict_hyphenated;
static PyObject *__pyx_n_s__add;
static PyObject *__pyx_n_s__ancode;
static PyObject *__pyx_n_s__arr;
static PyObject *__pyx_n_s__backend;
static PyObject *__pyx_n_s__cache;
static PyObject *__pyx_n_s__cached;
static PyObject *__pyx_n_s__check_prefixes;
static PyObject *__pyx_n_s__class;
static PyObject *__pyx_n_s__clear_case;
static PyObject *__pyx_n_s__clear_gender;
static PyObject *__pyx_n_s__clear_number;
static PyObject *__pyx_n_s__clear_person;
static PyObject *__pyx_n_s__clear_tense;
static PyObject *__pyx_n_s__clear_voice;
static PyObject *__pyx_n_s__copy;
static PyObject *__pyx_n_s__data;
static PyObject *__pyx_n_s__data_source;
static PyObject *__pyx_n_s__decline;
static PyObject *__pyx_n_s__deepcopy;
static PyObject *__pyx_n_s__denied_form;
static PyObject *__pyx_n_s__difference_update;
static PyObject *__pyx_n_s__endings;
static PyObject *__pyx_n_s__extend;
static PyObject *__pyx_n_s__filter;
static PyObject *__pyx_n_s__form;
static PyObject *__pyx_n_s__form_str;
static PyObject *__pyx_n_s__form_string;
static PyObject *__pyx_n_s__ger;
static PyObject *__pyx_n_s__get;
static PyObject *__pyx_n_s__get_form_string;
static PyObject *__pyx_n_s__get_graminfo;
static PyObject *__pyx_n_s__get_morph;
static PyObject *__pyx_n_s__gram_class;
static PyObject *__pyx_n_s__gram_form;
static PyObject *__pyx_n_s__gramtab;
static PyObject *__pyx_n_s__handle_EE;
static PyObject *__pyx_n_s__inf;
static PyObject *__pyx_n_s__inflect_ru;
static PyObject *__pyx_n_s__info;
static PyObject *__pyx_n_s__intersection;
static PyObject *__pyx_n_s__issuperset;
static PyObject *__pyx_n_s__join;
static PyObject *__pyx_n_s__lemma;
static PyObject *__pyx_n_s__lemmas;
static PyObject *__pyx_n_s__load;
static PyObject *__pyx_n_s__match;
static PyObject *__pyx_n_s__method;
static PyObject *__pyx_n_s__method_format_str;
static PyObject *__pyx_n_s__norm;
static PyObject *__pyx_n_s__normalize;
static PyObject *__pyx_n_s__num;
static PyObject *__pyx_n_s__paradigm_id;
static PyObject *__pyx_n_s__partcp;
static PyObject *__pyx_n_s__path;
static PyObject *__pyx_n_s__pickle;
static PyObject *__pyx_n_s__pluralize_ru;
static PyObject *__pyx_n_s__predict;
static PyObject *__pyx_n_s__predict_EE;
static PyObject *__pyx_n_s__predict_by_prefix;
static PyObject *__pyx_n_s__predict_by_suffix;
static PyObject *__pyx_n_s__predict_hyphenated;
static PyObject *__pyx_n_s__prefixes;
static PyObject *__pyx_n_s__range;
static PyObject *__pyx_n_s__replace;
static PyObject *__pyx_n_s__require_prefix;
static PyObject *__pyx_n_s__rules;
static PyObject *__pyx_n_s__split;
static PyObject *__pyx_n_s__sqlite;
static PyObject *__pyx_n_s__standard;
static PyObject *__pyx_n_s__strip;
static PyObject *__pyx_n_s__suffix;
static PyObject *__pyx_n_s__update;
static PyObject *__pyx_n_s__variants;
static PyObject *__pyx_n_s__word;
static PyObject *__pyx_int_1;
static PyObject *__pyx_int_2;
static PyObject *__pyx_int_3;
static PyObject *__pyx_int_4;
static PyObject *__pyx_int_5;
static PyObject *__pyx_int_10;
static PyObject *__pyx_int_11;
static PyObject *__pyx_int_20;
static PyObject *__pyx_int_100;
static PyObject *__pyx_k_12;
static PyObject *__pyx_k_13;
static PyObject *__pyx_k_14;
static PyObject *__pyx_k_15;
static PyObject *__pyx_k_18;
static PyObject *__pyx_k_19;
static PyObject *__pyx_k_33;
static PyObject *__pyx_k_40;
static PyObject *__pyx_k_41;
static PyObject *__pyx_k_42;
static PyObject *__pyx_k_47;

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":9
 * from pymorphy.backends import PickleDataSource, ShelveDataSource
 * 
 * def _get_split_variants(word):             # <<<<<<<<<<<<<<
 *     """       2  """
 *     l = len(word)
 */

static PyObject *__pyx_pf_8pymorphy_6_morph__get_split_variants(PyObject *__pyx_self, PyObject *__pyx_v_word); /*proto*/
static  PyObject *__pyx_f_8pymorphy_6_morph__get_split_variants(PyObject *__pyx_v_word, int __pyx_skip_dispatch) {
  int __pyx_v_i;
  int __pyx_v_l;
  PyObject *__pyx_v_vars;
  PyObject *__pyx_r = NULL;
  Py_ssize_t __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;
  __Pyx_RefNannySetupContext("_get_split_variants");
  __pyx_v_vars = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":11
 * def _get_split_variants(word):
 *     """       2  """
 *     l = len(word)             # <<<<<<<<<<<<<<
 *     vars = [(word[0:i], word[i:l]) for i in range(1,l)]
 *     vars.append((word, u'',))
 */
  if (unlikely(__pyx_v_word == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
  }
  __pyx_t_1 = PyUnicode_GET_SIZE(((PyObject *)__pyx_v_word)); 
  __pyx_v_l = __pyx_t_1;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":12
 *     """       2  """
 *     l = len(word)
 *     vars = [(word[0:i], word[i:l]) for i in range(1,l)]             # <<<<<<<<<<<<<<
 *     vars.append((word, u'',))
 *     return vars
 */
  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
  __pyx_t_3 = __pyx_v_l;
  for (__pyx_t_4 = 1; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
    __pyx_v_i = __pyx_t_4;
    __pyx_t_5 = PySequence_GetSlice(((PyObject *)__pyx_v_word), 0, __pyx_v_i); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
    __pyx_t_6 = PySequence_GetSlice(((PyObject *)__pyx_v_word), __pyx_v_i, __pyx_v_l); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
    __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_t_5));
    __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
    PyTuple_SET_ITEM(__pyx_t_7, 1, ((PyObject *)__pyx_t_6));
    __Pyx_GIVEREF(((PyObject *)__pyx_t_6));
    __pyx_t_5 = 0;
    __pyx_t_6 = 0;
    if (unlikely(PyList_Append(__pyx_t_2, (PyObject*)__pyx_t_7))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  }
  __Pyx_INCREF(((PyObject *)__pyx_t_2));
  __Pyx_DECREF(((PyObject *)__pyx_v_vars));
  __pyx_v_vars = __pyx_t_2;
  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":13
 *     l = len(word)
 *     vars = [(word[0:i], word[i:l]) for i in range(1,l)]
 *     vars.append((word, u'',))             # <<<<<<<<<<<<<<
 *     return vars
 * 
 */
  if (unlikely(__pyx_v_vars == Py_None)) {
    PyErr_SetString(PyExc_AttributeError, "'NoneType' object has no attribute 'append'"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
  }
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(((PyObject *)__pyx_v_word));
  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_word));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_word));
  __Pyx_INCREF(((PyObject *)__pyx_kp_u_1));
  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_kp_u_1));
  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_1));
  __pyx_t_3 = PyList_Append(((PyObject *)__pyx_v_vars), __pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":14
 *     vars = [(word[0:i], word[i:l]) for i in range(1,l)]
 *     vars.append((word, u'',))
 *     return vars             # <<<<<<<<<<<<<<
 * 
 * def _array_match(arr, filter):
 */
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_INCREF(((PyObject *)__pyx_v_vars));
  __pyx_r = __pyx_v_vars;
  goto __pyx_L0;

  __pyx_r = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("pymorphy._morph._get_split_variants");
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_vars);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":9
 * from pymorphy.backends import PickleDataSource, ShelveDataSource
 * 
 * def _get_split_variants(word):             # <<<<<<<<<<<<<<
 *     """       2  """
 *     l = len(word)
 */

static PyObject *__pyx_pf_8pymorphy_6_morph__get_split_variants(PyObject *__pyx_self, PyObject *__pyx_v_word); /*proto*/
static char __pyx_doc_8pymorphy_6_morph__get_split_variants[] = " \320\222\320\265\321\200\320\275\321\203\321\202\321\214 \320\262\321\201\320\265 \320\262\320\260\321\200\320\270\320\260\320\275\321\202\321\213 \321\200\320\260\320\267\320\261\320\270\320\265\320\275\320\270\321\217 \321\201\320\273\320\276\320\262\320\260 \320\275\320\260 2 \321\207\320\260\321\201\321\202\320\270 ";
static PyObject *__pyx_pf_8pymorphy_6_morph__get_split_variants(PyObject *__pyx_self, PyObject *__pyx_v_word) {
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("_get_split_variants");
  __pyx_self = __pyx_self;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_word), &PyUnicode_Type, 1, "word", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = ((PyObject *)__pyx_f_8pymorphy_6_morph__get_split_variants(__pyx_v_word, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("pymorphy._morph._get_split_variants");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":16
 *     return vars
 * 
 * def _array_match(arr, filter):             # <<<<<<<<<<<<<<
 *     '''  True,      filter
 *           attrs
 */

static PyObject *__pyx_pf_8pymorphy_6_morph__array_match(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static  int __pyx_f_8pymorphy_6_morph__array_match(PyObject *__pyx_v_arr, PyObject *__pyx_v_filter, int __pyx_skip_dispatch) {
  PyObject *__pyx_v_item;
  int __pyx_r;
  Py_ssize_t __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_t_4;
  int __pyx_t_5;
  int __pyx_t_6;
  __Pyx_RefNannySetupContext("_array_match");
  __pyx_v_item = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":20
 *           attrs
 *     '''
 *     for item in filter:             # <<<<<<<<<<<<<<
 *         if item and item not in arr:
 *             return False
 */
  if (likely(((PyObject *)__pyx_v_filter) != Py_None)) {
    __pyx_t_1 = 0; __pyx_t_2 = ((PyObject *)__pyx_v_filter); __Pyx_INCREF(__pyx_t_2);
  } else {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  for (;;) {
    if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_2)) break;
    __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;
    if (!(likely(PyUnicode_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected unicode, got %.200s", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(((PyObject *)__pyx_v_item));
    __pyx_v_item = ((PyObject *)__pyx_t_3);
    __pyx_t_3 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":21
 *     '''
 *     for item in filter:
 *         if item and item not in arr:             # <<<<<<<<<<<<<<
 *             return False
 *     return True
 */
    __pyx_t_4 = (((PyObject *)__pyx_v_item) != Py_None) && (PyUnicode_GET_SIZE(((PyObject *)__pyx_v_item)) != 0);
    if (__pyx_t_4) {
      __pyx_t_5 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_arr), ((PyObject *)__pyx_v_item)))); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_6 = __pyx_t_5;
    } else {
      __pyx_t_6 = __pyx_t_4;
    }
    if (__pyx_t_6) {

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":22
 *     for item in filter:
 *         if item and item not in arr:
 *             return False             # <<<<<<<<<<<<<<
 *     return True
 * 
 */
      __pyx_r = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      goto __pyx_L0;
      goto __pyx_L5;
    }
    __pyx_L5:;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":23
 *         if item and item not in arr:
 *             return False
 *     return True             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_r = 1;
  goto __pyx_L0;

  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_WriteUnraisable("pymorphy._morph._array_match");
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_item);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":16
 *     return vars
 * 
 * def _array_match(arr, filter):             # <<<<<<<<<<<<<<
 *     '''  True,      filter
 *           attrs
 */

static PyObject *__pyx_pf_8pymorphy_6_morph__array_match(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8pymorphy_6_morph__array_match[] = " \320\222\320\276\320\267\320\262\321\200\321\217\321\211\320\260\320\265\321\202 True, \320\265\321\201\320\273\320\270 \320\262\321\201\320\265 \321\215\320\273\320\265\320\274\320\265\320\275\321\202\321\213 \320\270\320\267 \321\201\320\277\320\270\321\201\320\272\320\260 filter\n        \320\277\321\200\320\270\321\201\321\203\321\202\321\201\321\202\320\262\321\203\321\216\321\202 \320\262 attrs\n    ";
static PyObject *__pyx_pf_8pymorphy_6_morph__array_match(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_arr = 0;
  PyObject *__pyx_v_filter = 0;
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__arr,&__pyx_n_s__filter,0};
  __Pyx_RefNannySetupContext("_array_match");
  __pyx_self = __pyx_self;
  if (unlikely(__pyx_kwds)) {
    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
    PyObject* values[2] = {0,0};
    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;
    }
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  0:
      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__arr);
      if (likely(values[0])) kw_args--;
      else goto __pyx_L5_argtuple_error;
      case  1:
      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__filter);
      if (likely(values[1])) kw_args--;
      else {
        __Pyx_RaiseArgtupleInvalid("_array_match", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    }
    if (unlikely(kw_args > 0)) {
      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "_array_match") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    }
    __pyx_v_arr = ((PyObject *)values[0]);
    __pyx_v_filter = ((PyObject *)values[1]);
  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
    goto __pyx_L5_argtuple_error;
  } else {
    __pyx_v_arr = ((PyObject *)PyTuple_GET_ITEM(__pyx_args, 0));
    __pyx_v_filter = ((PyObject *)PyTuple_GET_ITEM(__pyx_args, 1));
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_array_match", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("pymorphy._morph._array_match");
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_arr), &PyList_Type, 1, "arr", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_filter), &PyList_Type, 1, "filter", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyInt_FromLong(__pyx_f_8pymorphy_6_morph__array_match(__pyx_v_arr, __pyx_v_filter, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("pymorphy._morph._array_match");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":26
 * 
 * 
 * def _convert_to_standard(gram_class, form_str):             # <<<<<<<<<<<<<<
 *     '''  . ,    get_gram_info  ,
 *           : (class, form)  '''
 */

static PyObject *__pyx_pf_8pymorphy_6_morph__convert_to_standard(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8pymorphy_6_morph__convert_to_standard[] = " \320\224\320\273\321\217 \320\263\321\200\320\260\320\274. \320\270\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\320\270, \320\277\320\276\320\273\321\203\321\207\320\265\320\275\320\275\320\276\320\271 \320\276\321\202 \320\274\320\265\321\202\320\276\320\264\320\260 get_gram_info \320\270 \320\260\320\275\320\260\320\273\320\276\320\263\320\270\321\207\320\275\321\213\321\205,\n        \320\262\320\265\321\200\320\275\321\203\321\202\321\214 \321\201\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\320\276\320\265 \320\277\321\200\320\265\320\264\321\201\321\202\320\260\320\262\320\273\320\265\320\275\320\270\320\265: (class, form)  ";
static PyObject *__pyx_pf_8pymorphy_6_morph__convert_to_standard(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_gram_class = 0;
  PyObject *__pyx_v_form_str = 0;
  struct __pyx_obj_8pymorphy_6_morph_GramForm *__pyx_v_gram_form;
  PyObject *__pyx_v_new_form;
  PyObject *__pyx_v_attr;
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_t_5;
  int __pyx_t_6;
  Py_ssize_t __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__gram_class,&__pyx_n_s__form_str,0};
  __Pyx_RefNannySetupContext("_convert_to_standard");
  __pyx_self = __pyx_self;
  if (unlikely(__pyx_kwds)) {
    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
    PyObject* values[2] = {0,0};
    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;
    }
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  0:
      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__gram_class);
      if (likely(values[0])) kw_args--;
      else goto __pyx_L5_argtuple_error;
      case  1:
      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__form_str);
      if (likely(values[1])) kw_args--;
      else {
        __Pyx_RaiseArgtupleInvalid("_convert_to_standard", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    }
    if (unlikely(kw_args > 0)) {
      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "_convert_to_standard") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    }
    __pyx_v_gram_class = values[0];
    __pyx_v_form_str = values[1];
  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
    goto __pyx_L5_argtuple_error;
  } else {
    __pyx_v_gram_class = PyTuple_GET_ITEM(__pyx_args, 0);
    __pyx_v_form_str = PyTuple_GET_ITEM(__pyx_args, 1);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_convert_to_standard", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("pymorphy._morph._convert_to_standard");
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_v_gram_form = ((struct __pyx_obj_8pymorphy_6_morph_GramForm *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_new_form = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_attr = Py_None; __Pyx_INCREF(Py_None);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":29
 *     '''  . ,    get_gram_info  ,
 *           : (class, form)  '''
 *     gram_form = GramForm(form_str)             # <<<<<<<<<<<<<<
 * 
 *     if gram_class in [u'', u'_']:
 */
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_form_str);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_form_str);
  __Pyx_GIVEREF(__pyx_v_form_str);
  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_8pymorphy_6_morph_GramForm)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(((PyObject *)__pyx_v_gram_form));
  __pyx_v_gram_form = ((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_t_2);
  __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":31
 *     gram_form = GramForm(form_str)
 * 
 *     if gram_class in [u'', u'_']:             # <<<<<<<<<<<<<<
 *         gram_form.form.add('partcp')
 *     else:
 */
  __Pyx_INCREF(__pyx_v_gram_class);
  __pyx_t_2 = __pyx_v_gram_class;
  __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, ((PyObject *)__pyx_n_u_2), Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_4 = __pyx_t_3;
  if (!__pyx_t_4) {
    __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, ((PyObject *)__pyx_n_u_3), Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_5 = __pyx_t_3;
    __pyx_t_3 = __pyx_t_5;
  } else {
    __pyx_t_3 = __pyx_t_4;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4 = __pyx_t_3;
  if (__pyx_t_4) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":32
 * 
 *     if gram_class in [u'', u'_']:
 *         gram_form.form.add('partcp')             # <<<<<<<<<<<<<<
 *     else:
 *         gram_form.clear_voice()
 */
    __pyx_t_6 = PySet_Add(((PyObject *)__pyx_v_gram_form->form), ((PyObject *)__pyx_n_s__partcp)); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    goto __pyx_L6;
  }
  /*else*/ {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":34
 *         gram_form.form.add('partcp')
 *     else:
 *         gram_form.clear_voice()             # <<<<<<<<<<<<<<
 * 
 *     if gram_class == u'':
 */
    __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_gram_form), __pyx_n_s__clear_voice); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __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;
  }
  __pyx_L6:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":36
 *         gram_form.clear_voice()
 * 
 *     if gram_class == u'':             # <<<<<<<<<<<<<<
 *         gram_form.form.add('inf')
 *     if gram_class == u'':
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_gram_class, ((PyObject *)__pyx_n_u_4), Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_4) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":37
 * 
 *     if gram_class == u'':
 *         gram_form.form.add('inf')             # <<<<<<<<<<<<<<
 *     if gram_class == u'':
 *         gram_form.form.add('ger')
 */
    __pyx_t_6 = PySet_Add(((PyObject *)__pyx_v_gram_form->form), ((PyObject *)__pyx_n_s__inf)); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    goto __pyx_L7;
  }
  __pyx_L7:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":38
 *     if gram_class == u'':
 *         gram_form.form.add('inf')
 *     if gram_class == u'':             # <<<<<<<<<<<<<<
 *         gram_form.form.add('ger')
 * 
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_gram_class, ((PyObject *)__pyx_n_u_5), Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_4) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":39
 *         gram_form.form.add('inf')
 *     if gram_class == u'':
 *         gram_form.form.add('ger')             # <<<<<<<<<<<<<<
 * 
 *     new_form = [RU_GRAMINFO_STANDARD[attr] for attr in gram_form.form if attr in RU_GRAMINFO_STANDARD]
 */
    __pyx_t_6 = PySet_Add(((PyObject *)__pyx_v_gram_form->form), ((PyObject *)__pyx_n_s__ger)); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    goto __pyx_L8;
  }
  __pyx_L8:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":41
 *         gram_form.form.add('ger')
 * 
 *     new_form = [RU_GRAMINFO_STANDARD[attr] for attr in gram_form.form if attr in RU_GRAMINFO_STANDARD]             # <<<<<<<<<<<<<<
 *     return RU_CLASSES_STANDARD[gram_class], ','.join(new_form)
 * 
 */
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
  __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(((PyObject *)__pyx_v_gram_form->form)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  for (;;) {
    {
      __pyx_t_8 = PyIter_Next(__pyx_t_2);
      if (!__pyx_t_8) {
        if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        break;
      }
      __Pyx_GOTREF(__pyx_t_8);
    }
    __Pyx_DECREF(__pyx_v_attr);
    __pyx_v_attr = __pyx_t_8;
    __pyx_t_8 = 0;
    __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s_6); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_4 = ((PySequence_Contains(__pyx_t_8, __pyx_v_attr))); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    if (__pyx_t_4) {
      __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s_6); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_9 = PyObject_GetItem(__pyx_t_8, __pyx_v_attr); if (!__pyx_t_9) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_9))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      goto __pyx_L11;
    }
    __pyx_L11:;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_INCREF(((PyObject *)__pyx_t_1));
  __Pyx_DECREF(((PyObject *)__pyx_v_new_form));
  __pyx_v_new_form = __pyx_t_1;
  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":42
 * 
 *     new_form = [RU_GRAMINFO_STANDARD[attr] for attr in gram_form.form if attr in RU_GRAMINFO_STANDARD]
 *     return RU_CLASSES_STANDARD[gram_class], ','.join(new_form)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__RU_CLASSES_STANDARD); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_v_gram_class); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_7), __pyx_n_s__join); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_INCREF(((PyObject *)__pyx_v_new_form));
  PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_v_new_form));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_new_form));
  __pyx_t_8 = PyObject_Call(__pyx_t_1, __pyx_t_9, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_9);
  PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8);
  __Pyx_GIVEREF(__pyx_t_8);
  __pyx_t_2 = 0;
  __pyx_t_8 = 0;
  __pyx_r = __pyx_t_9;
  __pyx_t_9 = 0;
  goto __pyx_L0;

  __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_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("pymorphy._morph._convert_to_standard");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF((PyObject *)__pyx_v_gram_form);
  __Pyx_DECREF(__pyx_v_new_form);
  __Pyx_DECREF(__pyx_v_attr);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":45
 * 
 * 
 * def _parse_gram_str(form_string):             # <<<<<<<<<<<<<<
 *     splitted = form_string.split(',')
 *     form = [a for a in splitted if a and a[0]!=u'!']
 */

static PyObject *__pyx_pf_8pymorphy_6_morph__parse_gram_str(PyObject *__pyx_self, PyObject *__pyx_v_form_string); /*proto*/
static PyObject *__pyx_pf_8pymorphy_6_morph__parse_gram_str(PyObject *__pyx_self, PyObject *__pyx_v_form_string) {
  PyObject *__pyx_v_splitted;
  PyObject *__pyx_v_form;
  PyObject *__pyx_v_denied_form;
  PyObject *__pyx_v_a;
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  int __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_t_7;
  int __pyx_t_8;
  __Pyx_RefNannySetupContext("_parse_gram_str");
  __pyx_self = __pyx_self;
  __pyx_v_splitted = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_form = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_denied_form = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_a = Py_None; __Pyx_INCREF(Py_None);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":46
 * 
 * def _parse_gram_str(form_string):
 *     splitted = form_string.split(',')             # <<<<<<<<<<<<<<
 *     form = [a for a in splitted if a and a[0]!=u'!']
 *     denied_form = [a[1:] for a in splitted if a and a[0]==u'!']
 */
  __pyx_t_1 = PyObject_GetAttr(__pyx_v_form_string, __pyx_n_s__split); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(((PyObject *)__pyx_kp_s_7));
  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_7));
  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_7));
  __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __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_v_splitted);
  __pyx_v_splitted = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":47
 * def _parse_gram_str(form_string):
 *     splitted = form_string.split(',')
 *     form = [a for a in splitted if a and a[0]!=u'!']             # <<<<<<<<<<<<<<
 *     denied_form = [a[1:] for a in splitted if a and a[0]==u'!']
 *     return set(form), set(denied_form)
 */
  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
  if (PyList_CheckExact(__pyx_v_splitted) || PyTuple_CheckExact(__pyx_v_splitted)) {
    __pyx_t_4 = 0; __pyx_t_2 = __pyx_v_splitted; __Pyx_INCREF(__pyx_t_2);
  } else {
    __pyx_t_4 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_splitted); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
  }
  for (;;) {
    if (likely(PyList_CheckExact(__pyx_t_2))) {
      if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_2)) break;
      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++;
    } else if (likely(PyTuple_CheckExact(__pyx_t_2))) {
      if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++;
    } else {
      __pyx_t_1 = PyIter_Next(__pyx_t_2);
      if (!__pyx_t_1) {
        if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        break;
      }
      __Pyx_GOTREF(__pyx_t_1);
    }
    __Pyx_DECREF(__pyx_v_a);
    __pyx_v_a = __pyx_t_1;
    __pyx_t_1 = 0;
    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_v_a); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (__pyx_t_5) {
      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_a, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_6 = PyObject_RichCompare(__pyx_t_1, ((PyObject *)__pyx_kp_u_8), Py_NE); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_t_8 = __pyx_t_7;
    } else {
      __pyx_t_8 = __pyx_t_5;
    }
    if (__pyx_t_8) {
      if (unlikely(PyList_Append(__pyx_t_3, (PyObject*)__pyx_v_a))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      goto __pyx_L7;
    }
    __pyx_L7:;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_INCREF(((PyObject *)__pyx_t_3));
  __Pyx_DECREF(((PyObject *)__pyx_v_form));
  __pyx_v_form = __pyx_t_3;
  __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":48
 *     splitted = form_string.split(',')
 *     form = [a for a in splitted if a and a[0]!=u'!']
 *     denied_form = [a[1:] for a in splitted if a and a[0]==u'!']             # <<<<<<<<<<<<<<
 *     return set(form), set(denied_form)
 * 
 */
  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
  if (PyList_CheckExact(__pyx_v_splitted) || PyTuple_CheckExact(__pyx_v_splitted)) {
    __pyx_t_4 = 0; __pyx_t_2 = __pyx_v_splitted; __Pyx_INCREF(__pyx_t_2);
  } else {
    __pyx_t_4 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_splitted); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
  }
  for (;;) {
    if (likely(PyList_CheckExact(__pyx_t_2))) {
      if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_2)) break;
      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_6); __pyx_t_4++;
    } else if (likely(PyTuple_CheckExact(__pyx_t_2))) {
      if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
      __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_6); __pyx_t_4++;
    } else {
      __pyx_t_6 = PyIter_Next(__pyx_t_2);
      if (!__pyx_t_6) {
        if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        break;
      }
      __Pyx_GOTREF(__pyx_t_6);
    }
    __Pyx_DECREF(__pyx_v_a);
    __pyx_v_a = __pyx_t_6;
    __pyx_t_6 = 0;
    __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_v_a); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (__pyx_t_8) {
      __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_a, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_1 = PyObject_RichCompare(__pyx_t_6, ((PyObject *)__pyx_kp_u_8), Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_7 = __pyx_t_5;
    } else {
      __pyx_t_7 = __pyx_t_8;
    }
    if (__pyx_t_7) {
      __pyx_t_1 = PySequence_GetSlice(__pyx_v_a, 1, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      if (unlikely(PyList_Append(__pyx_t_3, (PyObject*)__pyx_t_1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      goto __pyx_L10;
    }
    __pyx_L10:;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_INCREF(((PyObject *)__pyx_t_3));
  __Pyx_DECREF(((PyObject *)__pyx_v_denied_form));
  __pyx_v_denied_form = __pyx_t_3;
  __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":49
 *     form = [a for a in splitted if a and a[0]!=u'!']
 *     denied_form = [a[1:] for a in splitted if a and a[0]==u'!']
 *     return set(form), set(denied_form)             # <<<<<<<<<<<<<<
 * 
 * class GramForm(object):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(((PyObject *)__pyx_v_form));
  PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_form));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_form));
  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)&PySet_Type)), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(((PyObject *)__pyx_v_denied_form));
  PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_denied_form));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_denied_form));
  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)&PySet_Type)), __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_t_2 = 0;
  __pyx_t_1 = 0;
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;

  __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_6);
  __Pyx_AddTraceback("pymorphy._morph._parse_gram_str");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_splitted);
  __Pyx_DECREF(__pyx_v_form);
  __Pyx_DECREF(__pyx_v_denied_form);
  __Pyx_DECREF(__pyx_v_a);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":54
 *     """       """
 * 
 *     def __init__(self, form_string):             # <<<<<<<<<<<<<<
 *         self.form, self.denied_form = _parse_gram_str(form_string)
 * 
 */

static int __pyx_pf_8pymorphy_6_morph_8GramForm___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pf_8pymorphy_6_morph_8GramForm___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_form_string = 0;
  int __pyx_r;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__form_string,0};
  __Pyx_RefNannySetupContext("__init__");
  if (unlikely(__pyx_kwds)) {
    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
    PyObject* values[1] = {0};
    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;
    }
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  0:
      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__form_string);
      if (likely(values[0])) kw_args--;
      else goto __pyx_L5_argtuple_error;
    }
    if (unlikely(kw_args > 0)) {
      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    }
    __pyx_v_form_string = values[0];
  } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
    goto __pyx_L5_argtuple_error;
  } else {
    __pyx_v_form_string = PyTuple_GET_ITEM(__pyx_args, 0);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("pymorphy._morph.GramForm.__init__");
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":55
 * 
 *     def __init__(self, form_string):
 *         self.form, self.denied_form = _parse_gram_str(form_string)             # <<<<<<<<<<<<<<
 * 
 *     def get_form_string(self):
 */
  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s___parse_gram_str); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_form_string);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_form_string);
  __Pyx_GIVEREF(__pyx_v_form_string);
  __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __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;
  if (PyTuple_CheckExact(__pyx_t_3) && likely(PyTuple_GET_SIZE(__pyx_t_3) == 2)) {
    PyObject* tuple = __pyx_t_3;
    __pyx_t_2 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_t_2);
    if (!(likely(PySet_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected set, got %.200s", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_1 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_t_1);
    if (!(likely(PySet_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected set, got %.200s", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_GIVEREF(__pyx_t_2);
    __Pyx_GOTREF(((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form);
    __Pyx_DECREF(((PyObject *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form));
    ((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form = ((PyObject *)__pyx_t_2);
    __pyx_t_2 = 0;
    __Pyx_GIVEREF(__pyx_t_1);
    __Pyx_GOTREF(((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->denied_form);
    __Pyx_DECREF(((PyObject *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->denied_form));
    ((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->denied_form = ((PyObject *)__pyx_t_1);
    __pyx_t_1 = 0;
  } else {
    __pyx_t_4 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_2 = __Pyx_UnpackItem(__pyx_t_4, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    if (!(likely(PySet_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected set, got %.200s", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_1 = __Pyx_UnpackItem(__pyx_t_4, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    if (!(likely(PySet_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected set, got %.200s", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (__Pyx_EndUnpack(__pyx_t_4, 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_GIVEREF(__pyx_t_2);
    __Pyx_GOTREF(((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form);
    __Pyx_DECREF(((PyObject *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form));
    ((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form = ((PyObject *)__pyx_t_2);
    __pyx_t_2 = 0;
    __Pyx_GIVEREF(__pyx_t_1);
    __Pyx_GOTREF(((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->denied_form);
    __Pyx_DECREF(((PyObject *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->denied_form));
    ((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->denied_form = ((PyObject *)__pyx_t_1);
    __pyx_t_1 = 0;
  }

  __pyx_r = 0;
  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_AddTraceback("pymorphy._morph.GramForm.__init__");
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":57
 *         self.form, self.denied_form = _parse_gram_str(form_string)
 * 
 *     def get_form_string(self):             # <<<<<<<<<<<<<<
 *         return u",".join(self.form)
 * 
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_get_form_string(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static  PyObject *__pyx_f_8pymorphy_6_morph_8GramForm_get_form_string(struct __pyx_obj_8pymorphy_6_morph_GramForm *__pyx_v_self, int __pyx_skip_dispatch) {
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  __Pyx_RefNannySetupContext("get_form_string");
  /* Check if called by wrapper */
  if (unlikely(__pyx_skip_dispatch)) ;
  /* Check if overriden in Python */
  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__get_form_string); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_8pymorphy_6_morph_8GramForm_get_form_string)) {
      __Pyx_XDECREF(((PyObject *)__pyx_r));
      __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      if (!(likely(PyUnicode_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected unicode, got %.200s", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_r = ((PyObject *)__pyx_t_2);
      __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      goto __pyx_L0;
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":58
 * 
 *     def get_form_string(self):
 *         return u",".join(self.form)             # <<<<<<<<<<<<<<
 * 
 *     def clear_number(self):
 */
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __pyx_t_1 = ((PyObject *)PyUnicode_Join(__pyx_kp_u_7, ((PyObject *)__pyx_v_self->form))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
  if (!(likely(PyUnicode_CheckExact(((PyObject *)__pyx_t_1)))||(PyErr_Format(PyExc_TypeError, "Expected unicode, got %.200s", Py_TYPE(((PyObject *)__pyx_t_1))->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_r = ((PyObject *)__pyx_t_1);
  __pyx_t_1 = 0;
  goto __pyx_L0;

  __pyx_r = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pymorphy._morph.GramForm.get_form_string");
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":57
 *         self.form, self.denied_form = _parse_gram_str(form_string)
 * 
 *     def get_form_string(self):             # <<<<<<<<<<<<<<
 *         return u",".join(self.form)
 * 
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_get_form_string(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_get_form_string(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("get_form_string");
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_8pymorphy_6_morph_GramForm *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->__pyx_vtab)->get_form_string(((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self), 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("pymorphy._morph.GramForm.get_form_string");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":60
 *         return u",".join(self.form)
 * 
 *     def clear_number(self):             # <<<<<<<<<<<<<<
 *         '''     '''
 *         self.form.difference_update(RU_NUMBERS)
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_clear_number(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_8GramForm_clear_number[] = " \321\203\320\261\321\200\320\260\321\202\321\214 \320\270\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\216 \320\276 \321\207\320\270\321\201\320\273\320\265 ";
static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_clear_number(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  __Pyx_RefNannySetupContext("clear_number");

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":62
 *     def clear_number(self):
 *         '''     '''
 *         self.form.difference_update(RU_NUMBERS)             # <<<<<<<<<<<<<<
 * 
 *     def clear_case(self):
 */
  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form), __pyx_n_s__difference_update); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__RU_NUMBERS); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __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_2); __pyx_t_2 = 0;

  __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_AddTraceback("pymorphy._morph.GramForm.clear_number");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":64
 *         self.form.difference_update(RU_NUMBERS)
 * 
 *     def clear_case(self):             # <<<<<<<<<<<<<<
 *         '''     '''
 *         self.form.difference_update(RU_CASES)
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_clear_case(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_8GramForm_clear_case[] = " \321\203\320\261\321\200\320\260\321\202\321\214 \320\270\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\216 \320\276 \320\277\320\260\320\264\320\265\320\266\320\265 ";
static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_clear_case(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  __Pyx_RefNannySetupContext("clear_case");

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":66
 *     def clear_case(self):
 *         '''     '''
 *         self.form.difference_update(RU_CASES)             # <<<<<<<<<<<<<<
 * 
 *     def clear_gender(self):
 */
  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form), __pyx_n_s__difference_update); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__RU_CASES); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __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_2); __pyx_t_2 = 0;

  __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_AddTraceback("pymorphy._morph.GramForm.clear_case");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":68
 *         self.form.difference_update(RU_CASES)
 * 
 *     def clear_gender(self):             # <<<<<<<<<<<<<<
 *         '''     '''
 *         self.form.difference_update(RU_GENDERS)
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_clear_gender(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_8GramForm_clear_gender[] = " \321\203\320\261\321\200\320\260\321\202\321\214 \320\270\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\216 \320\276 \321\200\320\276\320\264\320\265 ";
static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_clear_gender(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  __Pyx_RefNannySetupContext("clear_gender");

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":70
 *     def clear_gender(self):
 *         '''     '''
 *         self.form.difference_update(RU_GENDERS)             # <<<<<<<<<<<<<<
 * 
 *     def clear_person(self):
 */
  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form), __pyx_n_s__difference_update); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__RU_GENDERS); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __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_2); __pyx_t_2 = 0;

  __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_AddTraceback("pymorphy._morph.GramForm.clear_gender");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":72
 *         self.form.difference_update(RU_GENDERS)
 * 
 *     def clear_person(self):             # <<<<<<<<<<<<<<
 *         '''     '''
 *         self.form.difference_update(RU_PERSONS)
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_clear_person(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_8GramForm_clear_person[] = " \321\203\320\261\321\200\320\260\321\202\321\214 \320\270\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\216 \320\276 \320\273\320\270\321\206\320\265 ";
static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_clear_person(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  __Pyx_RefNannySetupContext("clear_person");

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":74
 *     def clear_person(self):
 *         '''     '''
 *         self.form.difference_update(RU_PERSONS)             # <<<<<<<<<<<<<<
 * 
 *     def clear_tense(self):
 */
  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form), __pyx_n_s__difference_update); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__RU_PERSONS); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __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_2); __pyx_t_2 = 0;

  __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_AddTraceback("pymorphy._morph.GramForm.clear_person");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":76
 *         self.form.difference_update(RU_PERSONS)
 * 
 *     def clear_tense(self):             # <<<<<<<<<<<<<<
 *         '''     '''
 *         self.form.difference_update(RU_TENSES)
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_clear_tense(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_8GramForm_clear_tense[] = " \321\203\320\261\321\200\320\260\321\202\321\214 \320\270\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\216 \320\276 \320\262\321\200\320\265\320\274\320\265\320\275\320\270 ";
static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_clear_tense(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  __Pyx_RefNannySetupContext("clear_tense");

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":78
 *     def clear_tense(self):
 *         '''     '''
 *         self.form.difference_update(RU_TENSES)             # <<<<<<<<<<<<<<
 * 
 *     def clear_voice(self):
 */
  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form), __pyx_n_s__difference_update); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__RU_TENSES); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __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_2); __pyx_t_2 = 0;

  __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_AddTraceback("pymorphy._morph.GramForm.clear_tense");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":80
 *         self.form.difference_update(RU_TENSES)
 * 
 *     def clear_voice(self):             # <<<<<<<<<<<<<<
 *         '''     '''
 *         self.form.difference_update(RU_VOICES)
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_clear_voice(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_8GramForm_clear_voice[] = " \321\203\320\261\321\200\320\260\321\202\321\214 \320\270\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\216 \320\276 \320\267\320\260\320\273\320\276\320\263\320\265 ";
static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_clear_voice(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  __Pyx_RefNannySetupContext("clear_voice");

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":82
 *     def clear_voice(self):
 *         '''     '''
 *         self.form.difference_update(RU_VOICES)             # <<<<<<<<<<<<<<
 * 
 *     def update(self, form_string):
 */
  __pyx_t_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form), __pyx_n_s__difference_update); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__RU_VOICES); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __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_2); __pyx_t_2 = 0;

  __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_AddTraceback("pymorphy._morph.GramForm.clear_voice");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":84
 *         self.form.difference_update(RU_VOICES)
 * 
 *     def update(self, form_string):             # <<<<<<<<<<<<<<
 *         """  ,    ,  . """
 *         requested_form = [a for a in form_string.split(',') if a and a[0]!=u'!']
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_update(PyObject *__pyx_v_self, PyObject *__pyx_v_form_string); /*proto*/
static  struct __pyx_obj_8pymorphy_6_morph_GramForm *__pyx_f_8pymorphy_6_morph_8GramForm_update(struct __pyx_obj_8pymorphy_6_morph_GramForm *__pyx_v_self, PyObject *__pyx_v_form_string, int __pyx_skip_dispatch) {
  PyObject *__pyx_v_requested_form;
  PyObject *__pyx_v_item;
  PyObject *__pyx_v_a;
  struct __pyx_obj_8pymorphy_6_morph_GramForm *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  int __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_t_7;
  int __pyx_t_8;
  __Pyx_RefNannySetupContext("update");
  __pyx_v_requested_form = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_item = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_a = Py_None; __Pyx_INCREF(Py_None);
  /* Check if called by wrapper */
  if (unlikely(__pyx_skip_dispatch)) ;
  /* Check if overriden in Python */
  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__update); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_8pymorphy_6_morph_8GramForm_update)) {
      __Pyx_XDECREF(((PyObject *)__pyx_r));
      __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_INCREF(((PyObject *)__pyx_v_form_string));
      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_form_string));
      __Pyx_GIVEREF(((PyObject *)__pyx_v_form_string));
      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_8pymorphy_6_morph_GramForm))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_r = ((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_t_3);
      __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      goto __pyx_L0;
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":86
 *     def update(self, form_string):
 *         """  ,    ,  . """
 *         requested_form = [a for a in form_string.split(',') if a and a[0]!=u'!']             # <<<<<<<<<<<<<<
 * 
 *         for item in requested_form:
 */
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
  if (unlikely(__pyx_v_form_string == Py_None)) {
    PyErr_SetString(PyExc_AttributeError, "'NoneType' object has no attribute 'split'"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
  }
  __pyx_t_3 = ((PyObject *)PyUnicode_Split(__pyx_v_form_string, ((PyObject *)__pyx_kp_s_7), -1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
  if (likely(((PyObject *)__pyx_t_3) != Py_None)) {
    __pyx_t_4 = 0; __pyx_t_2 = ((PyObject *)__pyx_t_3); __Pyx_INCREF(__pyx_t_2);
  } else {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
  for (;;) {
    if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_2)) break;
    __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++;
    __Pyx_DECREF(__pyx_v_a);
    __pyx_v_a = __pyx_t_3;
    __pyx_t_3 = 0;
    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_v_a); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (__pyx_t_5) {
      __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_a, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_6 = PyObject_RichCompare(__pyx_t_3, ((PyObject *)__pyx_kp_u_8), Py_NE); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_t_8 = __pyx_t_7;
    } else {
      __pyx_t_8 = __pyx_t_5;
    }
    if (__pyx_t_8) {
      if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_v_a))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      goto __pyx_L5;
    }
    __pyx_L5:;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_INCREF(((PyObject *)__pyx_t_1));
  __Pyx_DECREF(((PyObject *)__pyx_v_requested_form));
  __pyx_v_requested_form = __pyx_t_1;
  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":88
 *         requested_form = [a for a in form_string.split(',') if a and a[0]!=u'!']
 * 
 *         for item in requested_form:             # <<<<<<<<<<<<<<
 * 
 *             if item in RU_NUMBERS:
 */
  if (likely(((PyObject *)__pyx_v_requested_form) != Py_None)) {
    __pyx_t_4 = 0; __pyx_t_1 = ((PyObject *)__pyx_v_requested_form); __Pyx_INCREF(__pyx_t_1);
  } else {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  for (;;) {
    if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_1)) break;
    __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_4); __Pyx_INCREF(__pyx_t_2); __pyx_t_4++;
    __Pyx_DECREF(__pyx_v_item);
    __pyx_v_item = __pyx_t_2;
    __pyx_t_2 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":90
 *         for item in requested_form:
 * 
 *             if item in RU_NUMBERS:             # <<<<<<<<<<<<<<
 *                 self.clear_number()
 *                 if item==u'':
 */
    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__RU_NUMBERS); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_8 = ((PySequence_Contains(__pyx_t_2, __pyx_v_item))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (__pyx_t_8) {

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":91
 * 
 *             if item in RU_NUMBERS:
 *                 self.clear_number()             # <<<<<<<<<<<<<<
 *                 if item==u'':
 *                     self.clear_gender()
 */
      __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__clear_number); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_6 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":92
 *             if item in RU_NUMBERS:
 *                 self.clear_number()
 *                 if item==u'':             # <<<<<<<<<<<<<<
 *                     self.clear_gender()
 * 
 */
      __pyx_t_6 = PyObject_RichCompare(__pyx_v_item, ((PyObject *)__pyx_n_u_9), Py_EQ); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      if (__pyx_t_8) {

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":93
 *                 self.clear_number()
 *                 if item==u'':
 *                     self.clear_gender()             # <<<<<<<<<<<<<<
 * 
 *             if item in RU_CASES:
 */
        __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__clear_gender); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_2 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        goto __pyx_L9;
      }
      __pyx_L9:;
      goto __pyx_L8;
    }
    __pyx_L8:;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":95
 *                     self.clear_gender()
 * 
 *             if item in RU_CASES:             # <<<<<<<<<<<<<<
 *                 self.clear_case()
 * 
 */
    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__RU_CASES); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_8 = ((PySequence_Contains(__pyx_t_2, __pyx_v_item))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (__pyx_t_8) {

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":96
 * 
 *             if item in RU_CASES:
 *                 self.clear_case()             # <<<<<<<<<<<<<<
 * 
 *             if item in RU_GENDERS:
 */
      __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__clear_case); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_6 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      goto __pyx_L10;
    }
    __pyx_L10:;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":98
 *                 self.clear_case()
 * 
 *             if item in RU_GENDERS:             # <<<<<<<<<<<<<<
 *                 self.clear_gender()
 * 
 */
    __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__RU_GENDERS); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_8 = ((PySequence_Contains(__pyx_t_6, __pyx_v_item))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    if (__pyx_t_8) {

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":99
 * 
 *             if item in RU_GENDERS:
 *                 self.clear_gender()             # <<<<<<<<<<<<<<
 * 
 *             if item in RU_TENSES:
 */
      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__clear_gender); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_2 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      goto __pyx_L11;
    }
    __pyx_L11:;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":101
 *                 self.clear_gender()
 * 
 *             if item in RU_TENSES:             # <<<<<<<<<<<<<<
 *                 self.clear_tense()
 *                 if item != u"":
 */
    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__RU_TENSES); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_8 = ((PySequence_Contains(__pyx_t_2, __pyx_v_item))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (__pyx_t_8) {

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":102
 * 
 *             if item in RU_TENSES:
 *                 self.clear_tense()             # <<<<<<<<<<<<<<
 *                 if item != u"":
 *                     self.clear_person()
 */
      __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__clear_tense); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_6 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":103
 *             if item in RU_TENSES:
 *                 self.clear_tense()
 *                 if item != u"":             # <<<<<<<<<<<<<<
 *                     self.clear_person()
 *                 if item != u"":
 */
      __pyx_t_6 = PyObject_RichCompare(__pyx_v_item, ((PyObject *)__pyx_n_u_10), Py_NE); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      if (__pyx_t_8) {

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":104
 *                 self.clear_tense()
 *                 if item != u"":
 *                     self.clear_person()             # <<<<<<<<<<<<<<
 *                 if item != u"":
 *                     self.clear_gender()
 */
        __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__clear_person); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_2 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        goto __pyx_L13;
      }
      __pyx_L13:;

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":105
 *                 if item != u"":
 *                     self.clear_person()
 *                 if item != u"":             # <<<<<<<<<<<<<<
 *                     self.clear_gender()
 * 
 */
      __pyx_t_2 = PyObject_RichCompare(__pyx_v_item, ((PyObject *)__pyx_n_u_11), Py_NE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      if (__pyx_t_8) {

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":106
 *                     self.clear_person()
 *                 if item != u"":
 *                     self.clear_gender()             # <<<<<<<<<<<<<<
 * 
 *             if item in RU_PERSONS:
 */
        __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__clear_gender); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_2);
        __pyx_t_6 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        goto __pyx_L14;
      }
      __pyx_L14:;
      goto __pyx_L12;
    }
    __pyx_L12:;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":108
 *                     self.clear_gender()
 * 
 *             if item in RU_PERSONS:             # <<<<<<<<<<<<<<
 *                 self.clear_person()
 * 
 */
    __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__RU_PERSONS); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_8 = ((PySequence_Contains(__pyx_t_6, __pyx_v_item))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    if (__pyx_t_8) {

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":109
 * 
 *             if item in RU_PERSONS:
 *                 self.clear_person()             # <<<<<<<<<<<<<<
 * 
 *             if item in RU_VOICES:
 */
      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__clear_person); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_2 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      goto __pyx_L15;
    }
    __pyx_L15:;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":111
 *                 self.clear_person()
 * 
 *             if item in RU_VOICES:             # <<<<<<<<<<<<<<
 *                 self.clear_voice()
 * 
 */
    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__RU_VOICES); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_8 = ((PySequence_Contains(__pyx_t_2, __pyx_v_item))); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (__pyx_t_8) {

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":112
 * 
 *             if item in RU_VOICES:
 *                 self.clear_voice()             # <<<<<<<<<<<<<<
 * 
 *         self.form.update(requested_form)
 */
      __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__clear_voice); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_6 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      goto __pyx_L16;
    }
    __pyx_L16:;
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":114
 *                 self.clear_voice()
 * 
 *         self.form.update(requested_form)             # <<<<<<<<<<<<<<
 *         return self
 * 
 */
  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->form), __pyx_n_s__update); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_INCREF(((PyObject *)__pyx_v_requested_form));
  PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_v_requested_form));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_requested_form));
  __pyx_t_2 = PyObject_Call(__pyx_t_1, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":115
 * 
 *         self.form.update(requested_form)
 *         return self             # <<<<<<<<<<<<<<
 * 
 *     def match(self, gram_form):
 */
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __pyx_r = __pyx_v_self;
  goto __pyx_L0;

  __pyx_r = ((struct __pyx_obj_8pymorphy_6_morph_GramForm *)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_6);
  __Pyx_AddTraceback("pymorphy._morph.GramForm.update");
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_requested_form);
  __Pyx_DECREF(__pyx_v_item);
  __Pyx_DECREF(__pyx_v_a);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":84
 *         self.form.difference_update(RU_VOICES)
 * 
 *     def update(self, form_string):             # <<<<<<<<<<<<<<
 *         """  ,    ,  . """
 *         requested_form = [a for a in form_string.split(',') if a and a[0]!=u'!']
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_update(PyObject *__pyx_v_self, PyObject *__pyx_v_form_string); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_8GramForm_update[] = " \320\236\320\261\320\275\320\276\320\262\320\273\321\217\320\265\321\202 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213, \320\277\320\276 \320\262\320\276\320\267\320\274\320\276\320\266\320\275\320\276\321\201\321\202\320\270 \320\276\321\201\321\202\320\260\320\262\320\273\321\217\321\217 \320\262\321\201\320\265, \321\207\321\202\320\276 \320\274\320\276\320\266\320\275\320\276. ";
static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_update(PyObject *__pyx_v_self, PyObject *__pyx_v_form_string) {
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("update");
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_form_string), &PyUnicode_Type, 1, "form_string", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_8pymorphy_6_morph_GramForm *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->__pyx_vtab)->update(((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self), __pyx_v_form_string, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("pymorphy._morph.GramForm.update");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":117
 *         return self
 * 
 *     def match(self, gram_form):             # <<<<<<<<<<<<<<
 *         if not self.form.issuperset(gram_form.form): #     gram_form
 *             return False
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_match(PyObject *__pyx_v_self, PyObject *__pyx_v_gram_form); /*proto*/
static  int __pyx_f_8pymorphy_6_morph_8GramForm_match(struct __pyx_obj_8pymorphy_6_morph_GramForm *__pyx_v_self, struct __pyx_obj_8pymorphy_6_morph_GramForm *__pyx_v_gram_form, int __pyx_skip_dispatch) {
  int __pyx_r;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_t_4;
  int __pyx_t_5;
  int __pyx_t_6;
  __Pyx_RefNannySetupContext("match");
  /* Check if called by wrapper */
  if (unlikely(__pyx_skip_dispatch)) ;
  /* Check if overriden in Python */
  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__match); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_8pymorphy_6_morph_8GramForm_match)) {
      __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_INCREF(((PyObject *)__pyx_v_gram_form));
      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_gram_form));
      __Pyx_GIVEREF(((PyObject *)__pyx_v_gram_form));
      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_t_4 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_r = __pyx_t_4;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      goto __pyx_L0;
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":118
 * 
 *     def match(self, gram_form):
 *         if not self.form.issuperset(gram_form.form): #     gram_form             # <<<<<<<<<<<<<<
 *             return False
 *         if self.form.intersection(gram_form.denied_form):
 */
  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self->form), __pyx_n_s__issuperset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(((PyObject *)__pyx_v_gram_form->form));
  PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_gram_form->form));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_gram_form->form));
  __pyx_t_2 = PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __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_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_6 = (!__pyx_t_5);
  if (__pyx_t_6) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":119
 *     def match(self, gram_form):
 *         if not self.form.issuperset(gram_form.form): #     gram_form
 *             return False             # <<<<<<<<<<<<<<
 *         if self.form.intersection(gram_form.denied_form):
 *             return False
 */
    __pyx_r = 0;
    goto __pyx_L0;
    goto __pyx_L3;
  }
  __pyx_L3:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":120
 *         if not self.form.issuperset(gram_form.form): #     gram_form
 *             return False
 *         if self.form.intersection(gram_form.denied_form):             # <<<<<<<<<<<<<<
 *             return False
 *         return True
 */
  __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self->form), __pyx_n_s__intersection); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(((PyObject *)__pyx_v_gram_form->denied_form));
  PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_gram_form->denied_form));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_gram_form->denied_form));
  __pyx_t_1 = PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __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_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_6) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":121
 *             return False
 *         if self.form.intersection(gram_form.denied_form):
 *             return False             # <<<<<<<<<<<<<<
 *         return True
 * 
 */
    __pyx_r = 0;
    goto __pyx_L0;
    goto __pyx_L4;
  }
  __pyx_L4:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":122
 *         if self.form.intersection(gram_form.denied_form):
 *             return False
 *         return True             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_r = 1;
  goto __pyx_L0;

  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_WriteUnraisable("pymorphy._morph.GramForm.match");
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":117
 *         return self
 * 
 *     def match(self, gram_form):             # <<<<<<<<<<<<<<
 *         if not self.form.issuperset(gram_form.form): #     gram_form
 *             return False
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_match(PyObject *__pyx_v_self, PyObject *__pyx_v_gram_form); /*proto*/
static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_match(PyObject *__pyx_v_self, PyObject *__pyx_v_gram_form) {
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("match");
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_gram_form), __pyx_ptype_8pymorphy_6_morph_GramForm, 1, "gram_form", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyInt_FromLong(((struct __pyx_vtabstruct_8pymorphy_6_morph_GramForm *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->__pyx_vtab)->match(((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self), ((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_gram_form), 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("pymorphy._morph.GramForm.match");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":130
 *     """
 * 
 *     def __init__(self, data_source, check_prefixes = True,             # <<<<<<<<<<<<<<
 *                  predict_by_prefix = True, predict_by_suffix = True,
 *                  handle_EE = False):
 */

static int __pyx_pf_8pymorphy_6_morph_5Morph___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_5Morph___init__[] = "\n        \320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213 \320\272\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\260:\n\n        * data_source: \320\270\321\201\321\202\320\276\321\207\320\275\320\270\320\272 \320\264\320\260\320\275\320\275\321\213\321\205. \320\234\320\276\320\266\320\265\321\202 \320\261\321\213\321\202\321\214\n          :class:`ShelveDataSource`, :class:`MrdDataSource`,\n          :class:`PickleDataSource` \320\270\320\273\320\270 \320\273\321\216\320\261\320\276\320\271 \320\264\321\200\321\203\320\263\320\276\320\271 \320\275\320\260\321\201\320\273\320\265\320\264\320\275\320\270\320\272\n          :class:`DictDataSource`, \321\203 \320\272\320\276\321\202\320\276\321\200\320\276\320\263\320\276 \320\265\321\201\321\202\321\214 \320\260\321\202\321\200\320\270\320\261\321\203\321\202\321\213\n          rules, lemmas, prefixes, gramtab, rule_freq, endings,\n          possible_rule_prefixes, \320\277\320\276\320\264\320\264\320\265\321\200\320\266\320\270\320\262\320\260\321\216\321\211\320\270\320\265 \320\264\320\276\321\201\321\202\321\203\320\277 \320\277\320\276 \320\272\320\273\321\216\321\207\321\203.\n        * check_prefixes: \320\277\321\200\320\276\320\262\320\265\321\200\321\217\321\202\321\214 \320\273\320\270 \320\262\320\276\320\276\320\261\321\211\320\265 \320\277\321\200\320\265\321\204\320\270\320\272\321\201\321\213\n        * predict_by_prefix: \320\277\321\200\320\265\320\264\321\201\320\272\320\260\320\267\321\213\320\262\320\260\321\202\321\214 \320\273\320\270 \320\277\320\276 \320\277\321\200\320\265\321\204\320\270\320\272\321\201\321\203\n        * predict_by_suffix: \320\277\321\200\320\265\320\264\321\201\320\272\320\260\320\267\321\213\320\262\320\260\321\202\321\214 \320\273\320\270 \320\277\320\276 \321\201\321\203\321\204\321\204\320\270\320\272\321\201\321\203\n        * handle_EE: \320\272\320\260\320\272 \320\276\320\261\321\200\320\260\320\261\3""20\260\321\202\321\213\320\262\320\260\321\202\321\214 \320\261\321\203\320\272\320\262\321\203 \321\221. \320\225\321\201\320\273\320\270 True, \321\202\320\276 \320\262\321\201\320\265 \320\261\321\203\320\272\320\262\321\213 \321\221\n          \321\201\321\207\320\270\321\202\320\260\321\216\321\202\321\201\321\217 \321\200\320\260\320\262\320\275\321\213\320\274\320\270 \320\265, \320\265\321\201\320\273\320\270 False - \321\200\320\260\320\267\320\275\321\213\320\274\320\270 \320\261\321\203\320\272\320\262\320\260\320\274\320\270. \320\237\320\276 \321\203\320\274\320\276\320\273\321\207\320\260\320\275\320\270\321\216\n          \320\262 \321\201\320\273\320\276\320\262\320\260\321\200\321\217\321\205 \320\262\321\201\320\265 \320\261\321\203\320\272\320\262\321\213 \321\221 \320\267\320\260\320\274\320\265\320\275\320\265\320\275\321\213 \320\275\320\260 \320\265, \320\270 \320\276\320\266\320\270\320\264\320\260\320\265\321\202\321\201\321\217, \321\207\321\202\320\276 \320\262\n          \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214\321\201\320\272\320\276\320\274 \320\262\320\262\320\276\320\264\320\265 \320\261\321\203\320\272\320\262 \321\221 \320\275\320\265 \320\261\321\203\320\264\320\265\321\202 (handle_EE=False).\n          \320\225\321\201\320\273\320\270 \321\201\320\273\320\276\320\262\320\260\321\200\321\214 \321\201\320\272\320\276\320\275\320\262\320\265\321\200\321\202\320\270\321\200\320\276\320\262\320\260\320\275 \321\201 handle_EE=True (\320\262 \320\275\320\265\320\274 \321\201\320\276\321\205\321\200\320\260\320\275\320\265\320\275\321\213\n          \320\261\321\203\320\272\320\262\321\213 \321\221), \321\202\320\276 \320\261\321\203\320\272\320\262\321\213 \320\265 \320\270 \321\221 \320\261\321\203\320\264\321\203\321\202 \321\201\321\207\320\270\321\202\320\260\321\202\321\214\321\201\321\217 \321\200\320\260\320\267\320\275\321\213\320\274\320\270 \320\261\321\203\320\272\320\262""\320\260\320\274\320\270, \321\215\321\202\320\276\n          \320\274\320\276\320\266\320\265\321\202 \320\277\321\200\320\270\320\262\320\265\321\201\321\202\320\270 \320\272 \320\275\320\265\320\276\320\266\320\270\320\264\320\260\320\275\320\275\320\276\321\201\321\202\321\217\320\274, \321\202.\320\272. \321\207\320\260\321\201\321\202\320\276 \320\262\320\274\320\265\321\201\321\202\320\276 \321\221 \320\277\320\270\321\210\321\203\321\202 \320\265, \320\260\n          \320\262 \321\201\320\273\320\276\320\262\320\260\321\200\320\265 \320\261\321\203\320\264\320\265\321\202 \321\201\320\273\320\276\320\262\320\276 \321\202\320\276\320\273\321\214\320\272\320\276 \321\201 \321\221. \320\237\321\200\320\270 handle_EE=True \320\267\320\260\320\277\321\200\320\276\321\201\321\213\n          \320\262\321\213\320\277\320\276\320\273\320\275\321\217\321\216\321\202\321\201\321\217 \320\277\320\276 2 \321\200\320\260\320\267\320\260, \321\201\320\276 \321\201\320\273\320\276\320\262\320\276\320\274 \"\320\272\320\260\320\272 \320\265\321\201\321\202\321\214\" \320\270 \321\201\320\276 \321\201\320\273\320\276\320\262\320\276\320\274, \321\203\n          \320\272\320\276\321\202\320\276\321\200\320\276\320\263\320\276 \320\262\321\201\320\265 \320\265 \320\267\320\260\320\274\320\265\320\275\320\265\320\275\321\213 \320\275\320\260 \321\221.\n        ";
struct wrapperbase __pyx_wrapperbase_8pymorphy_6_morph_5Morph___init__;
static int __pyx_pf_8pymorphy_6_morph_5Morph___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_data_source = 0;
  PyObject *__pyx_v_check_prefixes = 0;
  PyObject *__pyx_v_predict_by_prefix = 0;
  PyObject *__pyx_v_predict_by_suffix = 0;
  PyObject *__pyx_v_handle_EE = 0;
  int __pyx_r;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__data_source,&__pyx_n_s__check_prefixes,&__pyx_n_s__predict_by_prefix,&__pyx_n_s__predict_by_suffix,&__pyx_n_s__handle_EE,0};
  __Pyx_RefNannySetupContext("__init__");
  if (unlikely(__pyx_kwds)) {
    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
    PyObject* values[5] = {0,0,0,0,0};
    values[1] = __pyx_k_12;
    values[2] = __pyx_k_13;
    values[3] = __pyx_k_14;
    values[4] = __pyx_k_15;
    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);
      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;
    }
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  0:
      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__data_source);
      if (likely(values[0])) kw_args--;
      else goto __pyx_L5_argtuple_error;
      case  1:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__check_prefixes);
        if (value) { values[1] = value; kw_args--; }
      }
      case  2:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__predict_by_prefix);
        if (value) { values[2] = value; kw_args--; }
      }
      case  3:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__predict_by_suffix);
        if (value) { values[3] = value; kw_args--; }
      }
      case  4:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__handle_EE);
        if (value) { values[4] = value; kw_args--; }
      }
    }
    if (unlikely(kw_args > 0)) {
      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    }
    __pyx_v_data_source = values[0];
    __pyx_v_check_prefixes = values[1];
    __pyx_v_predict_by_prefix = values[2];
    __pyx_v_predict_by_suffix = values[3];
    __pyx_v_handle_EE = values[4];
  } else {
    __pyx_v_check_prefixes = __pyx_k_12;
    __pyx_v_predict_by_prefix = __pyx_k_13;
    __pyx_v_predict_by_suffix = __pyx_k_14;
    __pyx_v_handle_EE = __pyx_k_15;
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  5: __pyx_v_handle_EE = PyTuple_GET_ITEM(__pyx_args, 4);
      case  4: __pyx_v_predict_by_suffix = PyTuple_GET_ITEM(__pyx_args, 3);
      case  3: __pyx_v_predict_by_prefix = PyTuple_GET_ITEM(__pyx_args, 2);
      case  2: __pyx_v_check_prefixes = PyTuple_GET_ITEM(__pyx_args, 1);
      case  1: __pyx_v_data_source = PyTuple_GET_ITEM(__pyx_args, 0);
      break;
      default: goto __pyx_L5_argtuple_error;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("pymorphy._morph.Morph.__init__");
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":157
 *         '''
 * 
 *         self.data = data_source             # <<<<<<<<<<<<<<
 *         self.data.load()
 * 
 */
  __Pyx_INCREF(__pyx_v_data_source);
  __Pyx_GIVEREF(__pyx_v_data_source);
  __Pyx_GOTREF(((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->data);
  __Pyx_DECREF(((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->data);
  ((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->data = __pyx_v_data_source;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":158
 * 
 *         self.data = data_source
 *         self.data.load()             # <<<<<<<<<<<<<<
 * 
 *         self.check_prefixes = check_prefixes
 */
  __pyx_t_1 = PyObject_GetAttr(((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->data, __pyx_n_s__load); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":160
 *         self.data.load()
 * 
 *         self.check_prefixes = check_prefixes             # <<<<<<<<<<<<<<
 *         self.predict_by_prefix = predict_by_prefix
 *         self.predict_by_suffix = predict_by_suffix
 */
  __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_v_check_prefixes); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  ((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->check_prefixes = __pyx_t_3;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":161
 * 
 *         self.check_prefixes = check_prefixes
 *         self.predict_by_prefix = predict_by_prefix             # <<<<<<<<<<<<<<
 *         self.predict_by_suffix = predict_by_suffix
 * 
 */
  __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_v_predict_by_prefix); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  ((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->predict_by_prefix = __pyx_t_3;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":162
 *         self.check_prefixes = check_prefixes
 *         self.predict_by_prefix = predict_by_prefix
 *         self.predict_by_suffix = predict_by_suffix             # <<<<<<<<<<<<<<
 * 
 *         self.prediction_max_prefix_len = 5 #actually 5=4+1
 */
  __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_v_predict_by_suffix); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  ((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->predict_by_suffix = __pyx_t_3;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":164
 *         self.predict_by_suffix = predict_by_suffix
 * 
 *         self.prediction_max_prefix_len = 5 #actually 5=4+1             # <<<<<<<<<<<<<<
 *         self.prediction_min_suffix_len = 3 #actually 3=4-1
 * 
 */
  ((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->prediction_max_prefix_len = 5;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":165
 * 
 *         self.prediction_max_prefix_len = 5 #actually 5=4+1
 *         self.prediction_min_suffix_len = 3 #actually 3=4-1             # <<<<<<<<<<<<<<
 * 
 *         self.handle_EE = handle_EE
 */
  ((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->prediction_min_suffix_len = 3;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":167
 *         self.prediction_min_suffix_len = 3 #actually 3=4-1
 * 
 *         self.handle_EE = handle_EE             # <<<<<<<<<<<<<<
 * 
 *     def get_graminfo(self, word, standard=False, predict=True, **kwargs):
 */
  __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_v_handle_EE); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  ((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->handle_EE = __pyx_t_3;

  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("pymorphy._morph.Morph.__init__");
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":169
 *         self.handle_EE = handle_EE
 * 
 *     def get_graminfo(self, word, standard=False, predict=True, **kwargs):             # <<<<<<<<<<<<<<
 *         """         .
 *               standard=True,
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph_get_graminfo(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_5Morph_get_graminfo[] = " \320\222\320\265\321\200\320\275\321\203\321\202\321\214 \320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\321\203\321\216 \320\270\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\216 \320\276 \321\201\320\273\320\276\320\262\320\265 \320\270 \320\265\320\263\320\276 \320\275\320\276\321\200\320\274\320\260\320\273\321\214\320\275\321\203\321\216 \321\204\320\276\321\200\320\274\321\203.\n            \320\225\321\201\320\273\320\270 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200 standard=True, \321\202\320\276 \320\264\320\273\321\217 \320\272\320\260\320\266\320\264\320\276\320\263\320\276 \320\262\320\260\321\200\320\270\320\260\320\275\321\202\320\260 \321\200\320\260\320\267\320\261\320\276\321\200\320\260\n            \321\200\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\321\213 \320\262\320\276\320\267\320\262\321\200\320\260\321\211\320\260\321\216\321\202\321\201\321\217 \320\262 \321\201\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\320\276\320\274 \320\262\320\270\320\264\320\265 (\321\201\320\273\320\276\320\262\320\260\321\200\321\214 \320\262\320\270\320\264\320\260\n            {'class': <class>, 'info': <info>, 'norm': <norm>}, \320\276\320\261\320\276\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\n            \321\201\320\276\320\263\320\273\320\260\321\201\320\276\320\262\320\260\320\275\321\213 \321\201 \321\202\320\265\320\274\320\270, \321\207\321\202\320\276 \320\277\321\200\320\270\320\275\321\217\321\202\321\213 \320\275\320\260 \320\272\320\276\320\275\321\204\320\265\321\200\320\265\320\275\321\206\320\270\320\270 \320\224\320\270\320\260\320\273\320\276\320\263-2010. \320\225\321\201\320\273\320\270\n            standard = False (\320\277\320\276 \321\203\320\274\320\276\320\273\321\207\320\260\320\275\320\270\321\216), \321\202\320\276 \320\262\320\276\320\267\320\262\321\200\320\260\321\211\320\260\3""20\265\321\202\321\201\321\217 \320\261\320\276\320\273\321\214\321\210\320\265 \320\270\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\320\270\n            (\320\264\320\265\321\202\320\260\320\273\321\214\320\275\320\276\320\265 \321\200\320\260\320\267\320\261\320\270\320\265\320\275\320\270\320\265 \320\275\320\260 \321\207\320\260\321\201\321\202\320\270 \321\200\320\265\321\207\320\270, \320\261\320\276\320\273\321\214\321\210\320\265 \320\274\320\276\321\200\321\204\320\276\320\273\320\276\320\263\320\270\321\207\320\265\321\201\320\272\320\270\321\205\n            \320\277\321\200\320\270\320\267\320\275\320\260\320\272\320\276\320\262, \320\270\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\217 \320\276\320\261 \320\270\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\275\320\276\320\274 \320\260\320\273\320\263\320\276\321\200\320\270\321\202\320\274\320\265),\n            \320\276\320\261\320\276\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217 \320\276\320\277\321\200\320\265\320\264\320\265\320\273\321\217\321\216\321\202\321\201\321\217 \321\201\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\276\320\271 \321\201\320\273\320\276\320\262\320\260\321\200\320\265\320\271.\n        ";
static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph_get_graminfo(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_word = 0;
  PyObject *__pyx_v_standard = 0;
  PyObject *__pyx_v_predict = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_v_forms;
  PyObject *__pyx_v_info;
  PyObject *__pyx_v_new_forms;
  PyObject *__pyx_v_form;
  PyObject *__pyx_v_cls;
  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;
  int __pyx_t_6;
  PyObject *__pyx_t_7 = NULL;
  int __pyx_t_8;
  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__standard,&__pyx_n_s__predict,0};
  __Pyx_RefNannySetupContext("get_graminfo");
  __pyx_v_kwargs = PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL;
  __Pyx_GOTREF(__pyx_v_kwargs);
  if (unlikely(__pyx_kwds)) {
    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
    PyObject* values[3] = {0,0,0};
    values[1] = __pyx_k_18;
    values[2] = __pyx_k_19;
    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);
      case  0: break;
      default: goto __pyx_L5_argtuple_error;
    }
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  0:
      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word);
      if (likely(values[0])) kw_args--;
      else goto __pyx_L5_argtuple_error;
      case  1:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__standard);
        if (value) { values[1] = value; kw_args--; }
      }
      case  2:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__predict);
        if (value) { values[2] = value; kw_args--; }
      }
    }
    if (unlikely(kw_args > 0)) {
      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, __pyx_v_kwargs, values, PyTuple_GET_SIZE(__pyx_args), "get_graminfo") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    }
    __pyx_v_word = values[0];
    __pyx_v_standard = values[1];
    __pyx_v_predict = values[2];
  } else {
    __pyx_v_standard = __pyx_k_18;
    __pyx_v_predict = __pyx_k_19;
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  3: __pyx_v_predict = PyTuple_GET_ITEM(__pyx_args, 2);
      case  2: __pyx_v_standard = PyTuple_GET_ITEM(__pyx_args, 1);
      case  1: __pyx_v_word = PyTuple_GET_ITEM(__pyx_args, 0);
      break;
      default: goto __pyx_L5_argtuple_error;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("get_graminfo", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_DECREF(__pyx_v_kwargs);
  __Pyx_AddTraceback("pymorphy._morph.Morph.get_graminfo");
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_v_forms = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_info = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_new_forms = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_form = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_cls = Py_None; __Pyx_INCREF(Py_None);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":180
 *                .
 *         """
 *         forms = self._get_graminfo(word, predict=predict, **kwargs)             # <<<<<<<<<<<<<<
 *         #
 *         for info in forms:
 */
  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___get_graminfo); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_word);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_word);
  __Pyx_GIVEREF(__pyx_v_word);
  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
  if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__predict), __pyx_v_predict) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (PyDict_Update(((PyObject *)__pyx_t_3), ((PyObject *)__pyx_v_kwargs)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_4 = PyEval_CallObjectWithKeywords(__pyx_t_1, __pyx_t_2, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __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_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_v_forms);
  __pyx_v_forms = __pyx_t_4;
  __pyx_t_4 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":182
 *         forms = self._get_graminfo(word, predict=predict, **kwargs)
 *         #
 *         for info in forms:             # <<<<<<<<<<<<<<
 *             if 'prefixes' in info:
 *                 info['norm'] = (u''.join(info['prefixes']) + info['norm']).strip('-')
 */
  if (PyList_CheckExact(__pyx_v_forms) || PyTuple_CheckExact(__pyx_v_forms)) {
    __pyx_t_5 = 0; __pyx_t_4 = __pyx_v_forms; __Pyx_INCREF(__pyx_t_4);
  } else {
    __pyx_t_5 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_forms); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
  }
  for (;;) {
    if (likely(PyList_CheckExact(__pyx_t_4))) {
      if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_4)) break;
      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++;
    } else if (likely(PyTuple_CheckExact(__pyx_t_4))) {
      if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++;
    } else {
      __pyx_t_3 = PyIter_Next(__pyx_t_4);
      if (!__pyx_t_3) {
        if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        break;
      }
      __Pyx_GOTREF(__pyx_t_3);
    }
    __Pyx_DECREF(__pyx_v_info);
    __pyx_v_info = __pyx_t_3;
    __pyx_t_3 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":183
 *         #
 *         for info in forms:
 *             if 'prefixes' in info:             # <<<<<<<<<<<<<<
 *                 info['norm'] = (u''.join(info['prefixes']) + info['norm']).strip('-')
 * 
 */
    __pyx_t_6 = ((PySequence_Contains(__pyx_v_info, ((PyObject *)__pyx_n_s__prefixes)))); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (__pyx_t_6) {

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":184
 *         for info in forms:
 *             if 'prefixes' in info:
 *                 info['norm'] = (u''.join(info['prefixes']) + info['norm']).strip('-')             # <<<<<<<<<<<<<<
 * 
 *         #    ,
 */
      __pyx_t_3 = PyObject_GetItem(__pyx_v_info, ((PyObject *)__pyx_n_s__prefixes)); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_2 = ((PyObject *)PyUnicode_Join(__pyx_kp_u_1, __pyx_t_3)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(((PyObject *)__pyx_t_2));
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_t_3 = PyObject_GetItem(__pyx_v_info, ((PyObject *)__pyx_n_s__norm)); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_1 = PyNumber_Add(((PyObject *)__pyx_t_2), __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__strip); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_INCREF(((PyObject *)__pyx_kp_s_20));
      PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_s_20));
      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_20));
      __pyx_t_2 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      if (PyObject_SetItem(__pyx_v_info, ((PyObject *)__pyx_n_s__norm), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      goto __pyx_L8;
    }
    __pyx_L8:;
  }
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":187
 * 
 *         #    ,
 *         if standard:             # <<<<<<<<<<<<<<
 *             new_forms = []
 *             for form in forms:
 */
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_standard); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_6) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":188
 *         #    ,
 *         if standard:
 *             new_forms = []             # <<<<<<<<<<<<<<
 *             for form in forms:
 *                 cls, info = _convert_to_standard(form['class'], form['info'])
 */
    __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
    __Pyx_DECREF(((PyObject *)__pyx_v_new_forms));
    __pyx_v_new_forms = __pyx_t_4;
    __pyx_t_4 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":189
 *         if standard:
 *             new_forms = []
 *             for form in forms:             # <<<<<<<<<<<<<<
 *                 cls, info = _convert_to_standard(form['class'], form['info'])
 *                 new_forms.append({'class': cls, 'info': info, 'norm': form['norm']})
 */
    if (PyList_CheckExact(__pyx_v_forms) || PyTuple_CheckExact(__pyx_v_forms)) {
      __pyx_t_5 = 0; __pyx_t_4 = __pyx_v_forms; __Pyx_INCREF(__pyx_t_4);
    } else {
      __pyx_t_5 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_forms); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
    }
    for (;;) {
      if (likely(PyList_CheckExact(__pyx_t_4))) {
        if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_4)) break;
        __pyx_t_2 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_2); __pyx_t_5++;
      } else if (likely(PyTuple_CheckExact(__pyx_t_4))) {
        if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
        __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_2); __pyx_t_5++;
      } else {
        __pyx_t_2 = PyIter_Next(__pyx_t_4);
        if (!__pyx_t_2) {
          if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          break;
        }
        __Pyx_GOTREF(__pyx_t_2);
      }
      __Pyx_DECREF(__pyx_v_form);
      __pyx_v_form = __pyx_t_2;
      __pyx_t_2 = 0;

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":190
 *             new_forms = []
 *             for form in forms:
 *                 cls, info = _convert_to_standard(form['class'], form['info'])             # <<<<<<<<<<<<<<
 *                 new_forms.append({'class': cls, 'info': info, 'norm': form['norm']})
 *             return new_forms
 */
      __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s_21); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_1 = PyObject_GetItem(__pyx_v_form, ((PyObject *)__pyx_n_s__class)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_3 = PyObject_GetItem(__pyx_v_form, ((PyObject *)__pyx_n_s__info)); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_1);
      __Pyx_GIVEREF(__pyx_t_1);
      PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_3);
      __Pyx_GIVEREF(__pyx_t_3);
      __pyx_t_1 = 0;
      __pyx_t_3 = 0;
      __pyx_t_3 = PyObject_Call(__pyx_t_2, __pyx_t_7, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      if (PyTuple_CheckExact(__pyx_t_3) && likely(PyTuple_GET_SIZE(__pyx_t_3) == 2)) {
        PyObject* tuple = __pyx_t_3;
        __pyx_t_7 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_t_7);
        __pyx_t_2 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        __Pyx_DECREF(__pyx_v_cls);
        __pyx_v_cls = __pyx_t_7;
        __pyx_t_7 = 0;
        __Pyx_DECREF(__pyx_v_info);
        __pyx_v_info = __pyx_t_2;
        __pyx_t_2 = 0;
      } else {
        __pyx_t_1 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        __pyx_t_7 = __Pyx_UnpackItem(__pyx_t_1, 0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_7);
        __pyx_t_2 = __Pyx_UnpackItem(__pyx_t_1, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_2);
        if (__Pyx_EndUnpack(__pyx_t_1, 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __Pyx_DECREF(__pyx_v_cls);
        __pyx_v_cls = __pyx_t_7;
        __pyx_t_7 = 0;
        __Pyx_DECREF(__pyx_v_info);
        __pyx_v_info = __pyx_t_2;
        __pyx_t_2 = 0;
      }

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":191
 *             for form in forms:
 *                 cls, info = _convert_to_standard(form['class'], form['info'])
 *                 new_forms.append({'class': cls, 'info': info, 'norm': form['norm']})             # <<<<<<<<<<<<<<
 *             return new_forms
 *         return forms
 */
      if (unlikely(__pyx_v_new_forms == Py_None)) {
        PyErr_SetString(PyExc_AttributeError, "'NoneType' object has no attribute 'append'"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
      }
      __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
      if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__class), __pyx_v_cls) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__info), __pyx_v_info) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_2 = PyObject_GetItem(__pyx_v_form, ((PyObject *)__pyx_n_s__norm)); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__norm), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_t_8 = PyList_Append(((PyObject *)__pyx_v_new_forms), ((PyObject *)__pyx_t_3)); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
    }
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":192
 *                 cls, info = _convert_to_standard(form['class'], form['info'])
 *                 new_forms.append({'class': cls, 'info': info, 'norm': form['norm']})
 *             return new_forms             # <<<<<<<<<<<<<<
 *         return forms
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(((PyObject *)__pyx_v_new_forms));
    __pyx_r = ((PyObject *)__pyx_v_new_forms);
    goto __pyx_L0;
    goto __pyx_L9;
  }
  __pyx_L9:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":193
 *                 new_forms.append({'class': cls, 'info': info, 'norm': form['norm']})
 *             return new_forms
 *         return forms             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_forms);
  __pyx_r = __pyx_v_forms;
  goto __pyx_L0;

  __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_7);
  __Pyx_AddTraceback("pymorphy._morph.Morph.get_graminfo");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_kwargs);
  __Pyx_DECREF(__pyx_v_forms);
  __Pyx_DECREF(__pyx_v_info);
  __Pyx_DECREF(__pyx_v_new_forms);
  __Pyx_DECREF(__pyx_v_form);
  __Pyx_DECREF(__pyx_v_cls);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":196
 * 
 * 
 *     def decline(self, word, gram_form=u'', gram_class=None):             # <<<<<<<<<<<<<<
 *         """
 *            ,
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph_decline(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_5Morph_decline[] = "\n        \320\222\320\265\321\200\320\275\321\203\321\202\321\214 \320\262\321\201\320\265 \320\262\320\260\321\200\320\270\320\260\320\275\321\202\321\213 \321\201\320\273\320\276\320\262\320\260, \321\201\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\321\203\321\216\321\211\320\270\320\265 \320\267\320\260\320\264\320\260\320\275\320\275\320\276\320\271\n        \320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\271 \321\204\320\276\321\200\320\274\320\265 \320\270 \321\207\320\260\321\201\321\202\320\270 \321\200\320\265\321\207\320\270.\n\n        \320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213:\n\n        * word - \321\201\320\273\320\276\320\262\320\276, \320\272\320\276\321\202\320\276\321\200\320\276\320\265 \321\205\320\276\321\202\320\270\320\274 \321\201\320\272\320\273\320\276\320\275\321\217\321\202\321\214\n        * gram_form - \320\266\320\265\320\273\320\260\320\265\320\274\321\213\320\265 \321\205\320\260\321\200\320\260\320\272\321\202\320\265\321\200\320\270\321\201\321\202\320\270\320\272\320\270 \320\263\321\200\320\260\320\274. \321\204\320\276\321\200\320\274\321\213. \320\222\321\213\321\201\321\202\321\203\320\277\320\260\320\265\321\202 \320\262 \321\200\320\276\320\273\320\270\n          \321\204\320\270\320\273\321\214\321\202\321\200\320\260. \320\234\320\276\320\266\320\265\321\202 \320\261\321\213\321\202\321\214 \320\277\321\203\321\201\321\202\321\213\320\274, \321\202\320\276\320\263\320\264\320\260 \320\261\321\203\320\264\321\203\321\202 \320\262\320\276\320\267\320\262\321\200\320\260\321\211\320\265\320\275\321\213 \320\262\321\201\320\265\n          \321\204\320\276\321\200\320\274\321\213 \321\201\320\273\320\276\320\262\320\260.\n        * gram_class - \321\207\320\260\321\201\321\202\321\214 \321\200\320\265\321\207\320\270. \320\225\321\201\320\273\320\270 \320\277\320\265\321\200\320\265\320\264\320\260\320\275 \3""21\215\321\202\320\276\321\202 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200, \321\202\320\276 \321\201\320\273\320\276\320\262\320\276\n          \320\261\321\203\320\264\320\265\321\202 \321\201\321\207\320\270\321\202\320\260\321\202\321\214\321\201\321\217 \321\201\320\273\320\276\320\262\320\276\320\274 \321\215\321\202\320\276\320\271 \321\207\320\260\321\201\321\202\320\270 \321\200\320\265\321\207\320\270 (\320\265\321\201\320\273\320\270 \320\262\320\276\320\267\320\274\320\276\320\266\320\275\320\276), \320\270\n          \321\201\320\272\320\273\320\276\320\275\321\217\321\202\321\214\321\201\321\217 \320\261\321\203\320\264\320\265\321\202 \321\201\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\320\265\320\275\320\275\320\276. \320\225\321\201\320\273\320\270 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200 \320\275\320\265 \320\277\320\265\321\200\320\265\320\264\320\260\320\275,\n          \320\276\320\263\321\200\320\260\320\275\320\270\321\207\320\265\320\275\320\270\321\217 \320\275\320\260 \321\207\320\260\321\201\321\202\321\214 \321\200\320\265\321\207\320\270 \320\275\320\260\320\272\320\273\320\260\320\264\321\213\320\262\320\260\321\202\321\214\321\201\321\217 \320\275\320\265 \320\261\321\203\320\264\321\203\321\202.\n        ";
static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph_decline(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_word = 0;
  PyObject *__pyx_v_gram_form = 0;
  PyObject *__pyx_v_gram_class = 0;
  PyObject *__pyx_v_requested_attrs;
  PyObject *__pyx_v_variants;
  PyObject *__pyx_v_form;
  PyObject *__pyx_v_form_attrs;
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  int __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_t_7;
  int __pyx_t_8;
  int __pyx_t_9;
  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__gram_form,&__pyx_n_s__gram_class,0};
  __Pyx_RefNannySetupContext("decline");
  if (unlikely(__pyx_kwds)) {
    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
    PyObject* values[3] = {0,0,0};
    values[1] = ((PyObject *)__pyx_kp_u_1);
    values[2] = ((PyObject *)Py_None);
    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);
      case  0: break;
      default: goto __pyx_L5_argtuple_error;
    }
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  0:
      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word);
      if (likely(values[0])) kw_args--;
      else goto __pyx_L5_argtuple_error;
      case  1:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__gram_form);
        if (value) { values[1] = value; kw_args--; }
      }
      case  2:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__gram_class);
        if (value) { values[2] = value; kw_args--; }
      }
    }
    if (unlikely(kw_args > 0)) {
      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "decline") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 196; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    }
    __pyx_v_word = values[0];
    __pyx_v_gram_form = values[1];
    __pyx_v_gram_class = values[2];
  } else {
    __pyx_v_gram_form = ((PyObject *)__pyx_kp_u_1);
    __pyx_v_gram_class = ((PyObject *)Py_None);
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  3: __pyx_v_gram_class = PyTuple_GET_ITEM(__pyx_args, 2);
      case  2: __pyx_v_gram_form = PyTuple_GET_ITEM(__pyx_args, 1);
      case  1: __pyx_v_word = PyTuple_GET_ITEM(__pyx_args, 0);
      break;
      default: goto __pyx_L5_argtuple_error;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("decline", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 196; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("pymorphy._morph.Morph.decline");
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_v_requested_attrs = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_variants = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_form = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_form_attrs = Py_None; __Pyx_INCREF(Py_None);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":212
 *                 .
 *         """
 *         requested_attrs = gram_form.split(',')             # <<<<<<<<<<<<<<
 *         variants = []
 *         for form in self._decline(word):
 */
  __pyx_t_1 = PyObject_GetAttr(__pyx_v_gram_form, __pyx_n_s__split); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(((PyObject *)__pyx_kp_s_7));
  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_7));
  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_7));
  __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __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_v_requested_attrs);
  __pyx_v_requested_attrs = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":213
 *         """
 *         requested_attrs = gram_form.split(',')
 *         variants = []             # <<<<<<<<<<<<<<
 *         for form in self._decline(word):
 *             if gram_class:
 */
  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
  __Pyx_DECREF(((PyObject *)__pyx_v_variants));
  __pyx_v_variants = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":214
 *         requested_attrs = gram_form.split(',')
 *         variants = []
 *         for form in self._decline(word):             # <<<<<<<<<<<<<<
 *             if gram_class:
 *                 if form['class'] != gram_class:
 */
  __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___decline); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_word);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_word);
  __Pyx_GIVEREF(__pyx_v_word);
  __pyx_t_1 = PyObject_Call(__pyx_t_3, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) {
    __pyx_t_4 = 0; __pyx_t_2 = __pyx_t_1; __Pyx_INCREF(__pyx_t_2);
  } else {
    __pyx_t_4 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  for (;;) {
    if (likely(PyList_CheckExact(__pyx_t_2))) {
      if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_2)) break;
      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++;
    } else if (likely(PyTuple_CheckExact(__pyx_t_2))) {
      if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++;
    } else {
      __pyx_t_1 = PyIter_Next(__pyx_t_2);
      if (!__pyx_t_1) {
        if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        break;
      }
      __Pyx_GOTREF(__pyx_t_1);
    }
    __Pyx_DECREF(__pyx_v_form);
    __pyx_v_form = __pyx_t_1;
    __pyx_t_1 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":215
 *         variants = []
 *         for form in self._decline(word):
 *             if gram_class:             # <<<<<<<<<<<<<<
 *                 if form['class'] != gram_class:
 *                     continue
 */
    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_v_gram_class); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (__pyx_t_5) {

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":216
 *         for form in self._decline(word):
 *             if gram_class:
 *                 if form['class'] != gram_class:             # <<<<<<<<<<<<<<
 *                     continue
 *             form_attrs = form['info'].split(',')
 */
      __pyx_t_1 = PyObject_GetItem(__pyx_v_form, ((PyObject *)__pyx_n_s__class)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_3 = PyObject_RichCompare(__pyx_t_1, __pyx_v_gram_class, Py_NE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      if (__pyx_t_5) {

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":217
 *             if gram_class:
 *                 if form['class'] != gram_class:
 *                     continue             # <<<<<<<<<<<<<<
 *             form_attrs = form['info'].split(',')
 *             if _array_match(form_attrs, requested_attrs):
 */
        goto __pyx_L6_continue;
        goto __pyx_L9;
      }
      __pyx_L9:;
      goto __pyx_L8;
    }
    __pyx_L8:;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":218
 *                 if form['class'] != gram_class:
 *                     continue
 *             form_attrs = form['info'].split(',')             # <<<<<<<<<<<<<<
 *             if _array_match(form_attrs, requested_attrs):
 *                 variants.append(form)
 */
    __pyx_t_3 = PyObject_GetItem(__pyx_v_form, ((PyObject *)__pyx_n_s__info)); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__split); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(((PyObject *)__pyx_kp_s_7));
    PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_s_7));
    __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_7));
    __pyx_t_6 = PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_v_form_attrs);
    __pyx_v_form_attrs = __pyx_t_6;
    __pyx_t_6 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":219
 *                     continue
 *             form_attrs = form['info'].split(',')
 *             if _array_match(form_attrs, requested_attrs):             # <<<<<<<<<<<<<<
 *                 variants.append(form)
 * 
 */
    if (!(likely(PyList_CheckExact(__pyx_v_form_attrs))||((__pyx_v_form_attrs) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected list, got %.200s", Py_TYPE(__pyx_v_form_attrs)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (!(likely(PyList_CheckExact(__pyx_v_requested_attrs))||((__pyx_v_requested_attrs) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected list, got %.200s", Py_TYPE(__pyx_v_requested_attrs)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_7 = __pyx_f_8pymorphy_6_morph__array_match(((PyObject *)__pyx_v_form_attrs), ((PyObject *)__pyx_v_requested_attrs), 0);
    if (__pyx_t_7) {

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":220
 *             form_attrs = form['info'].split(',')
 *             if _array_match(form_attrs, requested_attrs):
 *                 variants.append(form)             # <<<<<<<<<<<<<<
 * 
 *         if not variants and u'2' in requested_attrs:
 */
      if (unlikely(__pyx_v_variants == Py_None)) {
        PyErr_SetString(PyExc_AttributeError, "'NoneType' object has no attribute 'append'"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
      }
      __pyx_t_7 = PyList_Append(((PyObject *)__pyx_v_variants), __pyx_v_form); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      goto __pyx_L10;
    }
    __pyx_L10:;
    __pyx_L6_continue:;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":222
 *                 variants.append(form)
 * 
 *         if not variants and u'2' in requested_attrs:             # <<<<<<<<<<<<<<
 *             return self.decline(word, gram_form.replace(u'2',u''), gram_class)
 * 
 */
  __pyx_t_5 = (((PyObject *)__pyx_v_variants) != Py_None) && (PyList_GET_SIZE(((PyObject *)__pyx_v_variants)) != 0);
  __pyx_t_8 = (!__pyx_t_5);
  if (__pyx_t_8) {
    __pyx_t_5 = ((PySequence_Contains(__pyx_v_requested_attrs, ((PyObject *)__pyx_kp_u__2)))); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_9 = __pyx_t_5;
  } else {
    __pyx_t_9 = __pyx_t_8;
  }
  if (__pyx_t_9) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":223
 * 
 *         if not variants and u'2' in requested_attrs:
 *             return self.decline(word, gram_form.replace(u'2',u''), gram_class)             # <<<<<<<<<<<<<<
 * 
 *         return variants
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__decline); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_6 = PyObject_GetAttr(__pyx_v_gram_form, __pyx_n_s__replace); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(((PyObject *)__pyx_kp_u__2));
    PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_u__2));
    __Pyx_GIVEREF(((PyObject *)__pyx_kp_u__2));
    __Pyx_INCREF(((PyObject *)__pyx_kp_u_1));
    PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_kp_u_1));
    __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_1));
    __pyx_t_1 = PyObject_Call(__pyx_t_6, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_v_word);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_word);
    __Pyx_GIVEREF(__pyx_v_word);
    PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1);
    __Pyx_GIVEREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_v_gram_class);
    PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_gram_class);
    __Pyx_GIVEREF(__pyx_v_gram_class);
    __pyx_t_1 = 0;
    __pyx_t_1 = PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __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;
    goto __pyx_L11;
  }
  __pyx_L11:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":225
 *             return self.decline(word, gram_form.replace(u'2',u''), gram_class)
 * 
 *         return variants             # <<<<<<<<<<<<<<
 * 
 *     def inflect_ru(self, word, gram_form, gram_class=None):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_variants));
  __pyx_r = ((PyObject *)__pyx_v_variants);
  goto __pyx_L0;

  __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_6);
  __Pyx_AddTraceback("pymorphy._morph.Morph.decline");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_requested_attrs);
  __Pyx_DECREF(__pyx_v_variants);
  __Pyx_DECREF(__pyx_v_form);
  __Pyx_DECREF(__pyx_v_form_attrs);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":227
 *         return variants
 * 
 *     def inflect_ru(self, word, gram_form, gram_class=None):             # <<<<<<<<<<<<<<
 *         """
 *           ,
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph_inflect_ru(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_5Morph_inflect_ru[] = "\n        \320\222\320\265\321\200\320\275\321\203\321\202\321\214 \320\262\320\260\321\200\320\270\320\260\320\275\321\202 \321\201\320\273\320\276\320\262\320\260, \320\272\320\276\321\202\320\276\321\200\321\213\320\271 \321\201\320\276\320\276\321\202\320\262\320\265\321\201\321\202\320\262\321\203\320\265\321\202 \320\264\320\260\320\275\320\275\320\276\320\271 \320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\271\n        \321\204\320\276\321\200\320\274\320\265 \320\270 \321\207\320\260\321\201\321\202\320\270 \321\200\320\265\321\207\320\270, \320\260 \321\202\320\260\320\272\320\266\320\265 \320\274\320\265\320\275\320\265\320\265 \320\262\321\201\320\265\320\263\320\276 \320\276\321\202\320\273\320\270\321\207\320\260\320\265\321\202\321\201\321\217 \320\276\321\202 \320\270\321\201\321\205\320\276\320\264\320\275\320\276\320\263\320\276.\n\n        \320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213:\n\n        * word - \321\201\320\273\320\276\320\262\320\276, \320\272\320\276\321\202\320\276\321\200\320\276\320\265 \321\205\320\276\321\202\320\270\320\274 \321\201\320\272\320\273\320\276\320\275\321\217\321\202\321\214\n        * gram_form - \320\266\320\265\320\273\320\260\320\265\320\274\321\213\320\265 \321\205\320\260\321\200\320\260\320\272\321\202\320\265\321\200\320\270\321\201\321\202\320\270\320\272\320\270 \320\263\321\200\320\260\320\274. \321\204\320\276\321\200\320\274\321\213\n        * gram_class - \321\207\320\260\321\201\321\202\321\214 \321\200\320\265\321\207\320\270. \320\225\321\201\320\273\320\270 \320\277\320\265\321\200\320\265\320\264\320\260\320\275 \321\215\321\202\320\276\321\202 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200, \321\202\320\276 \321\201\320\273\320\276\320\262\320\276\n          \320\261\321\203\320\264\320\265\321\202 \321\201\321\207\320\270\321\202\320\260\321\202\321\214\321\201\321\217 \321\201\320\273\320\27""6\320\262\320\276\320\274 \321\215\321\202\320\276\320\271 \321\207\320\260\321\201\321\202\320\270 \321\200\320\265\321\207\320\270 (\320\265\321\201\320\273\320\270 \320\262\320\276\320\267\320\274\320\276\320\266\320\275\320\276), \320\270\n          \321\201\320\272\320\273\320\276\320\275\321\217\321\202\321\214\321\201\321\217 \320\261\321\203\320\264\320\265\321\202 \321\201\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\320\265\320\275\320\275\320\276. \320\242\321\200\320\265\320\261\321\203\320\265\321\202\321\201\321\217 \320\264\320\273\321\217 \321\203\321\201\321\202\321\200\320\260\320\275\320\265\320\275\320\270\321\217\n          \320\275\320\265\320\276\320\264\320\275\320\276\320\267\320\275\320\260\321\207\320\275\320\276\321\201\321\202\320\265\320\271.\n        ";
static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph_inflect_ru(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_word = 0;
  PyObject *__pyx_v_gram_form = 0;
  PyObject *__pyx_v_gram_class = 0;
  PyObject *__pyx_v_forms;
  PyObject *__pyx_v_graminfo;
  PyObject *__pyx_v_form;
  PyObject *__pyx_v_variants;
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_t_4;
  Py_ssize_t __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_t_7;
  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__gram_form,&__pyx_n_s__gram_class,0};
  __Pyx_RefNannySetupContext("inflect_ru");
  if (unlikely(__pyx_kwds)) {
    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
    PyObject* values[3] = {0,0,0};
    values[2] = ((PyObject *)Py_None);
    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);
      case  0: break;
      default: goto __pyx_L5_argtuple_error;
    }
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  0:
      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word);
      if (likely(values[0])) kw_args--;
      else goto __pyx_L5_argtuple_error;
      case  1:
      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__gram_form);
      if (likely(values[1])) kw_args--;
      else {
        __Pyx_RaiseArgtupleInvalid("inflect_ru", 0, 2, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
      case  2:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__gram_class);
        if (value) { values[2] = value; kw_args--; }
      }
    }
    if (unlikely(kw_args > 0)) {
      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "inflect_ru") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    }
    __pyx_v_word = values[0];
    __pyx_v_gram_form = values[1];
    __pyx_v_gram_class = values[2];
  } else {
    __pyx_v_gram_class = ((PyObject *)Py_None);
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  3:
      __pyx_v_gram_class = PyTuple_GET_ITEM(__pyx_args, 2);
      case  2:
      __pyx_v_gram_form = PyTuple_GET_ITEM(__pyx_args, 1);
      __pyx_v_word = PyTuple_GET_ITEM(__pyx_args, 0);
      break;
      default: goto __pyx_L5_argtuple_error;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("inflect_ru", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("pymorphy._morph.Morph.inflect_ru");
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_v_forms = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_graminfo = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_form = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_variants = Py_None; __Pyx_INCREF(Py_None);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":241
 *           .
 *         """
 *         forms = self.get_graminfo(word)             # <<<<<<<<<<<<<<
 *         if gram_class is not None:
 *             forms = [form for form in forms if form['class'] == gram_class]
 */
  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_graminfo); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_word);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_word);
  __Pyx_GIVEREF(__pyx_v_word);
  __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __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_v_forms);
  __pyx_v_forms = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":242
 *         """
 *         forms = self.get_graminfo(word)
 *         if gram_class is not None:             # <<<<<<<<<<<<<<
 *             forms = [form for form in forms if form['class'] == gram_class]
 *         if not forms:
 */
  __pyx_t_4 = (__pyx_v_gram_class != Py_None);
  if (__pyx_t_4) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":243
 *         forms = self.get_graminfo(word)
 *         if gram_class is not None:
 *             forms = [form for form in forms if form['class'] == gram_class]             # <<<<<<<<<<<<<<
 *         if not forms:
 *             return word
 */
    __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
    if (PyList_CheckExact(__pyx_v_forms) || PyTuple_CheckExact(__pyx_v_forms)) {
      __pyx_t_5 = 0; __pyx_t_2 = __pyx_v_forms; __Pyx_INCREF(__pyx_t_2);
    } else {
      __pyx_t_5 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_forms); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
    }
    for (;;) {
      if (likely(PyList_CheckExact(__pyx_t_2))) {
        if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_2)) break;
        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++;
      } else if (likely(PyTuple_CheckExact(__pyx_t_2))) {
        if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++;
      } else {
        __pyx_t_1 = PyIter_Next(__pyx_t_2);
        if (!__pyx_t_1) {
          if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          break;
        }
        __Pyx_GOTREF(__pyx_t_1);
      }
      __Pyx_DECREF(__pyx_v_form);
      __pyx_v_form = __pyx_t_1;
      __pyx_t_1 = 0;
      __pyx_t_1 = PyObject_GetItem(__pyx_v_form, ((PyObject *)__pyx_n_s__class)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_6 = PyObject_RichCompare(__pyx_t_1, __pyx_v_gram_class, Py_EQ); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      if (__pyx_t_4) {
        if (unlikely(PyList_Append(__pyx_t_3, (PyObject*)__pyx_v_form))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        goto __pyx_L9;
      }
      __pyx_L9:;
    }
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_INCREF(((PyObject *)__pyx_t_3));
    __Pyx_DECREF(__pyx_v_forms);
    __pyx_v_forms = ((PyObject *)__pyx_t_3);
    __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
    goto __pyx_L6;
  }
  __pyx_L6:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":244
 *         if gram_class is not None:
 *             forms = [form for form in forms if form['class'] == gram_class]
 *         if not forms:             # <<<<<<<<<<<<<<
 *             return word
 * 
 */
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_forms); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 244; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_7 = (!__pyx_t_4);
  if (__pyx_t_7) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":245
 *             forms = [form for form in forms if form['class'] == gram_class]
 *         if not forms:
 *             return word             # <<<<<<<<<<<<<<
 * 
 *         # FIXME:
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_v_word);
    __pyx_r = __pyx_v_word;
    goto __pyx_L0;
    goto __pyx_L10;
  }
  __pyx_L10:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":249
 *         # FIXME:
 *         # ,   ",".  ",".
 *         graminfo = forms[0]             # <<<<<<<<<<<<<<
 * 
 *         form = GramForm(graminfo['info'])
 */
  __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_forms, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_v_graminfo);
  __pyx_v_graminfo = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":251
 *         graminfo = forms[0]
 * 
 *         form = GramForm(graminfo['info'])             # <<<<<<<<<<<<<<
 *         form.update(gram_form)
 * 
 */
  __pyx_t_3 = PyObject_GetItem(__pyx_v_graminfo, ((PyObject *)__pyx_n_s__info)); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_3);
  __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_8pymorphy_6_morph_GramForm)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_v_form);
  __pyx_v_form = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":252
 * 
 *         form = GramForm(graminfo['info'])
 *         form.update(gram_form)             # <<<<<<<<<<<<<<
 * 
 *         variants = self.decline(word, form.get_form_string(), graminfo['class'])
 */
  __pyx_t_3 = PyObject_GetAttr(__pyx_v_form, __pyx_n_s__update); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_gram_form);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_gram_form);
  __Pyx_GIVEREF(__pyx_v_gram_form);
  __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_t_2, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":254
 *         form.update(gram_form)
 * 
 *         variants = self.decline(word, form.get_form_string(), graminfo['class'])             # <<<<<<<<<<<<<<
 *         if len(variants):
 *             return variants[0]['word']
 */
  __pyx_t_6 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__decline); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_2 = PyObject_GetAttr(__pyx_v_form, __pyx_n_s__get_form_string); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyObject_GetItem(__pyx_v_graminfo, ((PyObject *)__pyx_n_s__class)); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_word);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_word);
  __Pyx_GIVEREF(__pyx_v_word);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_3 = 0;
  __pyx_t_2 = 0;
  __pyx_t_2 = PyObject_Call(__pyx_t_6, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_v_variants);
  __pyx_v_variants = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":255
 * 
 *         variants = self.decline(word, form.get_form_string(), graminfo['class'])
 *         if len(variants):             # <<<<<<<<<<<<<<
 *             return variants[0]['word']
 *         else:
 */
  __pyx_t_5 = PyObject_Length(__pyx_v_variants); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_5) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":256
 *         variants = self.decline(word, form.get_form_string(), graminfo['class'])
 *         if len(variants):
 *             return variants[0]['word']             # <<<<<<<<<<<<<<
 *         else:
 *             return word
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_variants, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = PyObject_GetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__word)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __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;
    goto __pyx_L11;
  }
  /*else*/ {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":258
 *             return variants[0]['word']
 *         else:
 *             return word             # <<<<<<<<<<<<<<
 * 
 *     def pluralize_ru(self, word, gram_form=u'', gram_class=None):
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_v_word);
    __pyx_r = __pyx_v_word;
    goto __pyx_L0;
  }
  __pyx_L11:;

  __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_6);
  __Pyx_AddTraceback("pymorphy._morph.Morph.inflect_ru");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_forms);
  __Pyx_DECREF(__pyx_v_graminfo);
  __Pyx_DECREF(__pyx_v_form);
  __Pyx_DECREF(__pyx_v_variants);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":260
 *             return word
 * 
 *     def pluralize_ru(self, word, gram_form=u'', gram_class=None):             # <<<<<<<<<<<<<<
 *         """
 *             .
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph_pluralize_ru(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_5Morph_pluralize_ru[] = "\n        \320\222\320\265\321\200\320\275\321\203\321\202\321\214 \321\201\320\273\320\276\320\262\320\276 \320\262\320\276 \320\274\320\275\320\276\320\266\320\265\321\201\321\202\320\262\320\265\320\275\320\275\320\276\320\274 \321\207\320\270\321\201\320\273\320\265.\n        ";
static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph_pluralize_ru(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_word = 0;
  PyObject *__pyx_v_gram_form = 0;
  PyObject *__pyx_v_gram_class = 0;
  struct __pyx_obj_8pymorphy_6_morph_GramForm *__pyx_v_form;
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__gram_form,&__pyx_n_s__gram_class,0};
  __Pyx_RefNannySetupContext("pluralize_ru");
  if (unlikely(__pyx_kwds)) {
    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
    PyObject* values[3] = {0,0,0};
    values[1] = ((PyObject *)__pyx_kp_u_1);
    values[2] = ((PyObject *)Py_None);
    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);
      case  0: break;
      default: goto __pyx_L5_argtuple_error;
    }
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  0:
      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word);
      if (likely(values[0])) kw_args--;
      else goto __pyx_L5_argtuple_error;
      case  1:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__gram_form);
        if (value) { values[1] = value; kw_args--; }
      }
      case  2:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__gram_class);
        if (value) { values[2] = value; kw_args--; }
      }
    }
    if (unlikely(kw_args > 0)) {
      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "pluralize_ru") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    }
    __pyx_v_word = values[0];
    __pyx_v_gram_form = values[1];
    __pyx_v_gram_class = values[2];
  } else {
    __pyx_v_gram_form = ((PyObject *)__pyx_kp_u_1);
    __pyx_v_gram_class = ((PyObject *)Py_None);
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  3: __pyx_v_gram_class = PyTuple_GET_ITEM(__pyx_args, 2);
      case  2: __pyx_v_gram_form = PyTuple_GET_ITEM(__pyx_args, 1);
      case  1: __pyx_v_word = PyTuple_GET_ITEM(__pyx_args, 0);
      break;
      default: goto __pyx_L5_argtuple_error;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pluralize_ru", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("pymorphy._morph.Morph.pluralize_ru");
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_v_form = ((struct __pyx_obj_8pymorphy_6_morph_GramForm *)Py_None); __Pyx_INCREF(Py_None);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":264
 *             .
 *         """
 *         form = GramForm(gram_form).update(u'')             # <<<<<<<<<<<<<<
 *         return self.inflect_ru(word, form.get_form_string(), gram_class)
 * 
 */
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_gram_form);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_gram_form);
  __Pyx_GIVEREF(__pyx_v_gram_form);
  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_8pymorphy_6_morph_GramForm)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_8pymorphy_6_morph_GramForm *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_t_2)->__pyx_vtab)->update(((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_t_2), __pyx_n_u_9, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(((PyObject *)__pyx_v_form));
  __pyx_v_form = ((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_t_1);
  __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":265
 *         """
 *         form = GramForm(gram_form).update(u'')
 *         return self.inflect_ru(word, form.get_form_string(), gram_class)             # <<<<<<<<<<<<<<
 * 
 *     def pluralize_inflected_ru(self, word, num, gram_class=None):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__inflect_ru); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_8pymorphy_6_morph_GramForm *)__pyx_v_form->__pyx_vtab)->get_form_string(__pyx_v_form, 0)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_v_word);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_word);
  __Pyx_GIVEREF(__pyx_v_word);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_gram_class);
  PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_gram_class);
  __Pyx_GIVEREF(__pyx_v_gram_class);
  __pyx_t_2 = 0;
  __pyx_t_2 = PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __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_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  __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_AddTraceback("pymorphy._morph.Morph.pluralize_ru");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF((PyObject *)__pyx_v_form);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":267
 *         return self.inflect_ru(word, form.get_form_string(), gram_class)
 * 
 *     def pluralize_inflected_ru(self, word, num, gram_class=None):             # <<<<<<<<<<<<<<
 *         """
 *            ,      .
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph_pluralize_inflected_ru(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_5Morph_pluralize_inflected_ru[] = "\n        \320\222\320\265\321\200\320\275\321\203\321\202\321\214 \321\201\320\273\320\276\320\262\320\276 \320\262 \321\204\320\276\321\200\320\274\320\265, \320\272\320\276\321\202\320\276\321\200\320\260\321\217 \320\261\321\203\320\264\320\265\321\202 \321\201\320\276\321\207\320\265\321\202\320\260\321\202\321\214\321\201\321\217 \321\201 \320\277\320\265\321\200\320\265\320\264\320\260\320\275\320\275\321\213\320\274 \321\207\320\270\321\201\320\273\320\276\320\274.\n        \320\235\320\260\320\277\321\200\320\270\320\274\320\265\321\200: 1 \320\277\320\276\320\277\321\203\320\263\320\260\320\271, 2 \320\277\320\276\320\277\321\203\320\263\320\260\321\217, 5 \320\277\320\276\320\277\321\203\320\263\320\260\320\265\320\262.\n\n        \320\220\320\275\320\260\320\273\320\276\320\263 choose_plural \320\270\320\267 pytils, \320\264\320\273\321\217 \320\272\320\276\321\202\320\276\321\200\320\276\320\263\320\276 \321\202\321\200\320\265\320\261\321\203\320\265\321\202\321\201\321\217 \321\202\320\276\320\273\321\214\320\272\320\276 1\n        \320\275\320\260\321\207\320\260\320\273\321\214\320\275\320\260\321\217 \321\204\320\276\321\200\320\274\320\260 \321\201\320\273\320\276\320\262\320\260.\n        ";
static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph_pluralize_inflected_ru(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_word = 0;
  PyObject *__pyx_v_num = 0;
  PyObject *__pyx_v_gram_class = 0;
  PyObject *__pyx_v_form_info;
  long __pyx_v_index;
  PyObject *__pyx_v_forms;
  PyObject *__pyx_v_inflect_rules;
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_t_5;
  int __pyx_t_6;
  int __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__num,&__pyx_n_s__gram_class,0};
  __Pyx_RefNannySetupContext("pluralize_inflected_ru");
  if (unlikely(__pyx_kwds)) {
    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
    PyObject* values[3] = {0,0,0};
    values[2] = ((PyObject *)Py_None);
    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);
      case  0: break;
      default: goto __pyx_L5_argtuple_error;
    }
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  0:
      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word);
      if (likely(values[0])) kw_args--;
      else goto __pyx_L5_argtuple_error;
      case  1:
      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__num);
      if (likely(values[1])) kw_args--;
      else {
        __Pyx_RaiseArgtupleInvalid("pluralize_inflected_ru", 0, 2, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
      case  2:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__gram_class);
        if (value) { values[2] = value; kw_args--; }
      }
    }
    if (unlikely(kw_args > 0)) {
      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "pluralize_inflected_ru") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    }
    __pyx_v_word = values[0];
    __pyx_v_num = values[1];
    __pyx_v_gram_class = values[2];
  } else {
    __pyx_v_gram_class = ((PyObject *)Py_None);
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  3:
      __pyx_v_gram_class = PyTuple_GET_ITEM(__pyx_args, 2);
      case  2:
      __pyx_v_num = PyTuple_GET_ITEM(__pyx_args, 1);
      __pyx_v_word = PyTuple_GET_ITEM(__pyx_args, 0);
      break;
      default: goto __pyx_L5_argtuple_error;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("pluralize_inflected_ru", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("pymorphy._morph.Morph.pluralize_inflected_ru");
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __Pyx_INCREF(__pyx_v_gram_class);
  __pyx_v_form_info = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_forms = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_inflect_rules = Py_None; __Pyx_INCREF(Py_None);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":276
 *         """
 * 
 *         form_info = {             # <<<<<<<<<<<<<<
 *             u'':         [u',', u',', u','],
 *             u'':         [u',', u',', u','],
 */
  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_1));

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":277
 * 
 *         form_info = {
 *             u'':         [u',', u',', u','],             # <<<<<<<<<<<<<<
 *             u'':         [u',', u',', u','],
 *             u'': [u',', u',', u','],
 */
  __pyx_t_2 = PyList_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
  __Pyx_INCREF(((PyObject *)__pyx_kp_u_23));
  PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_u_23));
  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_23));
  __Pyx_INCREF(((PyObject *)__pyx_kp_u_24));
  PyList_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_kp_u_24));
  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_24));
  __Pyx_INCREF(((PyObject *)__pyx_kp_u_25));
  PyList_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_kp_u_25));
  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_25));
  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_u_22), ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":278
 *         form_info = {
 *             u'':         [u',', u',', u','],
 *             u'':         [u',', u',', u','],             # <<<<<<<<<<<<<<
 *             u'': [u',', u',', u','],
 *             u'-':    [u',', u',', u','],
 */
  __pyx_t_2 = PyList_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
  __Pyx_INCREF(((PyObject *)__pyx_kp_u_23));
  PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_u_23));
  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_23));
  __Pyx_INCREF(((PyObject *)__pyx_kp_u_25));
  PyList_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_kp_u_25));
  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_25));
  __Pyx_INCREF(((PyObject *)__pyx_kp_u_25));
  PyList_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_kp_u_25));
  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_25));
  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_u_26), ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":279
 *             u'':         [u',', u',', u','],
 *             u'':         [u',', u',', u','],
 *             u'': [u',', u',', u','],             # <<<<<<<<<<<<<<
 *             u'-':    [u',', u',', u','],
 *         }
 */
  __pyx_t_2 = PyList_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
  __Pyx_INCREF(((PyObject *)__pyx_kp_u_23));
  PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_u_23));
  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_23));
  __Pyx_INCREF(((PyObject *)__pyx_kp_u_25));
  PyList_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_kp_u_25));
  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_25));
  __Pyx_INCREF(((PyObject *)__pyx_kp_u_25));
  PyList_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_kp_u_25));
  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_25));
  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_u_2), ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":280
 *             u'':         [u',', u',', u','],
 *             u'': [u',', u',', u','],
 *             u'-':    [u',', u',', u','],             # <<<<<<<<<<<<<<
 *         }
 * 
 */
  __pyx_t_2 = PyList_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
  __Pyx_INCREF(((PyObject *)__pyx_kp_u_23));
  PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_u_23));
  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_23));
  __Pyx_INCREF(((PyObject *)__pyx_kp_u_25));
  PyList_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_kp_u_25));
  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_25));
  __Pyx_INCREF(((PyObject *)__pyx_kp_u_25));
  PyList_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_kp_u_25));
  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_25));
  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_27), ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
  __Pyx_DECREF(((PyObject *)__pyx_v_form_info));
  __pyx_v_form_info = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":283
 *         }
 * 
 *         if (num % 10 == 1) and (num % 100 != 11):             # <<<<<<<<<<<<<<
 *             index = 0
 *         else:
 */
  __pyx_t_1 = PyNumber_Remainder(__pyx_v_num, __pyx_int_10); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_int_1, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __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_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (__pyx_t_3) {
    __pyx_t_2 = PyNumber_Remainder(__pyx_v_num, __pyx_int_100); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_int_11, Py_NE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_5 = __pyx_t_4;
  } else {
    __pyx_t_5 = __pyx_t_3;
  }
  if (__pyx_t_5) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":284
 * 
 *         if (num % 10 == 1) and (num % 100 != 11):
 *             index = 0             # <<<<<<<<<<<<<<
 *         else:
 *             if (num % 10 >= 2) and (num % 10 <= 4) and (num % 100 < 10 or num % 100 >= 20):
 */
    __pyx_v_index = 0;
    goto __pyx_L6;
  }
  /*else*/ {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":286
 *             index = 0
 *         else:
 *             if (num % 10 >= 2) and (num % 10 <= 4) and (num % 100 < 10 or num % 100 >= 20):             # <<<<<<<<<<<<<<
 *                 index = 1
 *             else:
 */
    __pyx_t_1 = PyNumber_Remainder(__pyx_v_num, __pyx_int_10); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_int_2, Py_GE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (__pyx_t_5) {
      __pyx_t_2 = PyNumber_Remainder(__pyx_v_num, __pyx_int_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_int_4, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      if (__pyx_t_3) {
        __pyx_t_1 = PyNumber_Remainder(__pyx_v_num, __pyx_int_100); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_int_10, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        if (!__pyx_t_4) {
          __pyx_t_2 = PyNumber_Remainder(__pyx_v_num, __pyx_int_100); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_2);
          __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_int_20, Py_GE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
          __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_7 = __pyx_t_6;
        } else {
          __pyx_t_7 = __pyx_t_4;
        }
        __pyx_t_4 = __pyx_t_7;
      } else {
        __pyx_t_4 = __pyx_t_3;
      }
      __pyx_t_3 = __pyx_t_4;
    } else {
      __pyx_t_3 = __pyx_t_5;
    }
    if (__pyx_t_3) {

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":287
 *         else:
 *             if (num % 10 >= 2) and (num % 10 <= 4) and (num % 100 < 10 or num % 100 >= 20):
 *                 index = 1             # <<<<<<<<<<<<<<
 *             else:
 *                 index = 2
 */
      __pyx_v_index = 1;
      goto __pyx_L7;
    }
    /*else*/ {

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":289
 *                 index = 1
 *             else:
 *                 index = 2             # <<<<<<<<<<<<<<
 * 
 *         if gram_class is None:
 */
      __pyx_v_index = 2;
    }
    __pyx_L7:;
  }
  __pyx_L6:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":291
 *                 index = 2
 * 
 *         if gram_class is None:             # <<<<<<<<<<<<<<
 *             forms = self.get_graminfo(word)
 *             if not forms:
 */
  __pyx_t_3 = (__pyx_v_gram_class == Py_None);
  if (__pyx_t_3) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":292
 * 
 *         if gram_class is None:
 *             forms = self.get_graminfo(word)             # <<<<<<<<<<<<<<
 *             if not forms:
 *                 return word
 */
    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_graminfo); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_v_word);
    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_word);
    __Pyx_GIVEREF(__pyx_v_word);
    __pyx_t_8 = PyObject_Call(__pyx_t_1, __pyx_t_2, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_v_forms);
    __pyx_v_forms = __pyx_t_8;
    __pyx_t_8 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":293
 *         if gram_class is None:
 *             forms = self.get_graminfo(word)
 *             if not forms:             # <<<<<<<<<<<<<<
 *                 return word
 *             gram_class = forms[0]['class']
 */
    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_forms); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_5 = (!__pyx_t_3);
    if (__pyx_t_5) {

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":294
 *             forms = self.get_graminfo(word)
 *             if not forms:
 *                 return word             # <<<<<<<<<<<<<<
 *             gram_class = forms[0]['class']
 * 
 */
      __Pyx_XDECREF(__pyx_r);
      __Pyx_INCREF(__pyx_v_word);
      __pyx_r = __pyx_v_word;
      goto __pyx_L0;
      goto __pyx_L9;
    }
    __pyx_L9:;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":295
 *             if not forms:
 *                 return word
 *             gram_class = forms[0]['class']             # <<<<<<<<<<<<<<
 * 
 *         inflect_rules = form_info.get(gram_class, form_info[u''])
 */
    __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_forms, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_2 = PyObject_GetItem(__pyx_t_8, ((PyObject *)__pyx_n_s__class)); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_DECREF(__pyx_v_gram_class);
    __pyx_v_gram_class = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L8;
  }
  __pyx_L8:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":297
 *             gram_class = forms[0]['class']
 * 
 *         inflect_rules = form_info.get(gram_class, form_info[u''])             # <<<<<<<<<<<<<<
 *         return self.inflect_ru(word, inflect_rules[index], gram_class)
 * 
 */
  if (unlikely(__pyx_v_form_info == Py_None)) {
    PyErr_SetString(PyExc_AttributeError, "'NoneType' object has no attribute 'get'"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
  }
  __pyx_t_2 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_form_info), ((PyObject *)__pyx_n_u_22)); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_8 = __Pyx_PyDict_GetItemDefault(((PyObject *)__pyx_v_form_info), __pyx_v_gram_class, __pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_v_inflect_rules);
  __pyx_v_inflect_rules = __pyx_t_8;
  __pyx_t_8 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":298
 * 
 *         inflect_rules = form_info.get(gram_class, form_info[u''])
 *         return self.inflect_ru(word, inflect_rules[index], gram_class)             # <<<<<<<<<<<<<<
 * 
 *     def normalize(self, word):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_8 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__inflect_ru); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_inflect_rules, __pyx_v_index, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_word);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_word);
  __Pyx_GIVEREF(__pyx_v_word);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_gram_class);
  PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_gram_class);
  __Pyx_GIVEREF(__pyx_v_gram_class);
  __pyx_t_2 = 0;
  __pyx_t_2 = PyObject_Call(__pyx_t_8, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  __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_8);
  __Pyx_AddTraceback("pymorphy._morph.Morph.pluralize_inflected_ru");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_form_info);
  __Pyx_DECREF(__pyx_v_forms);
  __Pyx_DECREF(__pyx_v_inflect_rules);
  __Pyx_DECREF(__pyx_v_gram_class);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":300
 *         return self.inflect_ru(word, inflect_rules[index], gram_class)
 * 
 *     def normalize(self, word):             # <<<<<<<<<<<<<<
 *         """      """
 *         forms = self.get_graminfo(word)
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph_normalize(PyObject *__pyx_v_self, PyObject *__pyx_v_word); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_5Morph_normalize[] = " \320\222\320\265\321\200\320\275\321\203\321\202\321\214 \321\201\320\277\320\270\321\201\320\276\320\272 \320\275\320\276\321\200\320\274\320\260\320\273\321\214\320\275\321\213\321\205 \321\204\320\276\321\200\320\274 \321\201\320\273\320\276\320\262\320\260 ";
static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph_normalize(PyObject *__pyx_v_self, PyObject *__pyx_v_word) {
  PyObject *__pyx_v_forms;
  PyObject *__pyx_8genexpr0__pyx_v_form;
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_t_4;
  int __pyx_t_5;
  Py_ssize_t __pyx_t_6;
  __Pyx_RefNannySetupContext("normalize");
  __pyx_v_forms = Py_None; __Pyx_INCREF(Py_None);
  __pyx_8genexpr0__pyx_v_form = Py_None; __Pyx_INCREF(Py_None);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":302
 *     def normalize(self, word):
 *         """      """
 *         forms = self.get_graminfo(word)             # <<<<<<<<<<<<<<
 *         if not forms:
 *             return word
 */
  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_graminfo); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_word);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_word);
  __Pyx_GIVEREF(__pyx_v_word);
  __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __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_v_forms);
  __pyx_v_forms = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":303
 *         """      """
 *         forms = self.get_graminfo(word)
 *         if not forms:             # <<<<<<<<<<<<<<
 *             return word
 *         return set(form['norm'] for form in forms)
 */
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_forms); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_5 = (!__pyx_t_4);
  if (__pyx_t_5) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":304
 *         forms = self.get_graminfo(word)
 *         if not forms:
 *             return word             # <<<<<<<<<<<<<<
 *         return set(form['norm'] for form in forms)
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_v_word);
    __pyx_r = __pyx_v_word;
    goto __pyx_L0;
    goto __pyx_L5;
  }
  __pyx_L5:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":305
 *         if not forms:
 *             return word
 *         return set(form['norm'] for form in forms)             # <<<<<<<<<<<<<<
 * 
 * #----------- internal methods -------------
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = PySet_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
  if (PyList_CheckExact(__pyx_v_forms) || PyTuple_CheckExact(__pyx_v_forms)) {
    __pyx_t_6 = 0; __pyx_t_2 = __pyx_v_forms; __Pyx_INCREF(__pyx_t_2);
  } else {
    __pyx_t_6 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_forms); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
  }
  for (;;) {
    if (likely(PyList_CheckExact(__pyx_t_2))) {
      if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_2)) break;
      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_1); __pyx_t_6++;
    } else if (likely(PyTuple_CheckExact(__pyx_t_2))) {
      if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_1); __pyx_t_6++;
    } else {
      __pyx_t_1 = PyIter_Next(__pyx_t_2);
      if (!__pyx_t_1) {
        if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        break;
      }
      __Pyx_GOTREF(__pyx_t_1);
    }
    __Pyx_DECREF(__pyx_8genexpr0__pyx_v_form);
    __pyx_8genexpr0__pyx_v_form = __pyx_t_1;
    __pyx_t_1 = 0;
    __pyx_t_1 = PyObject_GetItem(__pyx_8genexpr0__pyx_v_form, ((PyObject *)__pyx_n_s__norm)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    if (unlikely(PySet_Add(__pyx_t_3, (PyObject*)__pyx_t_1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_INCREF(((PyObject *)__pyx_t_3));
  __pyx_r = ((PyObject *)__pyx_t_3);
  __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
  goto __pyx_L0;

  __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_AddTraceback("pymorphy._morph.Morph.normalize");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_forms);
  __Pyx_DECREF(__pyx_8genexpr0__pyx_v_form);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":309
 * #----------- internal methods -------------
 * 
 *     def _drop_cache(self):             # <<<<<<<<<<<<<<
 *         """  ,     """
 *         self.data.lemmas.cache = {}
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__drop_cache(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_5Morph__drop_cache[] = " \320\236\321\201\320\262\320\276\320\261\320\276\320\264\320\270\321\202\321\214 \320\277\320\260\320\274\321\217\321\202\321\214, \320\262\321\213\320\264\320\265\320\273\320\265\320\275\320\275\321\203\321\216 \320\277\320\276\320\264 \320\262\320\275\321\203\321\202\321\200\320\265\320\275\320\275\320\270\320\271 \320\272\321\215\321\210 ";
static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__drop_cache(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  __Pyx_RefNannySetupContext("_drop_cache");

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":311
 *     def _drop_cache(self):
 *         """  ,     """
 *         self.data.lemmas.cache = {}             # <<<<<<<<<<<<<<
 *         self.data.rules.cache = {}
 *         self.data.endings.cache = {}
 */
  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
  __pyx_t_2 = PyObject_GetAttr(((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->data, __pyx_n_s__lemmas); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyObject_SetAttr(__pyx_t_2, __pyx_n_s__cache, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":312
 *         """  ,     """
 *         self.data.lemmas.cache = {}
 *         self.data.rules.cache = {}             # <<<<<<<<<<<<<<
 *         self.data.endings.cache = {}
 * 
 */
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
  __pyx_t_1 = PyObject_GetAttr(((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->data, __pyx_n_s__rules); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyObject_SetAttr(__pyx_t_1, __pyx_n_s__cache, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 312; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":313
 *         self.data.lemmas.cache = {}
 *         self.data.rules.cache = {}
 *         self.data.endings.cache = {}             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
  __pyx_t_2 = PyObject_GetAttr(((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->data, __pyx_n_s__endings); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyObject_SetAttr(__pyx_t_2, __pyx_n_s__cache, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  __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_AddTraceback("pymorphy._morph.Morph._drop_cache");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":316
 * 
 * 
 *     def _decline(self, src_word):             # <<<<<<<<<<<<<<
 *         """ :   .      """
 * 
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__decline(PyObject *__pyx_v_self, PyObject *__pyx_v_src_word); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_5Morph__decline[] = " \320\237\321\200\320\276\321\201\320\272\320\273\320\276\320\275\321\217\321\202\321\214: \320\262\320\265\321\200\320\275\321\203\321\202\321\214 \320\262\321\201\320\265 \320\263\321\200\320\260\320\274. \321\204\320\276\321\200\320\274\321\213 \321\201 \320\270\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\320\265\320\271 \320\277\321\200\320\276 \320\275\320\270\321\205 ";
static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__decline(PyObject *__pyx_v_self, PyObject *__pyx_v_src_word) {
  PyObject *__pyx_v_word_graminfo;
  PyObject *__pyx_v_forms;
  PyObject *__pyx_v_variants;
  PyObject *__pyx_v_paradigm_id;
  PyObject *__pyx_v_base_form;
  PyObject *__pyx_v_lemma;
  PyObject *__pyx_v_pre_prefix;
  PyObject *__pyx_v_paradigm;
  PyObject *__pyx_v_suffix;
  PyObject *__pyx_v_ancode;
  PyObject *__pyx_v_prefix;
  PyObject *__pyx_v_cls;
  PyObject *__pyx_v_info;
  PyObject *__pyx_v__letter;
  PyObject *__pyx_v_word;
  PyObject *__pyx_v_form;
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  int __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  void *__pyx_t_7;
  void *__pyx_t_8;
  Py_ssize_t __pyx_t_9;
  PyObject *__pyx_t_10 = NULL;
  PyObject *__pyx_t_11 = NULL;
  PyObject *__pyx_t_12 = NULL;
  int __pyx_t_13;
  __Pyx_RefNannySetupContext("_decline");
  __pyx_v_word_graminfo = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_forms = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_variants = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_paradigm_id = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_base_form = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_lemma = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_pre_prefix = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_paradigm = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_suffix = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_ancode = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_prefix = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_cls = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_info = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v__letter = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_word = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_form = Py_None; __Pyx_INCREF(Py_None);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":319
 *         """ :   .      """
 * 
 *         word_graminfo = self.get_graminfo(src_word)             # <<<<<<<<<<<<<<
 *         forms = []
 * 
 */
  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s__get_graminfo); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_src_word);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_src_word);
  __Pyx_GIVEREF(__pyx_v_src_word);
  __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __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_v_word_graminfo);
  __pyx_v_word_graminfo = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":320
 * 
 *         word_graminfo = self.get_graminfo(src_word)
 *         forms = []             # <<<<<<<<<<<<<<
 * 
 *         #     ,
 */
  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
  __Pyx_DECREF(((PyObject *)__pyx_v_forms));
  __pyx_v_forms = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":324
 *         #     ,
 *         #
 *         variants = dict([(form['paradigm_id'], form) for form in word_graminfo if 'paradigm_id' in form])             # <<<<<<<<<<<<<<
 * 
 *         #        ,
 */
  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
  if (PyList_CheckExact(__pyx_v_word_graminfo) || PyTuple_CheckExact(__pyx_v_word_graminfo)) {
    __pyx_t_4 = 0; __pyx_t_2 = __pyx_v_word_graminfo; __Pyx_INCREF(__pyx_t_2);
  } else {
    __pyx_t_4 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_word_graminfo); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
  }
  for (;;) {
    if (likely(PyList_CheckExact(__pyx_t_2))) {
      if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_2)) break;
      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++;
    } else if (likely(PyTuple_CheckExact(__pyx_t_2))) {
      if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++;
    } else {
      __pyx_t_1 = PyIter_Next(__pyx_t_2);
      if (!__pyx_t_1) {
        if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        break;
      }
      __Pyx_GOTREF(__pyx_t_1);
    }
    __Pyx_DECREF(__pyx_v_form);
    __pyx_v_form = __pyx_t_1;
    __pyx_t_1 = 0;
    __pyx_t_5 = ((PySequence_Contains(__pyx_v_form, ((PyObject *)__pyx_n_s__paradigm_id)))); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (__pyx_t_5) {
      __pyx_t_1 = PyObject_GetItem(__pyx_v_form, ((PyObject *)__pyx_n_s__paradigm_id)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1);
      __Pyx_GIVEREF(__pyx_t_1);
      __Pyx_INCREF(__pyx_v_form);
      PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_v_form);
      __Pyx_GIVEREF(__pyx_v_form);
      __pyx_t_1 = 0;
      if (unlikely(PyList_Append(__pyx_t_3, (PyObject*)__pyx_t_6))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      goto __pyx_L7;
    }
    __pyx_L7:;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(((PyObject *)__pyx_t_3));
  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_t_3));
  __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
  __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)&PyDict_Type)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(((PyObject *)__pyx_v_variants));
  __pyx_v_variants = ((PyObject *)__pyx_t_3);
  __pyx_t_3 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":328
 *         #        ,
 *         #
 *         for paradigm_id, base_form in variants.iteritems():             # <<<<<<<<<<<<<<
 * 
 *             lemma = base_form['lemma']
 */
  __Pyx_INCREF(((PyObject *)__pyx_v_variants));
  __Pyx_XDECREF(__pyx_t_3);
  __pyx_t_3 = ((PyObject *)__pyx_v_variants);
  __pyx_t_4 = 0;
  while (1) {
    if (!PyDict_Next(__pyx_t_3, (&__pyx_t_4), ((PyObject **)(&__pyx_t_7)), ((PyObject **)(&__pyx_t_8)))) break;
    __Pyx_INCREF(((PyObject *)__pyx_t_7));
    __Pyx_DECREF(__pyx_v_paradigm_id);
    __pyx_v_paradigm_id = ((PyObject *)__pyx_t_7);
    __Pyx_INCREF(((PyObject *)__pyx_t_8));
    __Pyx_DECREF(__pyx_v_base_form);
    __pyx_v_base_form = ((PyObject *)__pyx_t_8);

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":330
 *         for paradigm_id, base_form in variants.iteritems():
 * 
 *             lemma = base_form['lemma']             # <<<<<<<<<<<<<<
 *             pre_prefix = u''.join(base_form.get('prefixes', []))
 *             paradigm = self.data.rules[paradigm_id]
 */
    __pyx_t_2 = PyObject_GetItem(__pyx_v_base_form, ((PyObject *)__pyx_n_s__lemma)); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_v_lemma);
    __pyx_v_lemma = __pyx_t_2;
    __pyx_t_2 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":331
 * 
 *             lemma = base_form['lemma']
 *             pre_prefix = u''.join(base_form.get('prefixes', []))             # <<<<<<<<<<<<<<
 *             paradigm = self.data.rules[paradigm_id]
 * 
 */
    __pyx_t_2 = PyObject_GetAttr(__pyx_v_base_form, __pyx_n_s__get); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_6 = PyList_New(0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
    __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(((PyObject *)__pyx_n_s__prefixes));
    PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__prefixes));
    __Pyx_GIVEREF(((PyObject *)__pyx_n_s__prefixes));
    PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_6));
    __Pyx_GIVEREF(((PyObject *)__pyx_t_6));
    __pyx_t_6 = 0;
    __pyx_t_6 = PyObject_Call(__pyx_t_2, __pyx_t_1, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = ((PyObject *)PyUnicode_Join(__pyx_kp_u_1, __pyx_t_6)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_v_pre_prefix);
    __pyx_v_pre_prefix = ((PyObject *)__pyx_t_1);
    __pyx_t_1 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":332
 *             lemma = base_form['lemma']
 *             pre_prefix = u''.join(base_form.get('prefixes', []))
 *             paradigm = self.data.rules[paradigm_id]             # <<<<<<<<<<<<<<
 * 
 *             for suffix, ancode, prefix in paradigm:
 */
    __pyx_t_1 = PyObject_GetAttr(((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->data, __pyx_n_s__rules); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_6 = PyObject_GetItem(__pyx_t_1, __pyx_v_paradigm_id); if (!__pyx_t_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_v_paradigm);
    __pyx_v_paradigm = __pyx_t_6;
    __pyx_t_6 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":334
 *             paradigm = self.data.rules[paradigm_id]
 * 
 *             for suffix, ancode, prefix in paradigm:             # <<<<<<<<<<<<<<
 *                 cls, info, _letter  = self.data.gramtab[ancode]
 *                 word = pre_prefix + prefix + lemma + suffix
 */
    if (PyList_CheckExact(__pyx_v_paradigm) || PyTuple_CheckExact(__pyx_v_paradigm)) {
      __pyx_t_9 = 0; __pyx_t_6 = __pyx_v_paradigm; __Pyx_INCREF(__pyx_t_6);
    } else {
      __pyx_t_9 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_v_paradigm); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
    }
    for (;;) {
      if (likely(PyList_CheckExact(__pyx_t_6))) {
        if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_6)) break;
        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_9); __Pyx_INCREF(__pyx_t_1); __pyx_t_9++;
      } else if (likely(PyTuple_CheckExact(__pyx_t_6))) {
        if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_9); __Pyx_INCREF(__pyx_t_1); __pyx_t_9++;
      } else {
        __pyx_t_1 = PyIter_Next(__pyx_t_6);
        if (!__pyx_t_1) {
          if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          break;
        }
        __Pyx_GOTREF(__pyx_t_1);
      }
      if (PyTuple_CheckExact(__pyx_t_1) && likely(PyTuple_GET_SIZE(__pyx_t_1) == 3)) {
        PyObject* tuple = __pyx_t_1;
        __pyx_t_2 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_t_2);
        __pyx_t_10 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_t_10);
        __pyx_t_11 = PyTuple_GET_ITEM(tuple, 2); __Pyx_INCREF(__pyx_t_11);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __Pyx_DECREF(__pyx_v_suffix);
        __pyx_v_suffix = __pyx_t_2;
        __pyx_t_2 = 0;
        __Pyx_DECREF(__pyx_v_ancode);
        __pyx_v_ancode = __pyx_t_10;
        __pyx_t_10 = 0;
        __Pyx_DECREF(__pyx_v_prefix);
        __pyx_v_prefix = __pyx_t_11;
        __pyx_t_11 = 0;
      } else {
        __pyx_t_12 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_12);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_t_2 = __Pyx_UnpackItem(__pyx_t_12, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_2);
        __pyx_t_10 = __Pyx_UnpackItem(__pyx_t_12, 1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_11 = __Pyx_UnpackItem(__pyx_t_12, 2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_11);
        if (__Pyx_EndUnpack(__pyx_t_12, 3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        __Pyx_DECREF(__pyx_v_suffix);
        __pyx_v_suffix = __pyx_t_2;
        __pyx_t_2 = 0;
        __Pyx_DECREF(__pyx_v_ancode);
        __pyx_v_ancode = __pyx_t_10;
        __pyx_t_10 = 0;
        __Pyx_DECREF(__pyx_v_prefix);
        __pyx_v_prefix = __pyx_t_11;
        __pyx_t_11 = 0;
      }

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":335
 * 
 *             for suffix, ancode, prefix in paradigm:
 *                 cls, info, _letter  = self.data.gramtab[ancode]             # <<<<<<<<<<<<<<
 *                 word = pre_prefix + prefix + lemma + suffix
 *                 forms.append({
 */
      __pyx_t_1 = PyObject_GetAttr(((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->data, __pyx_n_s__gramtab); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_11 = PyObject_GetItem(__pyx_t_1, __pyx_v_ancode); if (!__pyx_t_11) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_11);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      if (PyTuple_CheckExact(__pyx_t_11) && likely(PyTuple_GET_SIZE(__pyx_t_11) == 3)) {
        PyObject* tuple = __pyx_t_11;
        __pyx_t_1 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_t_1);
        __pyx_t_10 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_t_10);
        __pyx_t_2 = PyTuple_GET_ITEM(tuple, 2); __Pyx_INCREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        __Pyx_DECREF(__pyx_v_cls);
        __pyx_v_cls = __pyx_t_1;
        __pyx_t_1 = 0;
        __Pyx_DECREF(__pyx_v_info);
        __pyx_v_info = __pyx_t_10;
        __pyx_t_10 = 0;
        __Pyx_DECREF(__pyx_v__letter);
        __pyx_v__letter = __pyx_t_2;
        __pyx_t_2 = 0;
      } else {
        __pyx_t_12 = PyObject_GetIter(__pyx_t_11); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_12);
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        __pyx_t_1 = __Pyx_UnpackItem(__pyx_t_12, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_10 = __Pyx_UnpackItem(__pyx_t_12, 1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_2 = __Pyx_UnpackItem(__pyx_t_12, 2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_2);
        if (__Pyx_EndUnpack(__pyx_t_12, 3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        __Pyx_DECREF(__pyx_v_cls);
        __pyx_v_cls = __pyx_t_1;
        __pyx_t_1 = 0;
        __Pyx_DECREF(__pyx_v_info);
        __pyx_v_info = __pyx_t_10;
        __pyx_t_10 = 0;
        __Pyx_DECREF(__pyx_v__letter);
        __pyx_v__letter = __pyx_t_2;
        __pyx_t_2 = 0;
      }

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":336
 *             for suffix, ancode, prefix in paradigm:
 *                 cls, info, _letter  = self.data.gramtab[ancode]
 *                 word = pre_prefix + prefix + lemma + suffix             # <<<<<<<<<<<<<<
 *                 forms.append({
 *                     'word': word,
 */
      __pyx_t_11 = PyNumber_Add(__pyx_v_pre_prefix, __pyx_v_prefix); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 336; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_11);
      __pyx_t_2 = PyNumber_Add(__pyx_t_11, __pyx_v_lemma); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 336; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      __pyx_t_11 = PyNumber_Add(__pyx_t_2, __pyx_v_suffix); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 336; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_11);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_v_word);
      __pyx_v_word = __pyx_t_11;
      __pyx_t_11 = 0;

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":337
 *                 cls, info, _letter  = self.data.gramtab[ancode]
 *                 word = pre_prefix + prefix + lemma + suffix
 *                 forms.append({             # <<<<<<<<<<<<<<
 *                     'word': word,
 *                     'class': cls,
 */
      if (unlikely(__pyx_v_forms == Py_None)) {
        PyErr_SetString(PyExc_AttributeError, "'NoneType' object has no attribute 'append'"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
      }
      __pyx_t_11 = PyDict_New(); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(((PyObject *)__pyx_t_11));

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":338
 *                 word = pre_prefix + prefix + lemma + suffix
 *                 forms.append({
 *                     'word': word,             # <<<<<<<<<<<<<<
 *                     'class': cls,
 *                     'info': info,
 */
      if (PyDict_SetItem(__pyx_t_11, ((PyObject *)__pyx_n_s__word), __pyx_v_word) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":339
 *                 forms.append({
 *                     'word': word,
 *                     'class': cls,             # <<<<<<<<<<<<<<
 *                     'info': info,
 *                     'lemma': lemma,
 */
      if (PyDict_SetItem(__pyx_t_11, ((PyObject *)__pyx_n_s__class), __pyx_v_cls) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":340
 *                     'word': word,
 *                     'class': cls,
 *                     'info': info,             # <<<<<<<<<<<<<<
 *                     'lemma': lemma,
 *                 })
 */
      if (PyDict_SetItem(__pyx_t_11, ((PyObject *)__pyx_n_s__info), __pyx_v_info) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":341
 *                     'class': cls,
 *                     'info': info,
 *                     'lemma': lemma,             # <<<<<<<<<<<<<<
 *                 })
 *         return forms
 */
      if (PyDict_SetItem(__pyx_t_11, ((PyObject *)__pyx_n_s__lemma), __pyx_v_lemma) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_13 = PyList_Append(((PyObject *)__pyx_v_forms), ((PyObject *)__pyx_t_11)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
    }
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  }
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":343
 *                     'lemma': lemma,
 *                 })
 *         return forms             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_forms));
  __pyx_r = ((PyObject *)__pyx_v_forms);
  goto __pyx_L0;

  __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_6);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_AddTraceback("pymorphy._morph.Morph._decline");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_word_graminfo);
  __Pyx_DECREF(__pyx_v_forms);
  __Pyx_DECREF(__pyx_v_variants);
  __Pyx_DECREF(__pyx_v_paradigm_id);
  __Pyx_DECREF(__pyx_v_base_form);
  __Pyx_DECREF(__pyx_v_lemma);
  __Pyx_DECREF(__pyx_v_pre_prefix);
  __Pyx_DECREF(__pyx_v_paradigm);
  __Pyx_DECREF(__pyx_v_suffix);
  __Pyx_DECREF(__pyx_v_ancode);
  __Pyx_DECREF(__pyx_v_prefix);
  __Pyx_DECREF(__pyx_v_cls);
  __Pyx_DECREF(__pyx_v_info);
  __Pyx_DECREF(__pyx_v__letter);
  __Pyx_DECREF(__pyx_v_word);
  __Pyx_DECREF(__pyx_v_form);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":346
 * 
 * 
 *     def _get_lemma_graminfo(self, lemma, suffix, require_prefix, method_format_str):             # <<<<<<<<<<<<<<
 *         """  .     .
 *             , ,     ,
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__get_lemma_graminfo(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static  PyObject *__pyx_f_8pymorphy_6_morph_5Morph__get_lemma_graminfo(struct __pyx_obj_8pymorphy_6_morph_Morph *__pyx_v_self, PyObject *__pyx_v_lemma, PyObject *__pyx_v_suffix, PyObject *__pyx_v_require_prefix, PyObject *__pyx_v_method_format_str, int __pyx_skip_dispatch) {
  PyObject *__pyx_v_paradigm;
  PyObject *__pyx_v_gram;
  PyObject *__pyx_v_rules;
  PyObject *__pyx_v_gramtab;
  PyObject *__pyx_v_lemma_paradigms;
  PyObject *__pyx_v_paradigm_id;
  PyObject *__pyx_v_norm_form;
  PyObject *__pyx_v_rule_suffix;
  PyObject *__pyx_v_rule_ancode;
  PyObject *__pyx_v_rule_prefix;
  PyObject *__pyx_v_gram_class;
  PyObject *__pyx_v_info;
  PyObject *__pyx_v__;
  PyObject *__pyx_v_data;
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_t_4;
  Py_ssize_t __pyx_t_5;
  Py_ssize_t __pyx_t_6;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *__pyx_t_10 = NULL;
  int __pyx_t_11;
  int __pyx_t_12;
  int __pyx_t_13;
  __Pyx_RefNannySetupContext("_get_lemma_graminfo");
  __pyx_v_paradigm = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_gram = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_rules = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_gramtab = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_lemma_paradigms = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_paradigm_id = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_norm_form = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_rule_suffix = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_rule_ancode = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_rule_prefix = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_gram_class = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_info = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v__ = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_data = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  /* Check if called by wrapper */
  if (unlikely(__pyx_skip_dispatch)) ;
  /* Check if overriden in Python */
  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s___get_lemma_graminfo); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_8pymorphy_6_morph_5Morph__get_lemma_graminfo)) {
      __Pyx_XDECREF(((PyObject *)__pyx_r));
      __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_INCREF(((PyObject *)__pyx_v_lemma));
      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_lemma));
      __Pyx_GIVEREF(((PyObject *)__pyx_v_lemma));
      __Pyx_INCREF(((PyObject *)__pyx_v_suffix));
      PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_suffix));
      __Pyx_GIVEREF(((PyObject *)__pyx_v_suffix));
      __Pyx_INCREF(((PyObject *)__pyx_v_require_prefix));
      PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_require_prefix));
      __Pyx_GIVEREF(((PyObject *)__pyx_v_require_prefix));
      __Pyx_INCREF(((PyObject *)__pyx_v_method_format_str));
      PyTuple_SET_ITEM(__pyx_t_2, 3, ((PyObject *)__pyx_v_method_format_str));
      __Pyx_GIVEREF(((PyObject *)__pyx_v_method_format_str));
      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      if (!(likely(PyList_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected list, got %.200s", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_r = ((PyObject *)__pyx_t_3);
      __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      goto __pyx_L0;
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":351
 *                 .
 *         """
 *         rules = self.data.rules             # <<<<<<<<<<<<<<
 *         gramtab = self.data.gramtab
 *         lemma_paradigms = self.data.lemmas[lemma or u'#']
 */
  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self->data, __pyx_n_s__rules); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_v_rules);
  __pyx_v_rules = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":352
 *         """
 *         rules = self.data.rules
 *         gramtab = self.data.gramtab             # <<<<<<<<<<<<<<
 *         lemma_paradigms = self.data.lemmas[lemma or u'#']
 *         gram = []
 */
  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self->data, __pyx_n_s__gramtab); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_v_gramtab);
  __pyx_v_gramtab = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":353
 *         rules = self.data.rules
 *         gramtab = self.data.gramtab
 *         lemma_paradigms = self.data.lemmas[lemma or u'#']             # <<<<<<<<<<<<<<
 *         gram = []
 *         #
 */
  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self->data, __pyx_n_s__lemmas); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_lemma)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (!__pyx_t_4) {
    __Pyx_INCREF(((PyObject *)__pyx_kp_u_28));
    __pyx_t_3 = __pyx_kp_u_28;
  } else {
    __Pyx_INCREF(((PyObject *)__pyx_v_lemma));
    __pyx_t_3 = __pyx_v_lemma;
  }
  __pyx_t_2 = PyObject_GetItem(__pyx_t_1, ((PyObject *)__pyx_t_3)); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_v_lemma_paradigms);
  __pyx_v_lemma_paradigms = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":354
 *         gramtab = self.data.gramtab
 *         lemma_paradigms = self.data.lemmas[lemma or u'#']
 *         gram = []             # <<<<<<<<<<<<<<
 *         #
 *         for paradigm_id in lemma_paradigms:
 */
  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
  __Pyx_DECREF(((PyObject *)__pyx_v_gram));
  __pyx_v_gram = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":356
 *         gram = []
 *         #
 *         for paradigm_id in lemma_paradigms:             # <<<<<<<<<<<<<<
 *             paradigm = rules[paradigm_id]
 * 
 */
  if (PyList_CheckExact(__pyx_v_lemma_paradigms) || PyTuple_CheckExact(__pyx_v_lemma_paradigms)) {
    __pyx_t_5 = 0; __pyx_t_2 = __pyx_v_lemma_paradigms; __Pyx_INCREF(__pyx_t_2);
  } else {
    __pyx_t_5 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_lemma_paradigms); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
  }
  for (;;) {
    if (likely(PyList_CheckExact(__pyx_t_2))) {
      if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_2)) break;
      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++;
    } else if (likely(PyTuple_CheckExact(__pyx_t_2))) {
      if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++;
    } else {
      __pyx_t_3 = PyIter_Next(__pyx_t_2);
      if (!__pyx_t_3) {
        if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        break;
      }
      __Pyx_GOTREF(__pyx_t_3);
    }
    __Pyx_DECREF(__pyx_v_paradigm_id);
    __pyx_v_paradigm_id = __pyx_t_3;
    __pyx_t_3 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":357
 *         #
 *         for paradigm_id in lemma_paradigms:
 *             paradigm = rules[paradigm_id]             # <<<<<<<<<<<<<<
 * 
 *             norm_form = lemma + paradigm[0][0]
 */
    __pyx_t_3 = PyObject_GetItem(__pyx_v_rules, __pyx_v_paradigm_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 357; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    if (!(likely(PyList_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected list, got %.200s", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 357; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(((PyObject *)__pyx_v_paradigm));
    __pyx_v_paradigm = ((PyObject *)__pyx_t_3);
    __pyx_t_3 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":359
 *             paradigm = rules[paradigm_id]
 * 
 *             norm_form = lemma + paradigm[0][0]             # <<<<<<<<<<<<<<
 * 
 *             #
 */
    __pyx_t_3 = __Pyx_GetItemInt_List(((PyObject *)__pyx_v_paradigm), 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_3, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_3 = PyNumber_Add(((PyObject *)__pyx_v_lemma), __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_v_norm_form);
    __pyx_v_norm_form = __pyx_t_3;
    __pyx_t_3 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":362
 * 
 *             #
 *             for rule_suffix, rule_ancode, rule_prefix in paradigm:             # <<<<<<<<<<<<<<
 *                 #    ,   ,  ,
 *                 #   ,
 */
    if (likely(((PyObject *)__pyx_v_paradigm) != Py_None)) {
      __pyx_t_6 = 0; __pyx_t_3 = ((PyObject *)__pyx_v_paradigm); __Pyx_INCREF(__pyx_t_3);
    } else {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    for (;;) {
      if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_3)) break;
      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_6); __Pyx_INCREF(__pyx_t_1); __pyx_t_6++;
      if (PyTuple_CheckExact(__pyx_t_1) && likely(PyTuple_GET_SIZE(__pyx_t_1) == 3)) {
        PyObject* tuple = __pyx_t_1;
        __pyx_t_7 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_t_7);
        __pyx_t_8 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_t_8);
        __pyx_t_9 = PyTuple_GET_ITEM(tuple, 2); __Pyx_INCREF(__pyx_t_9);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __Pyx_DECREF(__pyx_v_rule_suffix);
        __pyx_v_rule_suffix = __pyx_t_7;
        __pyx_t_7 = 0;
        __Pyx_DECREF(__pyx_v_rule_ancode);
        __pyx_v_rule_ancode = __pyx_t_8;
        __pyx_t_8 = 0;
        __Pyx_DECREF(__pyx_v_rule_prefix);
        __pyx_v_rule_prefix = __pyx_t_9;
        __pyx_t_9 = 0;
      } else {
        __pyx_t_10 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_10);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_t_7 = __Pyx_UnpackItem(__pyx_t_10, 0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_7);
        __pyx_t_8 = __Pyx_UnpackItem(__pyx_t_10, 1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_8);
        __pyx_t_9 = __Pyx_UnpackItem(__pyx_t_10, 2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_9);
        if (__Pyx_EndUnpack(__pyx_t_10, 3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        __Pyx_DECREF(__pyx_v_rule_suffix);
        __pyx_v_rule_suffix = __pyx_t_7;
        __pyx_t_7 = 0;
        __Pyx_DECREF(__pyx_v_rule_ancode);
        __pyx_v_rule_ancode = __pyx_t_8;
        __pyx_t_8 = 0;
        __Pyx_DECREF(__pyx_v_rule_prefix);
        __pyx_v_rule_prefix = __pyx_t_9;
        __pyx_t_9 = 0;
      }

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":365
 *                 #    ,   ,  ,
 *                 #   ,
 *                 if rule_suffix==suffix and rule_prefix==require_prefix:             # <<<<<<<<<<<<<<
 *                     gram_class, info, _ = gramtab[rule_ancode]
 *                     data = {
 */
      __pyx_t_1 = PyObject_RichCompare(__pyx_v_rule_suffix, ((PyObject *)__pyx_v_suffix), Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      if (__pyx_t_4) {
        __pyx_t_1 = PyObject_RichCompare(__pyx_v_rule_prefix, ((PyObject *)__pyx_v_require_prefix), Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 365; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_t_12 = __pyx_t_11;
      } else {
        __pyx_t_12 = __pyx_t_4;
      }
      if (__pyx_t_12) {

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":366
 *                 #   ,
 *                 if rule_suffix==suffix and rule_prefix==require_prefix:
 *                     gram_class, info, _ = gramtab[rule_ancode]             # <<<<<<<<<<<<<<
 *                     data = {
 *                         'norm': norm_form,
 */
        __pyx_t_1 = PyObject_GetItem(__pyx_v_gramtab, __pyx_v_rule_ancode); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_1);
        if (PyTuple_CheckExact(__pyx_t_1) && likely(PyTuple_GET_SIZE(__pyx_t_1) == 3)) {
          PyObject* tuple = __pyx_t_1;
          __pyx_t_9 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_t_9);
          __pyx_t_8 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_t_8);
          __pyx_t_7 = PyTuple_GET_ITEM(tuple, 2); __Pyx_INCREF(__pyx_t_7);
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __Pyx_DECREF(__pyx_v_gram_class);
          __pyx_v_gram_class = __pyx_t_9;
          __pyx_t_9 = 0;
          __Pyx_DECREF(__pyx_v_info);
          __pyx_v_info = __pyx_t_8;
          __pyx_t_8 = 0;
          __Pyx_DECREF(__pyx_v__);
          __pyx_v__ = __pyx_t_7;
          __pyx_t_7 = 0;
        } else {
          __pyx_t_10 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_10);
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_9 = __Pyx_UnpackItem(__pyx_t_10, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_9);
          __pyx_t_8 = __Pyx_UnpackItem(__pyx_t_10, 1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_8);
          __pyx_t_7 = __Pyx_UnpackItem(__pyx_t_10, 2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_7);
          if (__Pyx_EndUnpack(__pyx_t_10, 3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_DECREF(__pyx_v_gram_class);
          __pyx_v_gram_class = __pyx_t_9;
          __pyx_t_9 = 0;
          __Pyx_DECREF(__pyx_v_info);
          __pyx_v_info = __pyx_t_8;
          __pyx_t_8 = 0;
          __Pyx_DECREF(__pyx_v__);
          __pyx_v__ = __pyx_t_7;
          __pyx_t_7 = 0;
        }

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":367
 *                 if rule_suffix==suffix and rule_prefix==require_prefix:
 *                     gram_class, info, _ = gramtab[rule_ancode]
 *                     data = {             # <<<<<<<<<<<<<<
 *                         'norm': norm_form,
 *                         'class': gram_class,
 */
        __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(((PyObject *)__pyx_t_1));

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":368
 *                     gram_class, info, _ = gramtab[rule_ancode]
 *                     data = {
 *                         'norm': norm_form,             # <<<<<<<<<<<<<<
 *                         'class': gram_class,
 *                         'info': info,
 */
        if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__norm), __pyx_v_norm_form) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":369
 *                     data = {
 *                         'norm': norm_form,
 *                         'class': gram_class,             # <<<<<<<<<<<<<<
 *                         'info': info,
 *                         'paradigm_id': paradigm_id,
 */
        if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__class), __pyx_v_gram_class) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":370
 *                         'norm': norm_form,
 *                         'class': gram_class,
 *                         'info': info,             # <<<<<<<<<<<<<<
 *                         'paradigm_id': paradigm_id,
 *                         'ancode': rule_ancode,
 */
        if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__info), __pyx_v_info) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":371
 *                         'class': gram_class,
 *                         'info': info,
 *                         'paradigm_id': paradigm_id,             # <<<<<<<<<<<<<<
 *                         'ancode': rule_ancode,
 *                         'lemma': lemma,
 */
        if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__paradigm_id), __pyx_v_paradigm_id) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":372
 *                         'info': info,
 *                         'paradigm_id': paradigm_id,
 *                         'ancode': rule_ancode,             # <<<<<<<<<<<<<<
 *                         'lemma': lemma,
 *                         'method': method_format_str % (lemma, suffix)
 */
        if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__ancode), __pyx_v_rule_ancode) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":373
 *                         'paradigm_id': paradigm_id,
 *                         'ancode': rule_ancode,
 *                         'lemma': lemma,             # <<<<<<<<<<<<<<
 *                         'method': method_format_str % (lemma, suffix)
 *                     }
 */
        if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__lemma), ((PyObject *)__pyx_v_lemma)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":374
 *                         'ancode': rule_ancode,
 *                         'lemma': lemma,
 *                         'method': method_format_str % (lemma, suffix)             # <<<<<<<<<<<<<<
 *                     }
 *                     #
 */
        __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_INCREF(((PyObject *)__pyx_v_lemma));
        PyTuple_SET_ITEM(__pyx_t_7, 0, ((PyObject *)__pyx_v_lemma));
        __Pyx_GIVEREF(((PyObject *)__pyx_v_lemma));
        __Pyx_INCREF(((PyObject *)__pyx_v_suffix));
        PyTuple_SET_ITEM(__pyx_t_7, 1, ((PyObject *)__pyx_v_suffix));
        __Pyx_GIVEREF(((PyObject *)__pyx_v_suffix));
        __pyx_t_8 = PyNumber_Remainder(((PyObject *)__pyx_v_method_format_str), __pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(((PyObject *)__pyx_t_8));
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__method), ((PyObject *)__pyx_t_8)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
        __Pyx_DECREF(((PyObject *)__pyx_v_data));
        __pyx_v_data = __pyx_t_1;
        __pyx_t_1 = 0;

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":377
 *                     }
 *                     #
 *                     if not data in gram:             # <<<<<<<<<<<<<<
 *                         gram.append(data)
 *         return gram
 */
        __pyx_t_12 = ((PySequence_Contains(((PyObject *)__pyx_v_gram), ((PyObject *)__pyx_v_data)))); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __pyx_t_4 = (!__pyx_t_12);
        if (__pyx_t_4) {

          /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":378
 *                     #
 *                     if not data in gram:
 *                         gram.append(data)             # <<<<<<<<<<<<<<
 *         return gram
 * 
 */
          if (unlikely(__pyx_v_gram == Py_None)) {
            PyErr_SetString(PyExc_AttributeError, "'NoneType' object has no attribute 'append'"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
          }
          __pyx_t_13 = PyList_Append(((PyObject *)__pyx_v_gram), ((PyObject *)__pyx_v_data)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          goto __pyx_L8;
        }
        __pyx_L8:;
        goto __pyx_L7;
      }
      __pyx_L7:;
    }
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":379
 *                     if not data in gram:
 *                         gram.append(data)
 *         return gram             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_INCREF(((PyObject *)__pyx_v_gram));
  __pyx_r = __pyx_v_gram;
  goto __pyx_L0;

  __pyx_r = ((PyObject *)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_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_AddTraceback("pymorphy._morph.Morph._get_lemma_graminfo");
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_paradigm);
  __Pyx_DECREF(__pyx_v_gram);
  __Pyx_DECREF(__pyx_v_rules);
  __Pyx_DECREF(__pyx_v_gramtab);
  __Pyx_DECREF(__pyx_v_lemma_paradigms);
  __Pyx_DECREF(__pyx_v_paradigm_id);
  __Pyx_DECREF(__pyx_v_norm_form);
  __Pyx_DECREF(__pyx_v_rule_suffix);
  __Pyx_DECREF(__pyx_v_rule_ancode);
  __Pyx_DECREF(__pyx_v_rule_prefix);
  __Pyx_DECREF(__pyx_v_gram_class);
  __Pyx_DECREF(__pyx_v_info);
  __Pyx_DECREF(__pyx_v__);
  __Pyx_DECREF(__pyx_v_data);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":346
 * 
 * 
 *     def _get_lemma_graminfo(self, lemma, suffix, require_prefix, method_format_str):             # <<<<<<<<<<<<<<
 *         """  .     .
 *             , ,     ,
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__get_lemma_graminfo(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_5Morph__get_lemma_graminfo[] = " \320\237\320\276\320\273\321\203\321\207\320\270\321\202\321\214 \320\263\321\200\320\260\320\274. \320\270\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\216 \320\277\320\276 \320\273\320\265\320\274\320\274\320\265 \320\270 \321\201\321\203\321\204\321\204\320\270\320\272\321\201\321\203. \320\224\320\273\321\217 \320\273\320\265\320\274\320\274\321\213 \320\277\320\265\321\200\320\265\320\261\320\270\321\200\320\260\320\265\320\274 \320\262\321\201\320\265\n            \320\277\321\200\320\260\320\262\320\270\320\273\320\260, \321\201\320\274\320\276\321\202\321\200\320\270\320\274, \320\265\321\201\321\202\321\214 \320\273\320\270 \321\201\321\200\320\265\320\264\320\270 \320\275\320\270\321\205 \321\202\320\260\320\272\320\270\320\265, \320\272\320\276\321\202\320\276\321\200\321\213\320\265 \320\277\321\200\320\270\320\262\320\276\320\264\321\217\321\202 \320\272\n            \320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\216 \321\201\320\273\320\276\320\262 \321\201 \320\277\320\276\320\264\321\205\320\276\320\264\321\217\321\211\320\270\320\274\320\270 \320\276\320\272\320\276\320\275\321\207\320\260\320\275\320\270\321\217\320\274\320\270.\n        ";
static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__get_lemma_graminfo(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_lemma = 0;
  PyObject *__pyx_v_suffix = 0;
  PyObject *__pyx_v_require_prefix = 0;
  PyObject *__pyx_v_method_format_str = 0;
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__lemma,&__pyx_n_s__suffix,&__pyx_n_s__require_prefix,&__pyx_n_s__method_format_str,0};
  __Pyx_RefNannySetupContext("_get_lemma_graminfo");
  if (unlikely(__pyx_kwds)) {
    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
    PyObject* values[4] = {0,0,0,0};
    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);
      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      case  0: break;
      default: goto __pyx_L5_argtuple_error;
    }
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  0:
      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lemma);
      if (likely(values[0])) kw_args--;
      else goto __pyx_L5_argtuple_error;
      case  1:
      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__suffix);
      if (likely(values[1])) kw_args--;
      else {
        __Pyx_RaiseArgtupleInvalid("_get_lemma_graminfo", 1, 4, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
      case  2:
      values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__require_prefix);
      if (likely(values[2])) kw_args--;
      else {
        __Pyx_RaiseArgtupleInvalid("_get_lemma_graminfo", 1, 4, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
      case  3:
      values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__method_format_str);
      if (likely(values[3])) kw_args--;
      else {
        __Pyx_RaiseArgtupleInvalid("_get_lemma_graminfo", 1, 4, 4, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    }
    if (unlikely(kw_args > 0)) {
      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "_get_lemma_graminfo") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    }
    __pyx_v_lemma = ((PyObject *)values[0]);
    __pyx_v_suffix = ((PyObject *)values[1]);
    __pyx_v_require_prefix = ((PyObject *)values[2]);
    __pyx_v_method_format_str = ((PyObject *)values[3]);
  } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
    goto __pyx_L5_argtuple_error;
  } else {
    __pyx_v_lemma = ((PyObject *)PyTuple_GET_ITEM(__pyx_args, 0));
    __pyx_v_suffix = ((PyObject *)PyTuple_GET_ITEM(__pyx_args, 1));
    __pyx_v_require_prefix = ((PyObject *)PyTuple_GET_ITEM(__pyx_args, 2));
    __pyx_v_method_format_str = ((PyObject *)PyTuple_GET_ITEM(__pyx_args, 3));
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_get_lemma_graminfo", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("pymorphy._morph.Morph._get_lemma_graminfo");
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_lemma), &PyUnicode_Type, 1, "lemma", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_suffix), &PyUnicode_Type, 1, "suffix", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_require_prefix), &PyUnicode_Type, 1, "require_prefix", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_method_format_str), &PyUnicode_Type, 1, "method_format_str", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_8pymorphy_6_morph_Morph *)((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->__pyx_vtab)->_get_lemma_graminfo(((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self), __pyx_v_lemma, __pyx_v_suffix, __pyx_v_require_prefix, __pyx_v_method_format_str, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("pymorphy._morph.Morph._get_lemma_graminfo");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":382
 * 
 * 
 *     def _flexion_graminfo(self, word, require_prefix):             # <<<<<<<<<<<<<<
 *         """  .   , ,
 *              -  ,   . ,  - .
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__flexion_graminfo(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_5Morph__flexion_graminfo[] = " \320\222\320\265\321\200\320\275\321\203\321\202\321\214 \320\263\321\200\320\260\320\274. \320\270\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\216 \320\264\320\273\321\217 \321\201\320\273\320\276\320\262\320\260, \320\277\321\200\320\265\320\264\320\277\320\276\320\273\320\260\320\263\320\260\321\217, \321\207\321\202\320\276 \320\262\321\201\320\265\n            \321\201\320\273\320\276\320\262\320\276 - \321\215\321\202\320\276 \320\276\320\272\320\276\320\275\321\207\320\260\320\275\320\270\320\265, \320\260 \320\276\321\201\320\275\320\276\320\262\320\260 \320\277\321\203\321\201\321\202\320\260\321\217. \320\235\320\260\320\277\321\200\320\270\320\274\320\265\321\200, \320\247\320\225\320\233\320\236\320\222\320\225\320\232 - \320\233\320\256\320\224\320\230.\n            \320\243 \321\202\320\260\320\272\320\270\321\205 \321\201\320\273\320\276\320\262 \320\262 \321\201\320\273\320\276\320\262\320\260\321\200\321\217\321\205 \320\276\321\201\320\275\320\276\320\262\320\260 \320\267\320\260\320\277\320\270\321\201\321\213\320\262\320\260\320\265\321\202\321\201\321\217 \320\272\320\260\320\272 \"#\".\n        ";
static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__flexion_graminfo(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_word = 0;
  PyObject *__pyx_v_require_prefix = 0;
  PyObject *__pyx_v_info;
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  Py_ssize_t __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__require_prefix,0};
  __Pyx_RefNannySetupContext("_flexion_graminfo");
  if (unlikely(__pyx_kwds)) {
    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
    PyObject* values[2] = {0,0};
    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;
    }
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  0:
      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word);
      if (likely(values[0])) kw_args--;
      else goto __pyx_L5_argtuple_error;
      case  1:
      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__require_prefix);
      if (likely(values[1])) kw_args--;
      else {
        __Pyx_RaiseArgtupleInvalid("_flexion_graminfo", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    }
    if (unlikely(kw_args > 0)) {
      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "_flexion_graminfo") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    }
    __pyx_v_word = values[0];
    __pyx_v_require_prefix = values[1];
  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
    goto __pyx_L5_argtuple_error;
  } else {
    __pyx_v_word = PyTuple_GET_ITEM(__pyx_args, 0);
    __pyx_v_require_prefix = PyTuple_GET_ITEM(__pyx_args, 1);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_flexion_graminfo", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("pymorphy._morph.Morph._flexion_graminfo");
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_v_info = Py_None; __Pyx_INCREF(Py_None);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":387
 *                     "#".
 *         """
 *         return [info for info in self._get_lemma_graminfo(u'', word, require_prefix, u'%snobase(%s)')]             # <<<<<<<<<<<<<<
 * 
 *     def _do_predict_by_suffix(self, word):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
  if (!(likely(PyUnicode_CheckExact(__pyx_v_word))||((__pyx_v_word) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected unicode, got %.200s", Py_TYPE(__pyx_v_word)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (!(likely(PyUnicode_CheckExact(__pyx_v_require_prefix))||((__pyx_v_require_prefix) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected unicode, got %.200s", Py_TYPE(__pyx_v_require_prefix)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_8pymorphy_6_morph_Morph *)((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->__pyx_vtab)->_get_lemma_graminfo(((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self), __pyx_kp_u_1, ((PyObject *)__pyx_v_word), ((PyObject *)__pyx_v_require_prefix), __pyx_kp_u_29, 0)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  if (likely(__pyx_t_3 != Py_None)) {
    __pyx_t_2 = 0; __pyx_t_4 = __pyx_t_3; __Pyx_INCREF(__pyx_t_4);
  } else {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  for (;;) {
    if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_4)) break;
    __pyx_t_3 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;
    __Pyx_DECREF(__pyx_v_info);
    __pyx_v_info = __pyx_t_3;
    __pyx_t_3 = 0;
    if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_v_info))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_INCREF(((PyObject *)__pyx_t_1));
  __pyx_r = ((PyObject *)__pyx_t_1);
  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
  goto __pyx_L0;

  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("pymorphy._morph.Morph._flexion_graminfo");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_info);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":389
 *         return [info for info in self._get_lemma_graminfo(u'', word, require_prefix, u'%snobase(%s)')]
 * 
 *     def _do_predict_by_suffix(self, word):             # <<<<<<<<<<<<<<
 *         """
 *               5 .
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__do_predict_by_suffix(PyObject *__pyx_v_self, PyObject *__pyx_v_word); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_5Morph__do_predict_by_suffix[] = " \320\237\321\200\320\265\320\264\321\201\320\272\320\260\320\267\320\260\321\202\321\214 \320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\321\203\321\216 \321\204\320\276\321\200\320\274\321\203 \320\270 \320\277\320\260\321\200\320\260\320\264\320\270\320\263\320\274\321\203 \320\275\320\265\320\270\320\267\320\262\320\265\321\201\321\202\320\275\320\276\320\263\320\276 \321\201\320\273\320\276\320\262\320\260\n            \320\277\320\276 \320\277\320\276\321\201\320\273\320\265\320\264\320\275\320\270\320\274 5 \320\261\321\203\320\272\320\262\320\260\320\274.\n        ";
static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__do_predict_by_suffix(PyObject *__pyx_v_self, PyObject *__pyx_v_word) {
  PyObject *__pyx_v_data_source;
  PyObject *__pyx_v_gram;
  PyObject *__pyx_v_i;
  PyObject *__pyx_v_end;
  PyObject *__pyx_v_paradigms;
  PyObject *__pyx_v_paradigm_id;
  PyObject *__pyx_v_rules_id_list;
  PyObject *__pyx_v_rules_list;
  PyObject *__pyx_v_id;
  PyObject *__pyx_v_rule;
  PyObject *__pyx_v_suffix;
  PyObject *__pyx_v_ancode;
  PyObject *__pyx_v_graminfo;
  PyObject *__pyx_v_suffix_len;
  PyObject *__pyx_v_predicted_lemma;
  PyObject *__pyx_v_norm_form;
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  Py_ssize_t __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  int __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  Py_ssize_t __pyx_t_8;
  PyObject *__pyx_t_9 = NULL;
  Py_ssize_t __pyx_t_10;
  int __pyx_t_11;
  __Pyx_RefNannySetupContext("_do_predict_by_suffix");
  __pyx_v_data_source = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_gram = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_i = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_end = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_paradigms = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_paradigm_id = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_rules_id_list = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_rules_list = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_id = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_rule = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_suffix = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_ancode = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_graminfo = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_suffix_len = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_predicted_lemma = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_norm_form = Py_None; __Pyx_INCREF(Py_None);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":393
 *               5 .
 *         """
 *         data_source = self.data             # <<<<<<<<<<<<<<
 * 
 *         gram=[]
 */
  __Pyx_INCREF(((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->data);
  __Pyx_DECREF(__pyx_v_data_source);
  __pyx_v_data_source = ((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->data;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":395
 *         data_source = self.data
 * 
 *         gram=[]             # <<<<<<<<<<<<<<
 *         for i in (5,4,3,2,1):
 *             end = word[-i:]
 */
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
  __Pyx_DECREF(((PyObject *)__pyx_v_gram));
  __pyx_v_gram = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":396
 * 
 *         gram=[]
 *         for i in (5,4,3,2,1):             # <<<<<<<<<<<<<<
 *             end = word[-i:]
 *             if end in data_source.endings:
 */
  __pyx_t_1 = PyTuple_New(5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_int_5);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_int_5);
  __Pyx_GIVEREF(__pyx_int_5);
  __Pyx_INCREF(__pyx_int_4);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_4);
  __Pyx_GIVEREF(__pyx_int_4);
  __Pyx_INCREF(__pyx_int_3);
  PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_int_3);
  __Pyx_GIVEREF(__pyx_int_3);
  __Pyx_INCREF(__pyx_int_2);
  PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_int_2);
  __Pyx_GIVEREF(__pyx_int_2);
  __Pyx_INCREF(__pyx_int_1);
  PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_int_1);
  __Pyx_GIVEREF(__pyx_int_1);
  if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) {
    __pyx_t_2 = 0; __pyx_t_3 = __pyx_t_1; __Pyx_INCREF(__pyx_t_3);
  } else {
    __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  for (;;) {
    if (likely(PyList_CheckExact(__pyx_t_3))) {
      if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
    } else if (likely(PyTuple_CheckExact(__pyx_t_3))) {
      if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
    } else {
      __pyx_t_1 = PyIter_Next(__pyx_t_3);
      if (!__pyx_t_1) {
        if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        break;
      }
      __Pyx_GOTREF(__pyx_t_1);
    }
    __Pyx_DECREF(__pyx_v_i);
    __pyx_v_i = __pyx_t_1;
    __pyx_t_1 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":397
 *         gram=[]
 *         for i in (5,4,3,2,1):
 *             end = word[-i:]             # <<<<<<<<<<<<<<
 *             if end in data_source.endings:
 * 
 */
    __pyx_t_1 = PyNumber_Negative(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_4 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_4 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = PySequence_GetSlice(__pyx_v_word, __pyx_t_4, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_v_end);
    __pyx_v_end = __pyx_t_1;
    __pyx_t_1 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":398
 *         for i in (5,4,3,2,1):
 *             end = word[-i:]
 *             if end in data_source.endings:             # <<<<<<<<<<<<<<
 * 
 *                 # ,
 */
    __pyx_t_1 = PyObject_GetAttr(__pyx_v_data_source, __pyx_n_s__endings); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_5 = ((PySequence_Contains(__pyx_t_1, __pyx_v_end))); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (__pyx_t_5) {

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":402
 *                 # ,
 *                 #
 *                 paradigms = data_source.endings[end]             # <<<<<<<<<<<<<<
 * 
 *                 for paradigm_id in paradigms:
 */
      __pyx_t_1 = PyObject_GetAttr(__pyx_v_data_source, __pyx_n_s__endings); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_6 = PyObject_GetItem(__pyx_t_1, __pyx_v_end); if (!__pyx_t_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_DECREF(__pyx_v_paradigms);
      __pyx_v_paradigms = __pyx_t_6;
      __pyx_t_6 = 0;

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":404
 *                 paradigms = data_source.endings[end]
 * 
 *                 for paradigm_id in paradigms:             # <<<<<<<<<<<<<<
 * 
 *                     #
 */
      if (PyList_CheckExact(__pyx_v_paradigms) || PyTuple_CheckExact(__pyx_v_paradigms)) {
        __pyx_t_4 = 0; __pyx_t_6 = __pyx_v_paradigms; __Pyx_INCREF(__pyx_t_6);
      } else {
        __pyx_t_4 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_v_paradigms); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_6);
      }
      for (;;) {
        if (likely(PyList_CheckExact(__pyx_t_6))) {
          if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_6)) break;
          __pyx_t_1 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++;
        } else if (likely(PyTuple_CheckExact(__pyx_t_6))) {
          if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
          __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++;
        } else {
          __pyx_t_1 = PyIter_Next(__pyx_t_6);
          if (!__pyx_t_1) {
            if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            break;
          }
          __Pyx_GOTREF(__pyx_t_1);
        }
        __Pyx_DECREF(__pyx_v_paradigm_id);
        __pyx_v_paradigm_id = __pyx_t_1;
        __pyx_t_1 = 0;

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":407
 * 
 *                     #
 *                     rules_id_list = paradigms[paradigm_id]             # <<<<<<<<<<<<<<
 *                     # lookup-
 *                     rules_list = data_source.rules[paradigm_id]
 */
        __pyx_t_1 = PyObject_GetItem(__pyx_v_paradigms, __pyx_v_paradigm_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_DECREF(__pyx_v_rules_id_list);
        __pyx_v_rules_id_list = __pyx_t_1;
        __pyx_t_1 = 0;

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":409
 *                     rules_id_list = paradigms[paradigm_id]
 *                     # lookup-
 *                     rules_list = data_source.rules[paradigm_id]             # <<<<<<<<<<<<<<
 * 
 *                     #      ,
 */
        __pyx_t_1 = PyObject_GetAttr(__pyx_v_data_source, __pyx_n_s__rules); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_7 = PyObject_GetItem(__pyx_t_1, __pyx_v_paradigm_id); if (!__pyx_t_7) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __Pyx_DECREF(__pyx_v_rules_list);
        __pyx_v_rules_list = __pyx_t_7;
        __pyx_t_7 = 0;

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":413
 *                     #      ,
 *                     # ,
 *                     for id in rules_id_list:             # <<<<<<<<<<<<<<
 *                         rule = rules_list[id]
 *                         suffix, ancode = rule[0], rule[1]
 */
        if (PyList_CheckExact(__pyx_v_rules_id_list) || PyTuple_CheckExact(__pyx_v_rules_id_list)) {
          __pyx_t_8 = 0; __pyx_t_7 = __pyx_v_rules_id_list; __Pyx_INCREF(__pyx_t_7);
        } else {
          __pyx_t_8 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_v_rules_id_list); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_7);
        }
        for (;;) {
          if (likely(PyList_CheckExact(__pyx_t_7))) {
            if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_7)) break;
            __pyx_t_1 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++;
          } else if (likely(PyTuple_CheckExact(__pyx_t_7))) {
            if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
            __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++;
          } else {
            __pyx_t_1 = PyIter_Next(__pyx_t_7);
            if (!__pyx_t_1) {
              if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
              break;
            }
            __Pyx_GOTREF(__pyx_t_1);
          }
          __Pyx_DECREF(__pyx_v_id);
          __pyx_v_id = __pyx_t_1;
          __pyx_t_1 = 0;

          /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":414
 *                     # ,
 *                     for id in rules_id_list:
 *                         rule = rules_list[id]             # <<<<<<<<<<<<<<
 *                         suffix, ancode = rule[0], rule[1]
 *                         graminfo = data_source.gramtab[ancode]
 */
          __pyx_t_1 = PyObject_GetItem(__pyx_v_rules_list, __pyx_v_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_DECREF(__pyx_v_rule);
          __pyx_v_rule = __pyx_t_1;
          __pyx_t_1 = 0;

          /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":415
 *                     for id in rules_id_list:
 *                         rule = rules_list[id]
 *                         suffix, ancode = rule[0], rule[1]             # <<<<<<<<<<<<<<
 *                         graminfo = data_source.gramtab[ancode]
 *                         if graminfo[0] in PRODUCTIVE_CLASSES:
 */
          __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_rule, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_9 = __Pyx_GetItemInt(__pyx_v_rule, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_9);
          __Pyx_DECREF(__pyx_v_suffix);
          __pyx_v_suffix = __pyx_t_1;
          __pyx_t_1 = 0;
          __Pyx_DECREF(__pyx_v_ancode);
          __pyx_v_ancode = __pyx_t_9;
          __pyx_t_9 = 0;

          /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":416
 *                         rule = rules_list[id]
 *                         suffix, ancode = rule[0], rule[1]
 *                         graminfo = data_source.gramtab[ancode]             # <<<<<<<<<<<<<<
 *                         if graminfo[0] in PRODUCTIVE_CLASSES:
 *                             # .
 */
          __pyx_t_9 = PyObject_GetAttr(__pyx_v_data_source, __pyx_n_s__gramtab); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_9);
          __pyx_t_1 = PyObject_GetItem(__pyx_t_9, __pyx_v_ancode); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
          __Pyx_DECREF(__pyx_v_graminfo);
          __pyx_v_graminfo = __pyx_t_1;
          __pyx_t_1 = 0;

          /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":417
 *                         suffix, ancode = rule[0], rule[1]
 *                         graminfo = data_source.gramtab[ancode]
 *                         if graminfo[0] in PRODUCTIVE_CLASSES:             # <<<<<<<<<<<<<<
 *                             # .
 *                             #
 */
          __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_graminfo, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__PRODUCTIVE_CLASSES); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_9);
          __pyx_t_5 = ((PySequence_Contains(__pyx_t_9, __pyx_t_1))); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
          if (__pyx_t_5) {

            /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":420
 *                             # .
 *                             #
 *                             suffix_len = len(suffix)             # <<<<<<<<<<<<<<
 *                             predicted_lemma = word[0:-suffix_len] if suffix_len else word
 *                             norm_form = predicted_lemma + rules_list[0][0]
 */
            __pyx_t_10 = PyObject_Length(__pyx_v_suffix); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __pyx_t_9 = PyInt_FromSsize_t(__pyx_t_10); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_9);
            __Pyx_DECREF(__pyx_v_suffix_len);
            __pyx_v_suffix_len = __pyx_t_9;
            __pyx_t_9 = 0;

            /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":421
 *                             #
 *                             suffix_len = len(suffix)
 *                             predicted_lemma = word[0:-suffix_len] if suffix_len else word             # <<<<<<<<<<<<<<
 *                             norm_form = predicted_lemma + rules_list[0][0]
 *                             gram.append({
 */
            __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_v_suffix_len); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            if (__pyx_t_5) {
              __pyx_t_1 = PyNumber_Negative(__pyx_v_suffix_len); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
              __Pyx_GOTREF(__pyx_t_1);
              __pyx_t_10 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_10 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
              __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
              __pyx_t_1 = PySequence_GetSlice(__pyx_v_word, 0, __pyx_t_10); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
              __Pyx_GOTREF(__pyx_t_1);
              __pyx_t_9 = __pyx_t_1;
              __pyx_t_1 = 0;
            } else {
              __Pyx_INCREF(__pyx_v_word);
              __pyx_t_9 = __pyx_v_word;
            }
            __Pyx_DECREF(__pyx_v_predicted_lemma);
            __pyx_v_predicted_lemma = __pyx_t_9;
            __pyx_t_9 = 0;

            /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":422
 *                             suffix_len = len(suffix)
 *                             predicted_lemma = word[0:-suffix_len] if suffix_len else word
 *                             norm_form = predicted_lemma + rules_list[0][0]             # <<<<<<<<<<<<<<
 *                             gram.append({
 *                                          'norm': norm_form,
 */
            __pyx_t_9 = __Pyx_GetItemInt(__pyx_v_rules_list, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_9);
            __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_9, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_1);
            __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
            __pyx_t_9 = PyNumber_Add(__pyx_v_predicted_lemma, __pyx_t_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_9);
            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
            __Pyx_DECREF(__pyx_v_norm_form);
            __pyx_v_norm_form = __pyx_t_9;
            __pyx_t_9 = 0;

            /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":423
 *                             predicted_lemma = word[0:-suffix_len] if suffix_len else word
 *                             norm_form = predicted_lemma + rules_list[0][0]
 *                             gram.append({             # <<<<<<<<<<<<<<
 *                                          'norm': norm_form,
 *                                          'class':graminfo[0],
 */
            if (unlikely(__pyx_v_gram == Py_None)) {
              PyErr_SetString(PyExc_AttributeError, "'NoneType' object has no attribute 'append'"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;} 
            }
            __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(((PyObject *)__pyx_t_9));

            /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":424
 *                             norm_form = predicted_lemma + rules_list[0][0]
 *                             gram.append({
 *                                          'norm': norm_form,             # <<<<<<<<<<<<<<
 *                                          'class':graminfo[0],
 *                                          'info': graminfo[1],
 */
            if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__norm), __pyx_v_norm_form) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

            /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":425
 *                             gram.append({
 *                                          'norm': norm_form,
 *                                          'class':graminfo[0],             # <<<<<<<<<<<<<<
 *                                          'info': graminfo[1],
 *                                          'paradigm_id': paradigm_id,
 */
            __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_graminfo, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_1);
            if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__class), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

            /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":426
 *                                          'norm': norm_form,
 *                                          'class':graminfo[0],
 *                                          'info': graminfo[1],             # <<<<<<<<<<<<<<
 *                                          'paradigm_id': paradigm_id,
 *                                          'ancode': ancode,
 */
            __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_graminfo, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(__pyx_t_1);
            if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__info), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

            /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":427
 *                                          'class':graminfo[0],
 *                                          'info': graminfo[1],
 *                                          'paradigm_id': paradigm_id,             # <<<<<<<<<<<<<<
 *                                          'ancode': ancode,
 *                                          'lemma': predicted_lemma,
 */
            if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__paradigm_id), __pyx_v_paradigm_id) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

            /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":428
 *                                          'info': graminfo[1],
 *                                          'paradigm_id': paradigm_id,
 *                                          'ancode': ancode,             # <<<<<<<<<<<<<<
 *                                          'lemma': predicted_lemma,
 *                                          'method': u'predict(...%s)' % end
 */
            if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__ancode), __pyx_v_ancode) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

            /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":429
 *                                          'paradigm_id': paradigm_id,
 *                                          'ancode': ancode,
 *                                          'lemma': predicted_lemma,             # <<<<<<<<<<<<<<
 *                                          'method': u'predict(...%s)' % end
 *                                        })
 */
            if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__lemma), __pyx_v_predicted_lemma) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

            /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":431
 *                                          'lemma': predicted_lemma,
 *                                          'method': u'predict(...%s)' % end
 *                                        })             # <<<<<<<<<<<<<<
 * 
 *                 #        ,
 */
            __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_30), __pyx_v_end); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_GOTREF(((PyObject *)__pyx_t_1));
            if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__method), ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
            __pyx_t_11 = PyList_Append(((PyObject *)__pyx_v_gram), ((PyObject *)__pyx_t_9)); if (unlikely(__pyx_t_11 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
            goto __pyx_L12;
          }
          __pyx_L12:;
        }
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      }
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":434
 * 
 *                 #        ,
 *                 if gram:             # <<<<<<<<<<<<<<
 *                     break
 * 
 */
      __pyx_t_5 = (((PyObject *)__pyx_v_gram) != Py_None) && (PyList_GET_SIZE(((PyObject *)__pyx_v_gram)) != 0);
      if (__pyx_t_5) {

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":435
 *                 #        ,
 *                 if gram:
 *                     break             # <<<<<<<<<<<<<<
 * 
 *         #       ,
 */
        goto __pyx_L6_break;
        goto __pyx_L13;
      }
      __pyx_L13:;
      goto __pyx_L7;
    }
    __pyx_L7:;
  }
  __pyx_L6_break:;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":450
 * #            })
 * 
 *         return gram             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_gram));
  __pyx_r = ((PyObject *)__pyx_v_gram);
  goto __pyx_L0;

  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("pymorphy._morph.Morph._do_predict_by_suffix");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_data_source);
  __Pyx_DECREF(__pyx_v_gram);
  __Pyx_DECREF(__pyx_v_i);
  __Pyx_DECREF(__pyx_v_end);
  __Pyx_DECREF(__pyx_v_paradigms);
  __Pyx_DECREF(__pyx_v_paradigm_id);
  __Pyx_DECREF(__pyx_v_rules_id_list);
  __Pyx_DECREF(__pyx_v_rules_list);
  __Pyx_DECREF(__pyx_v_id);
  __Pyx_DECREF(__pyx_v_rule);
  __Pyx_DECREF(__pyx_v_suffix);
  __Pyx_DECREF(__pyx_v_ancode);
  __Pyx_DECREF(__pyx_v_graminfo);
  __Pyx_DECREF(__pyx_v_suffix_len);
  __Pyx_DECREF(__pyx_v_predicted_lemma);
  __Pyx_DECREF(__pyx_v_norm_form);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":453
 * 
 * 
 *     def _static_prefix_graminfo(self, variants, require_prefix=u''):             # <<<<<<<<<<<<<<
 *         """    ,
 *              .
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__static_prefix_graminfo(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_5Morph__static_prefix_graminfo[] = " \320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\270\321\202\321\214 \320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\321\203\321\216 \321\204\320\276\321\200\320\274\321\203 \321\201\320\273\320\276\320\262\320\260, \320\277\321\200\320\276\320\261\321\203\321\217 \320\276\321\202\320\261\321\200\320\276\321\201\320\270\321\202\321\214\n            \321\204\320\270\320\272\321\201\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\265 \320\277\321\200\320\265\321\204\320\270\320\272\321\201\321\213. \320\222 \321\204\321\203\320\275\320\272\321\206\320\270\321\216 \320\277\320\265\321\200\320\265\320\264\320\260\320\265\321\202\321\201\321\217 \321\203\320\266\320\265 \320\277\320\276\320\264\320\263\320\276\321\202\320\276\320\262\320\273\320\265\320\275\320\275\321\213\320\271\n            \321\201\320\277\320\270\321\201\320\276\320\272 \320\262\320\260\321\200\320\270\320\260\320\275\321\202\320\276\320\262 \321\200\320\260\320\267\320\261\320\270\320\265\320\275\320\270\321\217 \321\201\320\273\320\276\320\262\320\260.\n        ";
static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__static_prefix_graminfo(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_variants = 0;
  PyObject *__pyx_v_require_prefix = 0;
  PyObject *__pyx_v_gram;
  PyObject *__pyx_v_prefix;
  PyObject *__pyx_v_suffix;
  PyObject *__pyx_v_base_forms;
  PyObject *__pyx_v_form;
  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 = NULL;
  Py_ssize_t __pyx_t_8;
  PyObject *__pyx_t_9 = NULL;
  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__variants,&__pyx_n_s__require_prefix,0};
  __Pyx_RefNannySetupContext("_static_prefix_graminfo");
  if (unlikely(__pyx_kwds)) {
    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
    PyObject* values[2] = {0,0};
    values[1] = ((PyObject *)__pyx_kp_u_1);
    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;
    }
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  0:
      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__variants);
      if (likely(values[0])) kw_args--;
      else goto __pyx_L5_argtuple_error;
      case  1:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__require_prefix);
        if (value) { values[1] = value; kw_args--; }
      }
    }
    if (unlikely(kw_args > 0)) {
      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "_static_prefix_graminfo") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    }
    __pyx_v_variants = values[0];
    __pyx_v_require_prefix = values[1];
  } else {
    __pyx_v_require_prefix = ((PyObject *)__pyx_kp_u_1);
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  2: __pyx_v_require_prefix = PyTuple_GET_ITEM(__pyx_args, 1);
      case  1: __pyx_v_variants = PyTuple_GET_ITEM(__pyx_args, 0);
      break;
      default: goto __pyx_L5_argtuple_error;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_static_prefix_graminfo", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("pymorphy._morph.Morph._static_prefix_graminfo");
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_v_gram = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_prefix = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_suffix = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_base_forms = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_form = Py_None; __Pyx_INCREF(Py_None);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":458
 *                .
 *         """
 *         gram = []             # <<<<<<<<<<<<<<
 *         if not self.check_prefixes:
 *             return gram
 */
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
  __Pyx_DECREF(((PyObject *)__pyx_v_gram));
  __pyx_v_gram = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":459
 *         """
 *         gram = []
 *         if not self.check_prefixes:             # <<<<<<<<<<<<<<
 *             return gram
 * 
 */
  __pyx_t_2 = (!((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->check_prefixes);
  if (__pyx_t_2) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":460
 *         gram = []
 *         if not self.check_prefixes:
 *             return gram             # <<<<<<<<<<<<<<
 * 
 *         for (prefix, suffix) in variants:
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(((PyObject *)__pyx_v_gram));
    __pyx_r = ((PyObject *)__pyx_v_gram);
    goto __pyx_L0;
    goto __pyx_L6;
  }
  __pyx_L6:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":462
 *             return gram
 * 
 *         for (prefix, suffix) in variants:             # <<<<<<<<<<<<<<
 * 
 *             #    ?
 */
  if (PyList_CheckExact(__pyx_v_variants) || PyTuple_CheckExact(__pyx_v_variants)) {
    __pyx_t_3 = 0; __pyx_t_1 = __pyx_v_variants; __Pyx_INCREF(__pyx_t_1);
  } else {
    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_variants); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
  }
  for (;;) {
    if (likely(PyList_CheckExact(__pyx_t_1))) {
      if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break;
      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++;
    } else if (likely(PyTuple_CheckExact(__pyx_t_1))) {
      if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++;
    } else {
      __pyx_t_4 = PyIter_Next(__pyx_t_1);
      if (!__pyx_t_4) {
        if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        break;
      }
      __Pyx_GOTREF(__pyx_t_4);
    }
    if (PyTuple_CheckExact(__pyx_t_4) && likely(PyTuple_GET_SIZE(__pyx_t_4) == 2)) {
      PyObject* tuple = __pyx_t_4;
      __pyx_t_5 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_t_5);
      __pyx_t_6 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_v_prefix);
      __pyx_v_prefix = __pyx_t_5;
      __pyx_t_5 = 0;
      __Pyx_DECREF(__pyx_v_suffix);
      __pyx_v_suffix = __pyx_t_6;
      __pyx_t_6 = 0;
    } else {
      __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_5 = __Pyx_UnpackItem(__pyx_t_7, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_6 = __Pyx_UnpackItem(__pyx_t_7, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      if (__Pyx_EndUnpack(__pyx_t_7, 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_DECREF(__pyx_v_prefix);
      __pyx_v_prefix = __pyx_t_5;
      __pyx_t_5 = 0;
      __Pyx_DECREF(__pyx_v_suffix);
      __pyx_v_suffix = __pyx_t_6;
      __pyx_t_6 = 0;
    }

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":465
 * 
 *             #    ?
 *             if prefix in self.data.prefixes:             # <<<<<<<<<<<<<<
 *                 # ,   .
 *                 #  (  )
 */
    __pyx_t_4 = PyObject_GetAttr(((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->data, __pyx_n_s__prefixes); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_2 = ((PySequence_Contains(__pyx_t_4, __pyx_v_prefix))); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (__pyx_t_2) {

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":468
 *                 # ,   .
 *                 #  (  )
 *                 base_forms = self._get_graminfo(suffix,             # <<<<<<<<<<<<<<
 *                                                 require_prefix = require_prefix,
 *                                                 predict = False,
 */
      __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___get_graminfo); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_INCREF(__pyx_v_suffix);
      PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_suffix);
      __Pyx_GIVEREF(__pyx_v_suffix);
      __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(((PyObject *)__pyx_t_5));

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":469
 *                 #  (  )
 *                 base_forms = self._get_graminfo(suffix,
 *                                                 require_prefix = require_prefix,             # <<<<<<<<<<<<<<
 *                                                 predict = False,
 *                                                 predict_EE = False)
 */
      if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__require_prefix), __pyx_v_require_prefix) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":470
 *                 base_forms = self._get_graminfo(suffix,
 *                                                 require_prefix = require_prefix,
 *                                                 predict = False,             # <<<<<<<<<<<<<<
 *                                                 predict_EE = False)
 * 
 */
      __pyx_t_7 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__predict), __pyx_t_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":471
 *                                                 require_prefix = require_prefix,
 *                                                 predict = False,
 *                                                 predict_EE = False)             # <<<<<<<<<<<<<<
 * 
 *                 #
 */
      __pyx_t_7 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__predict_EE), __pyx_t_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __pyx_t_7 = PyEval_CallObjectWithKeywords(__pyx_t_4, __pyx_t_6, ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
      __Pyx_DECREF(__pyx_v_base_forms);
      __pyx_v_base_forms = __pyx_t_7;
      __pyx_t_7 = 0;

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":474
 * 
 *                 #
 *                 for form in base_forms:             # <<<<<<<<<<<<<<
 *                     form['prefixes'] = [prefix] + form.get('prefixes', [])
 *                     form['method'] = u'prefix(%s).%s' % (prefix, form['method'])
 */
      if (PyList_CheckExact(__pyx_v_base_forms) || PyTuple_CheckExact(__pyx_v_base_forms)) {
        __pyx_t_8 = 0; __pyx_t_7 = __pyx_v_base_forms; __Pyx_INCREF(__pyx_t_7);
      } else {
        __pyx_t_8 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_v_base_forms); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_7);
      }
      for (;;) {
        if (likely(PyList_CheckExact(__pyx_t_7))) {
          if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_7)) break;
          __pyx_t_5 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_5); __pyx_t_8++;
        } else if (likely(PyTuple_CheckExact(__pyx_t_7))) {
          if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
          __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_8); __Pyx_INCREF(__pyx_t_5); __pyx_t_8++;
        } else {
          __pyx_t_5 = PyIter_Next(__pyx_t_7);
          if (!__pyx_t_5) {
            if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
            break;
          }
          __Pyx_GOTREF(__pyx_t_5);
        }
        __Pyx_DECREF(__pyx_v_form);
        __pyx_v_form = __pyx_t_5;
        __pyx_t_5 = 0;

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":475
 *                 #
 *                 for form in base_forms:
 *                     form['prefixes'] = [prefix] + form.get('prefixes', [])             # <<<<<<<<<<<<<<
 *                     form['method'] = u'prefix(%s).%s' % (prefix, form['method'])
 *                 gram.extend(base_forms)
 */
        __pyx_t_5 = PyList_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(((PyObject *)__pyx_t_5));
        __Pyx_INCREF(__pyx_v_prefix);
        PyList_SET_ITEM(__pyx_t_5, 0, __pyx_v_prefix);
        __Pyx_GIVEREF(__pyx_v_prefix);
        __pyx_t_6 = PyObject_GetAttr(__pyx_v_form, __pyx_n_s__get); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(((PyObject *)__pyx_t_4));
        __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_9);
        __Pyx_INCREF(((PyObject *)__pyx_n_s__prefixes));
        PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_n_s__prefixes));
        __Pyx_GIVEREF(((PyObject *)__pyx_n_s__prefixes));
        PyTuple_SET_ITEM(__pyx_t_9, 1, ((PyObject *)__pyx_t_4));
        __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
        __pyx_t_4 = 0;
        __pyx_t_4 = PyObject_Call(__pyx_t_6, __pyx_t_9, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
        __pyx_t_9 = PyNumber_Add(((PyObject *)__pyx_t_5), __pyx_t_4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_9);
        __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        if (PyObject_SetItem(__pyx_v_form, ((PyObject *)__pyx_n_s__prefixes), __pyx_t_9) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":476
 *                 for form in base_forms:
 *                     form['prefixes'] = [prefix] + form.get('prefixes', [])
 *                     form['method'] = u'prefix(%s).%s' % (prefix, form['method'])             # <<<<<<<<<<<<<<
 *                 gram.extend(base_forms)
 * 
 */
        __pyx_t_9 = PyObject_GetItem(__pyx_v_form, ((PyObject *)__pyx_n_s__method)); if (!__pyx_t_9) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_9);
        __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_INCREF(__pyx_v_prefix);
        PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_prefix);
        __Pyx_GIVEREF(__pyx_v_prefix);
        PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_9);
        __Pyx_GIVEREF(__pyx_t_9);
        __pyx_t_9 = 0;
        __pyx_t_9 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_31), __pyx_t_4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(((PyObject *)__pyx_t_9));
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        if (PyObject_SetItem(__pyx_v_form, ((PyObject *)__pyx_n_s__method), ((PyObject *)__pyx_t_9)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
      }
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":477
 *                     form['prefixes'] = [prefix] + form.get('prefixes', [])
 *                     form['method'] = u'prefix(%s).%s' % (prefix, form['method'])
 *                 gram.extend(base_forms)             # <<<<<<<<<<<<<<
 * 
 *             #      ? (-  -)
 */
      __pyx_t_7 = PyObject_GetAttr(((PyObject *)__pyx_v_gram), __pyx_n_s__extend); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_INCREF(__pyx_v_base_forms);
      PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_base_forms);
      __Pyx_GIVEREF(__pyx_v_base_forms);
      __pyx_t_4 = PyObject_Call(__pyx_t_7, __pyx_t_9, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      goto __pyx_L9;
    }
    __pyx_L9:;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":480
 * 
 *             #      ? (-  -)
 *             if prefix in self.data.possible_rule_prefixes:             # <<<<<<<<<<<<<<
 *                 #  ,  , ..
 *                 #       . .
 */
    __pyx_t_4 = PyObject_GetAttr(((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->data, __pyx_n_s_32); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_2 = ((PySequence_Contains(__pyx_t_4, __pyx_v_prefix))); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (__pyx_t_2) {

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":484
 *                 #       . .
 *                 # ,  ->
 *                 gram.extend(self._get_graminfo(suffix,             # <<<<<<<<<<<<<<
 *                                                require_prefix = prefix,
 *                                                predict = False,
 */
      __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_gram), __pyx_n_s__extend); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_9 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___get_graminfo); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_9);
      __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_INCREF(__pyx_v_suffix);
      PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_suffix);
      __Pyx_GIVEREF(__pyx_v_suffix);
      __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(((PyObject *)__pyx_t_5));

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":485
 *                 # ,  ->
 *                 gram.extend(self._get_graminfo(suffix,
 *                                                require_prefix = prefix,             # <<<<<<<<<<<<<<
 *                                                predict = False,
 *                                                predict_EE = False))
 */
      if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__require_prefix), __pyx_v_prefix) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":486
 *                 gram.extend(self._get_graminfo(suffix,
 *                                                require_prefix = prefix,
 *                                                predict = False,             # <<<<<<<<<<<<<<
 *                                                predict_EE = False))
 *         return gram
 */
      __pyx_t_6 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__predict), __pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":487
 *                                                require_prefix = prefix,
 *                                                predict = False,
 *                                                predict_EE = False))             # <<<<<<<<<<<<<<
 *         return gram
 * 
 */
      __pyx_t_6 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__predict_EE), __pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_t_6 = PyEval_CallObjectWithKeywords(__pyx_t_9, __pyx_t_7, ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_6);
      __Pyx_GIVEREF(__pyx_t_6);
      __pyx_t_6 = 0;
      __pyx_t_6 = PyObject_Call(__pyx_t_4, __pyx_t_5, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __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_L12;
    }
    __pyx_L12:;
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":488
 *                                                predict = False,
 *                                                predict_EE = False))
 *         return gram             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_gram));
  __pyx_r = ((PyObject *)__pyx_v_gram);
  goto __pyx_L0;

  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  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_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("pymorphy._morph.Morph._static_prefix_graminfo");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_gram);
  __Pyx_DECREF(__pyx_v_prefix);
  __Pyx_DECREF(__pyx_v_suffix);
  __Pyx_DECREF(__pyx_v_base_forms);
  __Pyx_DECREF(__pyx_v_form);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":491
 * 
 * 
 *     def _predict_hyphenated(self, word, require_prefix=u'', predict=True):             # <<<<<<<<<<<<<<
 *         """    ,     """
 *         gram = []
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__predict_hyphenated(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_5Morph__predict_hyphenated[] = " \320\237\321\200\320\265\320\264\321\201\320\272\320\260\320\267\320\260\321\202\321\214 \320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\321\203\321\216 \321\204\320\276\321\200\320\274\321\203 \321\201\320\273\320\276\320\262\320\260, \320\272\320\276\321\202\320\276\321\200\320\276\320\265 \320\277\320\270\321\210\320\265\321\202\321\201\321\217 \321\207\320\265\321\200\320\265\320\267 \320\264\320\265\321\204\320\270\321\201 ";
static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__predict_hyphenated(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_word = 0;
  PyObject *__pyx_v_require_prefix = 0;
  PyObject *__pyx_v_predict = 0;
  PyObject *__pyx_v_gram;
  PyObject *__pyx_v_left;
  PyObject *__pyx_v_right;
  PyObject *__pyx_v_right_forms;
  PyObject *__pyx_v_form;
  PyObject *__pyx_v_left_forms;
  PyObject *__pyx_v_left_form;
  struct __pyx_obj_8pymorphy_6_morph_GramForm *__pyx_v_gram_form;
  PyObject *__pyx_v_right_form;
  PyObject *__pyx_v_data;
  PyObject *__pyx_r = NULL;
  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;
  Py_ssize_t __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  Py_ssize_t __pyx_t_9;
  int __pyx_t_10;
  PyObject *__pyx_t_11 = NULL;
  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__require_prefix,&__pyx_n_s__predict,0};
  __Pyx_RefNannySetupContext("_predict_hyphenated");
  if (unlikely(__pyx_kwds)) {
    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
    PyObject* values[3] = {0,0,0};
    values[1] = ((PyObject *)__pyx_kp_u_1);
    values[2] = __pyx_k_33;
    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);
      case  0: break;
      default: goto __pyx_L5_argtuple_error;
    }
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  0:
      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word);
      if (likely(values[0])) kw_args--;
      else goto __pyx_L5_argtuple_error;
      case  1:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__require_prefix);
        if (value) { values[1] = value; kw_args--; }
      }
      case  2:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__predict);
        if (value) { values[2] = value; kw_args--; }
      }
    }
    if (unlikely(kw_args > 0)) {
      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "_predict_hyphenated") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    }
    __pyx_v_word = values[0];
    __pyx_v_require_prefix = values[1];
    __pyx_v_predict = values[2];
  } else {
    __pyx_v_require_prefix = ((PyObject *)__pyx_kp_u_1);
    __pyx_v_predict = __pyx_k_33;
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  3: __pyx_v_predict = PyTuple_GET_ITEM(__pyx_args, 2);
      case  2: __pyx_v_require_prefix = PyTuple_GET_ITEM(__pyx_args, 1);
      case  1: __pyx_v_word = PyTuple_GET_ITEM(__pyx_args, 0);
      break;
      default: goto __pyx_L5_argtuple_error;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_predict_hyphenated", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("pymorphy._morph.Morph._predict_hyphenated");
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_v_gram = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_left = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_right = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_right_forms = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_form = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_left_forms = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_left_form = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_gram_form = ((struct __pyx_obj_8pymorphy_6_morph_GramForm *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_right_form = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_data = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":493
 *     def _predict_hyphenated(self, word, require_prefix=u'', predict=True):
 *         """    ,     """
 *         gram = []             # <<<<<<<<<<<<<<
 *         if not u'-' in word:
 *             return gram
 */
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
  __Pyx_DECREF(__pyx_v_gram);
  __pyx_v_gram = ((PyObject *)__pyx_t_1);
  __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":494
 *         """    ,     """
 *         gram = []
 *         if not u'-' in word:             # <<<<<<<<<<<<<<
 *             return gram
 * 
 */
  __pyx_t_2 = ((PySequence_Contains(__pyx_v_word, ((PyObject *)__pyx_kp_u_20)))); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_3 = (!__pyx_t_2);
  if (__pyx_t_3) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":495
 *         gram = []
 *         if not u'-' in word:
 *             return gram             # <<<<<<<<<<<<<<
 * 
 *         left, right = word.split('-', 1)
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_v_gram);
    __pyx_r = __pyx_v_gram;
    goto __pyx_L0;
    goto __pyx_L6;
  }
  __pyx_L6:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":497
 *             return gram
 * 
 *         left, right = word.split('-', 1)             # <<<<<<<<<<<<<<
 *         left = require_prefix+left if left else u''
 *         #    ,
 */
  __pyx_t_1 = PyObject_GetAttr(__pyx_v_word, __pyx_n_s__split); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(((PyObject *)__pyx_kp_s_20));
  PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_s_20));
  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_20));
  __Pyx_INCREF(__pyx_int_1);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_int_1);
  __Pyx_GIVEREF(__pyx_int_1);
  __pyx_t_5 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (PyTuple_CheckExact(__pyx_t_5) && likely(PyTuple_GET_SIZE(__pyx_t_5) == 2)) {
    PyObject* tuple = __pyx_t_5;
    __pyx_t_4 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_t_4);
    __pyx_t_1 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_DECREF(__pyx_v_left);
    __pyx_v_left = __pyx_t_4;
    __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_v_right);
    __pyx_v_right = __pyx_t_1;
    __pyx_t_1 = 0;
  } else {
    __pyx_t_6 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_4 = __Pyx_UnpackItem(__pyx_t_6, 0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_1 = __Pyx_UnpackItem(__pyx_t_6, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    if (__Pyx_EndUnpack(__pyx_t_6, 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_v_left);
    __pyx_v_left = __pyx_t_4;
    __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_v_right);
    __pyx_v_right = __pyx_t_1;
    __pyx_t_1 = 0;
  }

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":498
 * 
 *         left, right = word.split('-', 1)
 *         left = require_prefix+left if left else u''             # <<<<<<<<<<<<<<
 *         #    ,
 *         # .: -, -
 */
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_left); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 498; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_3) {
    __pyx_t_1 = PyNumber_Add(__pyx_v_require_prefix, __pyx_v_left); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 498; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_5 = __pyx_t_1;
    __pyx_t_1 = 0;
  } else {
    __Pyx_INCREF(((PyObject *)__pyx_kp_u_1));
    __pyx_t_5 = __pyx_kp_u_1;
  }
  __Pyx_DECREF(__pyx_v_left);
  __pyx_v_left = __pyx_t_5;
  __pyx_t_5 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":501
 *         #    ,
 *         # .: -, -
 *         right_forms = self._get_graminfo(right, predict=predict)             # <<<<<<<<<<<<<<
 *         gram = deepcopy(right_forms)
 *         for form in gram:
 */
  __pyx_t_5 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___get_graminfo); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_right);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_right);
  __Pyx_GIVEREF(__pyx_v_right);
  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_4));
  if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__predict), __pyx_v_predict) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_6 = PyEval_CallObjectWithKeywords(__pyx_t_5, __pyx_t_1, ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_v_right_forms);
  __pyx_v_right_forms = __pyx_t_6;
  __pyx_t_6 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":502
 *         # .: -, -
 *         right_forms = self._get_graminfo(right, predict=predict)
 *         gram = deepcopy(right_forms)             # <<<<<<<<<<<<<<
 *         for form in gram:
 *             form['prefixes'] = [left+u'-'] + form.get('prefixes', [])
 */
  __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__deepcopy); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(__pyx_v_right_forms);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_right_forms);
  __Pyx_GIVEREF(__pyx_v_right_forms);
  __pyx_t_1 = PyObject_Call(__pyx_t_6, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_v_gram);
  __pyx_v_gram = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":503
 *         right_forms = self._get_graminfo(right, predict=predict)
 *         gram = deepcopy(right_forms)
 *         for form in gram:             # <<<<<<<<<<<<<<
 *             form['prefixes'] = [left+u'-'] + form.get('prefixes', [])
 *             form['method'] = u'hyphen-prefix(%s).%s' % (left, form['method'])
 */
  if (PyList_CheckExact(__pyx_v_gram) || PyTuple_CheckExact(__pyx_v_gram)) {
    __pyx_t_7 = 0; __pyx_t_1 = __pyx_v_gram; __Pyx_INCREF(__pyx_t_1);
  } else {
    __pyx_t_7 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_gram); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
  }
  for (;;) {
    if (likely(PyList_CheckExact(__pyx_t_1))) {
      if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_1)) break;
      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++;
    } else if (likely(PyTuple_CheckExact(__pyx_t_1))) {
      if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++;
    } else {
      __pyx_t_4 = PyIter_Next(__pyx_t_1);
      if (!__pyx_t_4) {
        if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        break;
      }
      __Pyx_GOTREF(__pyx_t_4);
    }
    __Pyx_DECREF(__pyx_v_form);
    __pyx_v_form = __pyx_t_4;
    __pyx_t_4 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":504
 *         gram = deepcopy(right_forms)
 *         for form in gram:
 *             form['prefixes'] = [left+u'-'] + form.get('prefixes', [])             # <<<<<<<<<<<<<<
 *             form['method'] = u'hyphen-prefix(%s).%s' % (left, form['method'])
 * 
 */
    __pyx_t_4 = PyNumber_Add(__pyx_v_left, ((PyObject *)__pyx_kp_u_20)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_6 = PyList_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(((PyObject *)__pyx_t_6));
    PyList_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_4);
    __pyx_t_4 = 0;
    __pyx_t_4 = PyObject_GetAttr(__pyx_v_form, __pyx_n_s__get); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
    __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_INCREF(((PyObject *)__pyx_n_s__prefixes));
    PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_n_s__prefixes));
    __Pyx_GIVEREF(((PyObject *)__pyx_n_s__prefixes));
    PyTuple_SET_ITEM(__pyx_t_8, 1, ((PyObject *)__pyx_t_5));
    __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
    __pyx_t_5 = 0;
    __pyx_t_5 = PyObject_Call(__pyx_t_4, __pyx_t_8, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_t_8 = PyNumber_Add(((PyObject *)__pyx_t_6), __pyx_t_5); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    if (PyObject_SetItem(__pyx_v_form, ((PyObject *)__pyx_n_s__prefixes), __pyx_t_8) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":505
 *         for form in gram:
 *             form['prefixes'] = [left+u'-'] + form.get('prefixes', [])
 *             form['method'] = u'hyphen-prefix(%s).%s' % (left, form['method'])             # <<<<<<<<<<<<<<
 * 
 *         #      ,
 */
    __pyx_t_8 = PyObject_GetItem(__pyx_v_form, ((PyObject *)__pyx_n_s__method)); if (!__pyx_t_8) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_v_left);
    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_left);
    __Pyx_GIVEREF(__pyx_v_left);
    PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_8);
    __Pyx_GIVEREF(__pyx_t_8);
    __pyx_t_8 = 0;
    __pyx_t_8 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_34), __pyx_t_5); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(((PyObject *)__pyx_t_8));
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    if (PyObject_SetItem(__pyx_v_form, ((PyObject *)__pyx_n_s__method), ((PyObject *)__pyx_t_8)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":511
 *         # 2  ,    .
 *         # .: -, -, -
 *         left_forms = self._get_graminfo(left, require_prefix = require_prefix, predict=predict)             # <<<<<<<<<<<<<<
 *         for left_form in left_forms:
 *             gram_form = GramForm(left_form['info'])
 */
  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___get_graminfo); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  __Pyx_INCREF(__pyx_v_left);
  PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_left);
  __Pyx_GIVEREF(__pyx_v_left);
  __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_5));
  if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__require_prefix), __pyx_v_require_prefix) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (PyDict_SetItem(__pyx_t_5, ((PyObject *)__pyx_n_s__predict), __pyx_v_predict) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_6 = PyEval_CallObjectWithKeywords(__pyx_t_1, __pyx_t_8, ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __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_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_v_left_forms);
  __pyx_v_left_forms = __pyx_t_6;
  __pyx_t_6 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":512
 *         # .: -, -, -
 *         left_forms = self._get_graminfo(left, require_prefix = require_prefix, predict=predict)
 *         for left_form in left_forms:             # <<<<<<<<<<<<<<
 *             gram_form = GramForm(left_form['info'])
 *             gram_form.clear_gender()
 */
  if (PyList_CheckExact(__pyx_v_left_forms) || PyTuple_CheckExact(__pyx_v_left_forms)) {
    __pyx_t_7 = 0; __pyx_t_6 = __pyx_v_left_forms; __Pyx_INCREF(__pyx_t_6);
  } else {
    __pyx_t_7 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_v_left_forms); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
  }
  for (;;) {
    if (likely(PyList_CheckExact(__pyx_t_6))) {
      if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_6)) break;
      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++;
    } else if (likely(PyTuple_CheckExact(__pyx_t_6))) {
      if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
      __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++;
    } else {
      __pyx_t_5 = PyIter_Next(__pyx_t_6);
      if (!__pyx_t_5) {
        if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        break;
      }
      __Pyx_GOTREF(__pyx_t_5);
    }
    __Pyx_DECREF(__pyx_v_left_form);
    __pyx_v_left_form = __pyx_t_5;
    __pyx_t_5 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":513
 *         left_forms = self._get_graminfo(left, require_prefix = require_prefix, predict=predict)
 *         for left_form in left_forms:
 *             gram_form = GramForm(left_form['info'])             # <<<<<<<<<<<<<<
 *             gram_form.clear_gender()
 *             for right_form in right_forms:
 */
    __pyx_t_5 = PyObject_GetItem(__pyx_v_left_form, ((PyObject *)__pyx_n_s__info)); if (!__pyx_t_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 513; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 513; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_5);
    __pyx_t_5 = 0;
    __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_8pymorphy_6_morph_GramForm)), __pyx_t_8, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 513; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_DECREF(((PyObject *)__pyx_v_gram_form));
    __pyx_v_gram_form = ((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_t_5);
    __pyx_t_5 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":514
 *         for left_form in left_forms:
 *             gram_form = GramForm(left_form['info'])
 *             gram_form.clear_gender()             # <<<<<<<<<<<<<<
 *             for right_form in right_forms:
 *                 if right_form['class'] == left_form['class']:
 */
    __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_v_gram_form), __pyx_n_s__clear_gender); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_8 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":515
 *             gram_form = GramForm(left_form['info'])
 *             gram_form.clear_gender()
 *             for right_form in right_forms:             # <<<<<<<<<<<<<<
 *                 if right_form['class'] == left_form['class']:
 *                     if GramForm(right_form['info']).match(gram_form):
 */
    if (PyList_CheckExact(__pyx_v_right_forms) || PyTuple_CheckExact(__pyx_v_right_forms)) {
      __pyx_t_9 = 0; __pyx_t_8 = __pyx_v_right_forms; __Pyx_INCREF(__pyx_t_8);
    } else {
      __pyx_t_9 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_v_right_forms); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
    }
    for (;;) {
      if (likely(PyList_CheckExact(__pyx_t_8))) {
        if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_8)) break;
        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_9); __Pyx_INCREF(__pyx_t_5); __pyx_t_9++;
      } else if (likely(PyTuple_CheckExact(__pyx_t_8))) {
        if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_9); __Pyx_INCREF(__pyx_t_5); __pyx_t_9++;
      } else {
        __pyx_t_5 = PyIter_Next(__pyx_t_8);
        if (!__pyx_t_5) {
          if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          break;
        }
        __Pyx_GOTREF(__pyx_t_5);
      }
      __Pyx_DECREF(__pyx_v_right_form);
      __pyx_v_right_form = __pyx_t_5;
      __pyx_t_5 = 0;

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":516
 *             gram_form.clear_gender()
 *             for right_form in right_forms:
 *                 if right_form['class'] == left_form['class']:             # <<<<<<<<<<<<<<
 *                     if GramForm(right_form['info']).match(gram_form):
 *                         data = {
 */
      __pyx_t_5 = PyObject_GetItem(__pyx_v_right_form, ((PyObject *)__pyx_n_s__class)); if (!__pyx_t_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_1 = PyObject_GetItem(__pyx_v_left_form, ((PyObject *)__pyx_n_s__class)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_4 = PyObject_RichCompare(__pyx_t_5, __pyx_t_1, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      if (__pyx_t_3) {

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":517
 *             for right_form in right_forms:
 *                 if right_form['class'] == left_form['class']:
 *                     if GramForm(right_form['info']).match(gram_form):             # <<<<<<<<<<<<<<
 *                         data = {
 *                             'norm': (require_prefix+left_form['norm'] + u'-' + right_form['norm']).strip('-'),
 */
        __pyx_t_4 = PyObject_GetItem(__pyx_v_right_form, ((PyObject *)__pyx_n_s__info)); if (!__pyx_t_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_4);
        __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_1);
        PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
        __Pyx_GIVEREF(__pyx_t_4);
        __pyx_t_4 = 0;
        __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_8pymorphy_6_morph_GramForm)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_t_10 = ((struct __pyx_vtabstruct_8pymorphy_6_morph_GramForm *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_t_4)->__pyx_vtab)->match(((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_t_4), __pyx_v_gram_form, 0);
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        if (__pyx_t_10) {

          /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":518
 *                 if right_form['class'] == left_form['class']:
 *                     if GramForm(right_form['info']).match(gram_form):
 *                         data = {             # <<<<<<<<<<<<<<
 *                             'norm': (require_prefix+left_form['norm'] + u'-' + right_form['norm']).strip('-'),
 *                             'class': left_form['class'],
 */
          __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(((PyObject *)__pyx_t_4));

          /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":519
 *                     if GramForm(right_form['info']).match(gram_form):
 *                         data = {
 *                             'norm': (require_prefix+left_form['norm'] + u'-' + right_form['norm']).strip('-'),             # <<<<<<<<<<<<<<
 *                             'class': left_form['class'],
 *                             'info': left_form['info'],
 */
          __pyx_t_1 = PyObject_GetItem(__pyx_v_left_form, ((PyObject *)__pyx_n_s__norm)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = PyNumber_Add(__pyx_v_require_prefix, __pyx_t_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_5);
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_1 = PyNumber_Add(__pyx_t_5, ((PyObject *)__pyx_kp_u_20)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __pyx_t_5 = PyObject_GetItem(__pyx_v_right_form, ((PyObject *)__pyx_n_s__norm)); if (!__pyx_t_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_5);
          __pyx_t_11 = PyNumber_Add(__pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_11);
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __pyx_t_5 = PyObject_GetAttr(__pyx_t_11, __pyx_n_s__strip); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_5);
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_11);
          __Pyx_INCREF(((PyObject *)__pyx_kp_s_20));
          PyTuple_SET_ITEM(__pyx_t_11, 0, ((PyObject *)__pyx_kp_s_20));
          __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_20));
          __pyx_t_1 = PyObject_Call(__pyx_t_5, __pyx_t_11, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__norm), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

          /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":520
 *                         data = {
 *                             'norm': (require_prefix+left_form['norm'] + u'-' + right_form['norm']).strip('-'),
 *                             'class': left_form['class'],             # <<<<<<<<<<<<<<
 *                             'info': left_form['info'],
 *                             'lemma': left_form['lemma'] + u'+' + right_form['lemma'],
 */
          __pyx_t_1 = PyObject_GetItem(__pyx_v_left_form, ((PyObject *)__pyx_n_s__class)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 520; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_1);
          if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__class), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

          /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":521
 *                             'norm': (require_prefix+left_form['norm'] + u'-' + right_form['norm']).strip('-'),
 *                             'class': left_form['class'],
 *                             'info': left_form['info'],             # <<<<<<<<<<<<<<
 *                             'lemma': left_form['lemma'] + u'+' + right_form['lemma'],
 *                             'method': u"word-formation(%s + %s)" % (
 */
          __pyx_t_1 = PyObject_GetItem(__pyx_v_left_form, ((PyObject *)__pyx_n_s__info)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_1);
          if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__info), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

          /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":522
 *                             'class': left_form['class'],
 *                             'info': left_form['info'],
 *                             'lemma': left_form['lemma'] + u'+' + right_form['lemma'],             # <<<<<<<<<<<<<<
 *                             'method': u"word-formation(%s + %s)" % (
 *                                            left_form['method'],
 */
          __pyx_t_1 = PyObject_GetItem(__pyx_v_left_form, ((PyObject *)__pyx_n_s__lemma)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 522; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_11 = PyNumber_Add(__pyx_t_1, ((PyObject *)__pyx_kp_u_35)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 522; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_11);
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          __pyx_t_1 = PyObject_GetItem(__pyx_v_right_form, ((PyObject *)__pyx_n_s__lemma)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 522; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_5 = PyNumber_Add(__pyx_t_11, __pyx_t_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 522; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_5);
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
          if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__lemma), __pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;

          /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":524
 *                             'lemma': left_form['lemma'] + u'+' + right_form['lemma'],
 *                             'method': u"word-formation(%s + %s)" % (
 *                                            left_form['method'],             # <<<<<<<<<<<<<<
 *                                            right_form['method'],
 *                                        )
 */
          __pyx_t_5 = PyObject_GetItem(__pyx_v_left_form, ((PyObject *)__pyx_n_s__method)); if (!__pyx_t_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_5);

          /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":525
 *                             'method': u"word-formation(%s + %s)" % (
 *                                            left_form['method'],
 *                                            right_form['method'],             # <<<<<<<<<<<<<<
 *                                        )
 *                         }
 */
          __pyx_t_1 = PyObject_GetItem(__pyx_v_right_form, ((PyObject *)__pyx_n_s__method)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_1);
          __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_11);
          PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_5);
          __Pyx_GIVEREF(__pyx_t_5);
          PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_1);
          __Pyx_GIVEREF(__pyx_t_1);
          __pyx_t_5 = 0;
          __pyx_t_1 = 0;
          __pyx_t_1 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_36), __pyx_t_11); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 523; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__method), ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
          __Pyx_DECREF(((PyObject *)__pyx_v_data));
          __pyx_v_data = __pyx_t_4;
          __pyx_t_4 = 0;

          /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":528
 *                                        )
 *                         }
 *                         gram.append(data)             # <<<<<<<<<<<<<<
 *         return gram
 * 
 */
          __pyx_t_4 = __Pyx_PyObject_Append(__pyx_v_gram, ((PyObject *)__pyx_v_data)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          __Pyx_GOTREF(__pyx_t_4);
          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
          goto __pyx_L14;
        }
        __pyx_L14:;
        goto __pyx_L13;
      }
      __pyx_L13:;
    }
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  }
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":529
 *                         }
 *                         gram.append(data)
 *         return gram             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_gram);
  __pyx_r = __pyx_v_gram;
  goto __pyx_L0;

  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  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_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_AddTraceback("pymorphy._morph.Morph._predict_hyphenated");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_gram);
  __Pyx_DECREF(__pyx_v_left);
  __Pyx_DECREF(__pyx_v_right);
  __Pyx_DECREF(__pyx_v_right_forms);
  __Pyx_DECREF(__pyx_v_form);
  __Pyx_DECREF(__pyx_v_left_forms);
  __Pyx_DECREF(__pyx_v_left_form);
  __Pyx_DECREF((PyObject *)__pyx_v_gram_form);
  __Pyx_DECREF(__pyx_v_right_form);
  __Pyx_DECREF(__pyx_v_data);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":532
 * 
 * 
 *     def _predict_by_prefix_graminfo(self, word, require_prefix):             # <<<<<<<<<<<<<<
 *         """
 *             .     ,
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__predict_by_prefix_graminfo(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_5Morph__predict_by_prefix_graminfo[] = " \320\237\321\200\320\265\320\264\321\201\320\272\320\260\320\267\320\260\321\202\321\214 \320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\321\203\321\216 \321\204\320\276\321\200\320\274\321\203 \320\275\320\265\320\270\320\267\320\262\320\265\321\201\321\202\320\275\320\276\320\263\320\276 \321\201\320\273\320\276\320\262\320\260 \320\277\320\276\n            \320\277\321\200\320\265\321\204\320\270\320\272\321\201\321\203. \320\225\321\201\320\273\320\270 \321\201\320\273\320\276\320\262\320\260 \320\276\321\202\320\273\320\270\321\207\320\260\321\216\321\202\321\201\321\217 \321\202\320\276\320\273\321\214\320\272\320\276 \321\202\320\265\320\274, \321\207\321\202\320\276 \320\272 \320\276\320\264\320\275\320\276\320\274\321\203 \320\270\320\267 \320\275\320\270\321\205\n            \320\277\321\200\320\270\320\277\320\270\321\201\320\260\320\275\320\276 \321\207\321\202\320\276-\321\202\320\276 \321\201\320\277\320\265\321\200\320\265\320\264\320\270, \321\202\320\276, \321\201\320\272\320\276\321\200\320\265\320\265 \320\262\321\201\320\265\320\263\320\276, \321\201\320\272\320\273\320\276\320\275\321\217\321\202\321\214\321\201\321\217 \320\276\320\275\320\270 \320\261\321\203\320\264\321\203\321\202\n            \320\276\320\264\320\275\320\260\320\272\320\276\320\262\320\276. \320\237\321\200\320\276\320\261\321\203\320\265\320\274 \321\201\320\275\320\260\321\207\320\260\320\273\320\260 \320\276\320\264\320\275\321\203 \320\277\320\265\321\200\320\262\321\203\321\216 \320\261\321\203\320\272\320\262\321\203 \321\201\320\273\320\276\320\262\320\260 \321\201\321\207\320\270\321\202\320\260\321\202\321\214 \320\277\321\200\320\265\321\204\320\270\320\272\321\201\320\276\320\274,\n            \320\277\320\276\321\202\320\276\320\274 2 \320\277\320\265\321\200\320\262\321\213\321\205 \320\261\321\203\320\272\320\262\321\213 \320\270 \321\202.\320\264. \320\220 \321\202\320\276, \321\207\321\202\320\276 \320\276\32""1\201\321\202\320\260\320\273\320\276\321\201\321\214, \320\277\320\265\321\200\320\265\320\264\320\260\320\265\320\274\n            \320\274\320\276\321\200\321\204\320\276\320\273\320\276\320\263\320\270\321\207\320\265\321\201\320\272\320\276\320\274\321\203 \320\260\320\275\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\321\203.\n        ";
static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__predict_by_prefix_graminfo(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_word = 0;
  PyObject *__pyx_v_require_prefix = 0;
  PyObject *__pyx_v_gram;
  PyObject *__pyx_v_split_indexes;
  PyObject *__pyx_v_variants;
  PyObject *__pyx_v_prefix;
  PyObject *__pyx_v_suffix;
  PyObject *__pyx_v_base_forms;
  PyObject *__pyx_v_form;
  PyObject *__pyx_v_i;
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  int __pyx_t_2;
  Py_ssize_t __pyx_t_3;
  Py_ssize_t __pyx_t_4;
  int __pyx_t_5;
  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;
  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__require_prefix,0};
  __Pyx_RefNannySetupContext("_predict_by_prefix_graminfo");
  if (unlikely(__pyx_kwds)) {
    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
    PyObject* values[2] = {0,0};
    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;
    }
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  0:
      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word);
      if (likely(values[0])) kw_args--;
      else goto __pyx_L5_argtuple_error;
      case  1:
      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__require_prefix);
      if (likely(values[1])) kw_args--;
      else {
        __Pyx_RaiseArgtupleInvalid("_predict_by_prefix_graminfo", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    }
    if (unlikely(kw_args > 0)) {
      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "_predict_by_prefix_graminfo") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    }
    __pyx_v_word = values[0];
    __pyx_v_require_prefix = values[1];
  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
    goto __pyx_L5_argtuple_error;
  } else {
    __pyx_v_word = PyTuple_GET_ITEM(__pyx_args, 0);
    __pyx_v_require_prefix = PyTuple_GET_ITEM(__pyx_args, 1);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_predict_by_prefix_graminfo", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("pymorphy._morph.Morph._predict_by_prefix_graminfo");
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_v_gram = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_split_indexes = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_variants = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_prefix = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_suffix = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_base_forms = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_form = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_i = Py_None; __Pyx_INCREF(Py_None);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":540
 *              .
 *         """
 *         gram=[]             # <<<<<<<<<<<<<<
 *         if not self.predict_by_prefix:
 *             return gram
 */
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
  __Pyx_DECREF(((PyObject *)__pyx_v_gram));
  __pyx_v_gram = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":541
 *         """
 *         gram=[]
 *         if not self.predict_by_prefix:             # <<<<<<<<<<<<<<
 *             return gram
 * 
 */
  __pyx_t_2 = (!((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->predict_by_prefix);
  if (__pyx_t_2) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":542
 *         gram=[]
 *         if not self.predict_by_prefix:
 *             return gram             # <<<<<<<<<<<<<<
 * 
 *         #
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(((PyObject *)__pyx_v_gram));
    __pyx_r = ((PyObject *)__pyx_v_gram);
    goto __pyx_L0;
    goto __pyx_L6;
  }
  __pyx_L6:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":546
 *         #
 *         split_indexes = range(1, 1+min(self.prediction_max_prefix_len,
 *                                        len(word)-self.prediction_min_suffix_len))             # <<<<<<<<<<<<<<
 *         variants = [(word[:i], word[i:]) for i in split_indexes]
 *         for (prefix, suffix) in variants:
 */
  __pyx_t_3 = PyObject_Length(__pyx_v_word); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 546; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_4 = (__pyx_t_3 - ((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->prediction_min_suffix_len);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":545
 * 
 *         #
 *         split_indexes = range(1, 1+min(self.prediction_max_prefix_len,             # <<<<<<<<<<<<<<
 *                                        len(word)-self.prediction_min_suffix_len))
 *         variants = [(word[:i], word[i:]) for i in split_indexes]
 */
  __pyx_t_5 = ((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->prediction_max_prefix_len;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":546
 *         #
 *         split_indexes = range(1, 1+min(self.prediction_max_prefix_len,
 *                                        len(word)-self.prediction_min_suffix_len))             # <<<<<<<<<<<<<<
 *         variants = [(word[:i], word[i:]) for i in split_indexes]
 *         for (prefix, suffix) in variants:
 */
  if ((__pyx_t_4 < __pyx_t_5)) {
    __pyx_t_3 = __pyx_t_4;
  } else {
    __pyx_t_3 = __pyx_t_5;
  }
  __pyx_t_1 = PyInt_FromSsize_t((1 + __pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_INCREF(__pyx_int_1);
  PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_int_1);
  __Pyx_GIVEREF(__pyx_int_1);
  PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyObject_Call(__pyx_builtin_range, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_v_split_indexes);
  __pyx_v_split_indexes = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":547
 *         split_indexes = range(1, 1+min(self.prediction_max_prefix_len,
 *                                        len(word)-self.prediction_min_suffix_len))
 *         variants = [(word[:i], word[i:]) for i in split_indexes]             # <<<<<<<<<<<<<<
 *         for (prefix, suffix) in variants:
 *             #  , ,   -
 */
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
  if (PyList_CheckExact(__pyx_v_split_indexes) || PyTuple_CheckExact(__pyx_v_split_indexes)) {
    __pyx_t_3 = 0; __pyx_t_6 = __pyx_v_split_indexes; __Pyx_INCREF(__pyx_t_6);
  } else {
    __pyx_t_3 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_v_split_indexes); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
  }
  for (;;) {
    if (likely(PyList_CheckExact(__pyx_t_6))) {
      if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_6)) break;
      __pyx_t_7 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_3); __Pyx_INCREF(__pyx_t_7); __pyx_t_3++;
    } else if (likely(PyTuple_CheckExact(__pyx_t_6))) {
      if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
      __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_3); __Pyx_INCREF(__pyx_t_7); __pyx_t_3++;
    } else {
      __pyx_t_7 = PyIter_Next(__pyx_t_6);
      if (!__pyx_t_7) {
        if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        break;
      }
      __Pyx_GOTREF(__pyx_t_7);
    }
    __Pyx_DECREF(__pyx_v_i);
    __pyx_v_i = __pyx_t_7;
    __pyx_t_7 = 0;
    __pyx_t_4 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_4 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_7 = PySequence_GetSlice(__pyx_v_word, 0, __pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_4 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_4 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_8 = PySequence_GetSlice(__pyx_v_word, __pyx_t_4, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_9);
    PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7);
    __Pyx_GIVEREF(__pyx_t_7);
    PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8);
    __Pyx_GIVEREF(__pyx_t_8);
    __pyx_t_7 = 0;
    __pyx_t_8 = 0;
    if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_9))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  }
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_INCREF(((PyObject *)__pyx_t_1));
  __Pyx_DECREF(((PyObject *)__pyx_v_variants));
  __pyx_v_variants = __pyx_t_1;
  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":548
 *                                        len(word)-self.prediction_min_suffix_len))
 *         variants = [(word[:i], word[i:]) for i in split_indexes]
 *         for (prefix, suffix) in variants:             # <<<<<<<<<<<<<<
 *             #  , ,   -
 *             base_forms = self._get_graminfo(suffix,
 */
  if (likely(((PyObject *)__pyx_v_variants) != Py_None)) {
    __pyx_t_3 = 0; __pyx_t_1 = ((PyObject *)__pyx_v_variants); __Pyx_INCREF(__pyx_t_1);
  } else {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  for (;;) {
    if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break;
    __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_6); __pyx_t_3++;
    if (PyTuple_CheckExact(__pyx_t_6) && likely(PyTuple_GET_SIZE(__pyx_t_6) == 2)) {
      PyObject* tuple = __pyx_t_6;
      __pyx_t_9 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_t_9);
      __pyx_t_8 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_v_prefix);
      __pyx_v_prefix = __pyx_t_9;
      __pyx_t_9 = 0;
      __Pyx_DECREF(__pyx_v_suffix);
      __pyx_v_suffix = __pyx_t_8;
      __pyx_t_8 = 0;
    } else {
      __pyx_t_7 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_t_9 = __Pyx_UnpackItem(__pyx_t_7, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_9);
      __pyx_t_8 = __Pyx_UnpackItem(__pyx_t_7, 1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      if (__Pyx_EndUnpack(__pyx_t_7, 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_DECREF(__pyx_v_prefix);
      __pyx_v_prefix = __pyx_t_9;
      __pyx_t_9 = 0;
      __Pyx_DECREF(__pyx_v_suffix);
      __pyx_v_suffix = __pyx_t_8;
      __pyx_t_8 = 0;
    }

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":550
 *         for (prefix, suffix) in variants:
 *             #  , ,   -
 *             base_forms = self._get_graminfo(suffix,             # <<<<<<<<<<<<<<
 *                                             require_prefix=require_prefix,
 *                                             predict=False,
 */
    __pyx_t_6 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___get_graminfo); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_INCREF(__pyx_v_suffix);
    PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_suffix);
    __Pyx_GIVEREF(__pyx_v_suffix);
    __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(((PyObject *)__pyx_t_9));

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":551
 *             #  , ,   -
 *             base_forms = self._get_graminfo(suffix,
 *                                             require_prefix=require_prefix,             # <<<<<<<<<<<<<<
 *                                             predict=False,
 *                                             predict_EE = False)
 */
    if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__require_prefix), __pyx_v_require_prefix) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":552
 *             base_forms = self._get_graminfo(suffix,
 *                                             require_prefix=require_prefix,
 *                                             predict=False,             # <<<<<<<<<<<<<<
 *                                             predict_EE = False)
 * 
 */
    __pyx_t_7 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 552; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__predict), __pyx_t_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":553
 *                                             require_prefix=require_prefix,
 *                                             predict=False,
 *                                             predict_EE = False)             # <<<<<<<<<<<<<<
 * 
 *             #
 */
    __pyx_t_7 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 553; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    if (PyDict_SetItem(__pyx_t_9, ((PyObject *)__pyx_n_s__predict_EE), __pyx_t_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_7 = PyEval_CallObjectWithKeywords(__pyx_t_6, __pyx_t_8, ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 550; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_v_base_forms);
    __pyx_v_base_forms = __pyx_t_7;
    __pyx_t_7 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":556
 * 
 *             #
 *             base_forms = [form for form in base_forms             # <<<<<<<<<<<<<<
 *                           if form['class'] in PRODUCTIVE_CLASSES]
 * 
 */
    __pyx_t_7 = PyList_New(0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(((PyObject *)__pyx_t_7));

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":557
 *             #
 *             base_forms = [form for form in base_forms
 *                           if form['class'] in PRODUCTIVE_CLASSES]             # <<<<<<<<<<<<<<
 * 
 *             #
 */
    if (PyList_CheckExact(__pyx_v_base_forms) || PyTuple_CheckExact(__pyx_v_base_forms)) {
      __pyx_t_4 = 0; __pyx_t_9 = __pyx_v_base_forms; __Pyx_INCREF(__pyx_t_9);
    } else {
      __pyx_t_4 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_v_base_forms); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_9);
    }
    for (;;) {

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":556
 * 
 *             #
 *             base_forms = [form for form in base_forms             # <<<<<<<<<<<<<<
 *                           if form['class'] in PRODUCTIVE_CLASSES]
 * 
 */
      if (likely(PyList_CheckExact(__pyx_t_9))) {
        if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_9)) break;
        __pyx_t_8 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_4); __Pyx_INCREF(__pyx_t_8); __pyx_t_4++;
      } else if (likely(PyTuple_CheckExact(__pyx_t_9))) {
        if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
        __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_4); __Pyx_INCREF(__pyx_t_8); __pyx_t_4++;
      } else {
        __pyx_t_8 = PyIter_Next(__pyx_t_9);
        if (!__pyx_t_8) {
          if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          break;
        }
        __Pyx_GOTREF(__pyx_t_8);
      }
      __Pyx_DECREF(__pyx_v_form);
      __pyx_v_form = __pyx_t_8;
      __pyx_t_8 = 0;

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":557
 *             #
 *             base_forms = [form for form in base_forms
 *                           if form['class'] in PRODUCTIVE_CLASSES]             # <<<<<<<<<<<<<<
 * 
 *             #
 */
      __pyx_t_8 = PyObject_GetItem(__pyx_v_form, ((PyObject *)__pyx_n_s__class)); if (!__pyx_t_8) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 557; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__PRODUCTIVE_CLASSES); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 557; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_2 = ((PySequence_Contains(__pyx_t_6, __pyx_t_8))); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 557; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      if (__pyx_t_2) {

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":556
 * 
 *             #
 *             base_forms = [form for form in base_forms             # <<<<<<<<<<<<<<
 *                           if form['class'] in PRODUCTIVE_CLASSES]
 * 
 */
        if (unlikely(PyList_Append(__pyx_t_7, (PyObject*)__pyx_v_form))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        goto __pyx_L13;
      }
      __pyx_L13:;
    }
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_INCREF(((PyObject *)__pyx_t_7));
    __Pyx_DECREF(__pyx_v_base_forms);
    __pyx_v_base_forms = ((PyObject *)__pyx_t_7);
    __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":560
 * 
 *             #
 *             for form in base_forms:             # <<<<<<<<<<<<<<
 *                 form['prefixes'] = [prefix] + form.get('prefixes', [])
 *                 form['method'] = u'predict-prefix(%s).%s' % (prefix, form['method'])
 */
    if (PyList_CheckExact(__pyx_v_base_forms) || PyTuple_CheckExact(__pyx_v_base_forms)) {
      __pyx_t_4 = 0; __pyx_t_7 = __pyx_v_base_forms; __Pyx_INCREF(__pyx_t_7);
    } else {
      __pyx_t_4 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_v_base_forms); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 560; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
    }
    for (;;) {
      if (likely(PyList_CheckExact(__pyx_t_7))) {
        if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_7)) break;
        __pyx_t_9 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_4); __Pyx_INCREF(__pyx_t_9); __pyx_t_4++;
      } else if (likely(PyTuple_CheckExact(__pyx_t_7))) {
        if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
        __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_4); __Pyx_INCREF(__pyx_t_9); __pyx_t_4++;
      } else {
        __pyx_t_9 = PyIter_Next(__pyx_t_7);
        if (!__pyx_t_9) {
          if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 560; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          break;
        }
        __Pyx_GOTREF(__pyx_t_9);
      }
      __Pyx_DECREF(__pyx_v_form);
      __pyx_v_form = __pyx_t_9;
      __pyx_t_9 = 0;

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":561
 *             #
 *             for form in base_forms:
 *                 form['prefixes'] = [prefix] + form.get('prefixes', [])             # <<<<<<<<<<<<<<
 *                 form['method'] = u'predict-prefix(%s).%s' % (prefix, form['method'])
 *             gram.extend(base_forms)
 */
      __pyx_t_9 = PyList_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(((PyObject *)__pyx_t_9));
      __Pyx_INCREF(__pyx_v_prefix);
      PyList_SET_ITEM(__pyx_t_9, 0, __pyx_v_prefix);
      __Pyx_GIVEREF(__pyx_v_prefix);
      __pyx_t_6 = PyObject_GetAttr(__pyx_v_form, __pyx_n_s__get); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_8 = PyList_New(0); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(((PyObject *)__pyx_t_8));
      __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_10);
      __Pyx_INCREF(((PyObject *)__pyx_n_s__prefixes));
      PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_n_s__prefixes));
      __Pyx_GIVEREF(((PyObject *)__pyx_n_s__prefixes));
      PyTuple_SET_ITEM(__pyx_t_10, 1, ((PyObject *)__pyx_t_8));
      __Pyx_GIVEREF(((PyObject *)__pyx_t_8));
      __pyx_t_8 = 0;
      __pyx_t_8 = PyObject_Call(__pyx_t_6, __pyx_t_10, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
      __pyx_t_10 = PyNumber_Add(((PyObject *)__pyx_t_9), __pyx_t_8); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_10);
      __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      if (PyObject_SetItem(__pyx_v_form, ((PyObject *)__pyx_n_s__prefixes), __pyx_t_10) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":562
 *             for form in base_forms:
 *                 form['prefixes'] = [prefix] + form.get('prefixes', [])
 *                 form['method'] = u'predict-prefix(%s).%s' % (prefix, form['method'])             # <<<<<<<<<<<<<<
 *             gram.extend(base_forms)
 *         return gram
 */
      __pyx_t_10 = PyObject_GetItem(__pyx_v_form, ((PyObject *)__pyx_n_s__method)); if (!__pyx_t_10) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_10);
      __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_INCREF(__pyx_v_prefix);
      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_prefix);
      __Pyx_GIVEREF(__pyx_v_prefix);
      PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_10);
      __Pyx_GIVEREF(__pyx_t_10);
      __pyx_t_10 = 0;
      __pyx_t_10 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_37), __pyx_t_8); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(((PyObject *)__pyx_t_10));
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      if (PyObject_SetItem(__pyx_v_form, ((PyObject *)__pyx_n_s__method), ((PyObject *)__pyx_t_10)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
    }
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":563
 *                 form['prefixes'] = [prefix] + form.get('prefixes', [])
 *                 form['method'] = u'predict-prefix(%s).%s' % (prefix, form['method'])
 *             gram.extend(base_forms)             # <<<<<<<<<<<<<<
 *         return gram
 * 
 */
    __pyx_t_7 = PyObject_GetAttr(((PyObject *)__pyx_v_gram), __pyx_n_s__extend); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_10);
    __Pyx_INCREF(__pyx_v_base_forms);
    PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_base_forms);
    __Pyx_GIVEREF(__pyx_v_base_forms);
    __pyx_t_8 = PyObject_Call(__pyx_t_7, __pyx_t_10, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":564
 *                 form['method'] = u'predict-prefix(%s).%s' % (prefix, form['method'])
 *             gram.extend(base_forms)
 *         return gram             # <<<<<<<<<<<<<<
 * 
 *     def _handle_EE(self, word, require_prefix):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_gram));
  __pyx_r = ((PyObject *)__pyx_v_gram);
  goto __pyx_L0;

  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_AddTraceback("pymorphy._morph.Morph._predict_by_prefix_graminfo");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_gram);
  __Pyx_DECREF(__pyx_v_split_indexes);
  __Pyx_DECREF(__pyx_v_variants);
  __Pyx_DECREF(__pyx_v_prefix);
  __Pyx_DECREF(__pyx_v_suffix);
  __Pyx_DECREF(__pyx_v_base_forms);
  __Pyx_DECREF(__pyx_v_form);
  __Pyx_DECREF(__pyx_v_i);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":566
 *         return gram
 * 
 *     def _handle_EE(self, word, require_prefix):             # <<<<<<<<<<<<<<
 *         '''   .  ,
 *              ,       .  ,
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__handle_EE(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_5Morph__handle_EE[] = " \320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260 \320\261\321\203\320\272\320\262\321\213 \320\201. \320\237\321\200\320\276\320\261\321\203\320\265\320\274 \320\277\321\200\320\276\320\262\320\265\321\200\320\270\321\202\321\214, \320\275\320\265 \320\277\320\276\320\273\321\203\321\207\320\270\321\202\321\201\321\217 \320\273\320\270 \320\276\320\277\321\200\320\265\320\264\320\265\320\273\320\270\321\202\321\214\n            \320\264\320\260\320\275\320\275\321\213\320\265 \321\201\320\273\320\276\320\262\320\260, \320\265\321\201\320\273\320\270 \320\262 \320\275\320\265\320\274 \320\225 \320\267\320\260\320\274\320\265\320\275\320\270\321\202\321\214 \320\275\320\260 \320\201. \320\225\321\201\320\273\320\270 \320\277\320\276\320\273\321\203\321\207\320\270\320\273\320\276\321\201\321\214,\n            \321\200\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202 \320\262\320\276\320\267\320\262\321\200\320\260\321\211\320\260\320\265\320\274 \320\262\321\201\320\265-\321\202\320\260\320\272\320\270 \321\201 \320\225.\n\n            \320\221\321\203\320\272\320\262\321\213 \320\201 \320\275\320\260 \320\225 \320\262 \321\201\320\273\320\276\320\262\320\260\321\200\321\217\321\205 \320\274\320\276\320\266\320\275\320\276 \320\267\320\260\320\274\320\265\320\275\320\270\321\202\321\214 \320\275\320\260 \321\215\321\202\320\260\320\277\320\265 \320\272\320\276\320\264\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217\n            \321\201\320\273\320\276\320\262\320\260\321\200\320\265\320\271 (\321\215\321\202\320\276 \320\277\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265 \320\277\320\276 \321\203\320\274\320\276\320\273\321\207\320\260\320\275\320\270\321\216). \320\222\321\201\320\265 \321\200\320\260\320\262\320\275\320\276 \320\262 \321\201\320\273\320\276\320\262\320\260\321\200\321\217\321\205\n            \320\277\320\276\320\264\320\264\320\265\321\200\320\266\320\272\320\260 \320\201 \32""0\275\320\265 \320\264\320\276 \320\272\320\276\320\275\321\206\320\260 \320\277\320\276\320\273\320\275\320\260\321\217.\n        ";
static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__handle_EE(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_word = 0;
  PyObject *__pyx_v_require_prefix = 0;
  PyObject *__pyx_v_gram;
  PyObject *__pyx_v_info;
  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;
  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__require_prefix,0};
  __Pyx_RefNannySetupContext("_handle_EE");
  if (unlikely(__pyx_kwds)) {
    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
    PyObject* values[2] = {0,0};
    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;
    }
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  0:
      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word);
      if (likely(values[0])) kw_args--;
      else goto __pyx_L5_argtuple_error;
      case  1:
      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__require_prefix);
      if (likely(values[1])) kw_args--;
      else {
        __Pyx_RaiseArgtupleInvalid("_handle_EE", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    }
    if (unlikely(kw_args > 0)) {
      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "_handle_EE") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    }
    __pyx_v_word = values[0];
    __pyx_v_require_prefix = values[1];
  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
    goto __pyx_L5_argtuple_error;
  } else {
    __pyx_v_word = PyTuple_GET_ITEM(__pyx_args, 0);
    __pyx_v_require_prefix = PyTuple_GET_ITEM(__pyx_args, 1);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_handle_EE", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 566; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("pymorphy._morph.Morph._handle_EE");
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_v_gram = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_info = Py_None; __Pyx_INCREF(Py_None);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":575
 *                  .
 *         '''
 *         gram = self._get_graminfo(word.replace(u'', u''), require_prefix,             # <<<<<<<<<<<<<<
 *                                   predict_EE = False)
 *         for info in gram:
 */
  __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___get_graminfo); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyObject_GetAttr(__pyx_v_word, __pyx_n_s__replace); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(((PyObject *)__pyx_n_u_38));
  PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_n_u_38));
  __Pyx_GIVEREF(((PyObject *)__pyx_n_u_38));
  __Pyx_INCREF(((PyObject *)__pyx_n_u_39));
  PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_n_u_39));
  __Pyx_GIVEREF(((PyObject *)__pyx_n_u_39));
  __pyx_t_4 = PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 575; __pyx_clineno = __LINE__; goto __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;
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_4);
  __Pyx_INCREF(__pyx_v_require_prefix);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_require_prefix);
  __Pyx_GIVEREF(__pyx_v_require_prefix);
  __pyx_t_4 = 0;
  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_4));

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":576
 *         '''
 *         gram = self._get_graminfo(word.replace(u'', u''), require_prefix,
 *                                   predict_EE = False)             # <<<<<<<<<<<<<<
 *         for info in gram:
 *             info['method'] = info['method'].replace(u'', u'')
 */
  __pyx_t_2 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_4, ((PyObject *)__pyx_n_s__predict_EE), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 575; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyEval_CallObjectWithKeywords(__pyx_t_1, __pyx_t_3, ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 575; __pyx_clineno = __LINE__; goto __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(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_v_gram);
  __pyx_v_gram = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":577
 *         gram = self._get_graminfo(word.replace(u'', u''), require_prefix,
 *                                   predict_EE = False)
 *         for info in gram:             # <<<<<<<<<<<<<<
 *             info['method'] = info['method'].replace(u'', u'')
 *         return gram
 */
  if (PyList_CheckExact(__pyx_v_gram) || PyTuple_CheckExact(__pyx_v_gram)) {
    __pyx_t_5 = 0; __pyx_t_2 = __pyx_v_gram; __Pyx_INCREF(__pyx_t_2);
  } else {
    __pyx_t_5 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_gram); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 577; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
  }
  for (;;) {
    if (likely(PyList_CheckExact(__pyx_t_2))) {
      if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_2)) break;
      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++;
    } else if (likely(PyTuple_CheckExact(__pyx_t_2))) {
      if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++;
    } else {
      __pyx_t_4 = PyIter_Next(__pyx_t_2);
      if (!__pyx_t_4) {
        if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 577; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        break;
      }
      __Pyx_GOTREF(__pyx_t_4);
    }
    __Pyx_DECREF(__pyx_v_info);
    __pyx_v_info = __pyx_t_4;
    __pyx_t_4 = 0;

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":578
 *                                   predict_EE = False)
 *         for info in gram:
 *             info['method'] = info['method'].replace(u'', u'')             # <<<<<<<<<<<<<<
 *         return gram
 * 
 */
    __pyx_t_4 = PyObject_GetItem(__pyx_v_info, ((PyObject *)__pyx_n_s__method)); if (!__pyx_t_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__replace); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_INCREF(((PyObject *)__pyx_n_u_39));
    PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_n_u_39));
    __Pyx_GIVEREF(((PyObject *)__pyx_n_u_39));
    __Pyx_INCREF(((PyObject *)__pyx_n_u_38));
    PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_n_u_38));
    __Pyx_GIVEREF(((PyObject *)__pyx_n_u_38));
    __pyx_t_1 = PyObject_Call(__pyx_t_3, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (PyObject_SetItem(__pyx_v_info, ((PyObject *)__pyx_n_s__method), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":579
 *         for info in gram:
 *             info['method'] = info['method'].replace(u'', u'')
 *         return gram             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_gram);
  __pyx_r = __pyx_v_gram;
  goto __pyx_L0;

  __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_AddTraceback("pymorphy._morph.Morph._handle_EE");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_gram);
  __Pyx_DECREF(__pyx_v_info);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":582
 * 
 * 
 *     def _get_graminfo(self, word, require_prefix=u'', predict = True,             # <<<<<<<<<<<<<<
 *                       predict_EE = True, predict_hyphenated=True):
 *         """  .   .
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__get_graminfo(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_5Morph__get_graminfo[] = " \320\237\320\276\320\273\321\203\321\207\320\270\321\202\321\214 \320\263\321\200\320\260\320\274. \320\270\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\216 \320\276 \321\201\320\273\320\276\320\262\320\265.\n            \320\222\320\275\321\203\321\202\321\200\320\265\320\275\320\275\320\270\320\271 \320\262\320\260\321\200\320\270\320\260\320\275\321\202 \320\264\320\273\321\217 \320\277\320\276\320\264\320\264\320\265\321\200\320\266\320\272\320\270 \321\200\320\265\320\272\321\203\321\200\321\201\320\270\320\270 \321\201 \320\262\320\276\320\267\320\274\320\276\320\266\320\275\320\276\321\201\321\202\321\214\321\216 \320\262\321\200\320\265\320\274\320\265\320\275\320\275\320\276\n            \320\276\321\202\320\272\320\273\321\216\321\207\320\260\321\202\321\214 \320\277\321\200\320\265\320\264\321\201\320\272\320\260\320\267\320\260\321\202\320\265\320\273\321\214 \320\270 \320\262\320\276\320\267\320\274\320\276\320\266\320\275\320\276\321\201\321\202\321\214\321\216 \321\202\321\200\320\265\320\261\320\276\320\262\320\260\321\202\321\214 \320\275\320\260\320\273\320\270\321\207\320\270\320\265\n            \320\276\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\275\320\276\320\263\320\276 \320\277\321\200\320\265\321\204\320\270\320\272\321\201\320\260 \321\203 \321\200\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\260.\n        ";
static PyObject *__pyx_pf_8pymorphy_6_morph_5Morph__get_graminfo(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_word = 0;
  PyObject *__pyx_v_require_prefix = 0;
  PyObject *__pyx_v_predict = 0;
  PyObject *__pyx_v_predict_EE = 0;
  PyObject *__pyx_v_predict_hyphenated = 0;
  PyObject *__pyx_v_gram;
  PyObject *__pyx_v_variants;
  PyObject *__pyx_v_lemma;
  PyObject *__pyx_v_suffix;
  PyObject *__pyx_v_info;
  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 = NULL;
  int __pyx_t_7;
  Py_ssize_t __pyx_t_8;
  int __pyx_t_9;
  int __pyx_t_10;
  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__require_prefix,&__pyx_n_s__predict,&__pyx_n_s__predict_EE,&__pyx_n_s__predict_hyphenated,0};
  __Pyx_RefNannySetupContext("_get_graminfo");
  if (unlikely(__pyx_kwds)) {
    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
    PyObject* values[5] = {0,0,0,0,0};
    values[1] = ((PyObject *)__pyx_kp_u_1);
    values[2] = __pyx_k_40;
    values[3] = __pyx_k_41;
    values[4] = __pyx_k_42;
    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);
      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;
    }
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  0:
      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__word);
      if (likely(values[0])) kw_args--;
      else goto __pyx_L5_argtuple_error;
      case  1:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__require_prefix);
        if (value) { values[1] = value; kw_args--; }
      }
      case  2:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__predict);
        if (value) { values[2] = value; kw_args--; }
      }
      case  3:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__predict_EE);
        if (value) { values[3] = value; kw_args--; }
      }
      case  4:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__predict_hyphenated);
        if (value) { values[4] = value; kw_args--; }
      }
    }
    if (unlikely(kw_args > 0)) {
      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "_get_graminfo") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 582; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    }
    __pyx_v_word = values[0];
    __pyx_v_require_prefix = values[1];
    __pyx_v_predict = values[2];
    __pyx_v_predict_EE = values[3];
    __pyx_v_predict_hyphenated = values[4];
  } else {
    __pyx_v_require_prefix = ((PyObject *)__pyx_kp_u_1);
    __pyx_v_predict = __pyx_k_40;
    __pyx_v_predict_EE = __pyx_k_41;
    __pyx_v_predict_hyphenated = __pyx_k_42;
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  5: __pyx_v_predict_hyphenated = PyTuple_GET_ITEM(__pyx_args, 4);
      case  4: __pyx_v_predict_EE = PyTuple_GET_ITEM(__pyx_args, 3);
      case  3: __pyx_v_predict = PyTuple_GET_ITEM(__pyx_args, 2);
      case  2: __pyx_v_require_prefix = PyTuple_GET_ITEM(__pyx_args, 1);
      case  1: __pyx_v_word = PyTuple_GET_ITEM(__pyx_args, 0);
      break;
      default: goto __pyx_L5_argtuple_error;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_get_graminfo", 0, 1, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 582; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("pymorphy._morph.Morph._get_graminfo");
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_v_gram = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_variants = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
  __pyx_v_lemma = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_suffix = Py_None; __Pyx_INCREF(Py_None);
  __pyx_v_info = Py_None; __Pyx_INCREF(Py_None);

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":589
 *                .
 *         """
 *         gram = []             # <<<<<<<<<<<<<<
 * 
 *         #
 */
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 589; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
  __Pyx_DECREF(((PyObject *)__pyx_v_gram));
  __pyx_v_gram = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":592
 * 
 *         #
 *         gram.extend(self._flexion_graminfo(word, require_prefix))             # <<<<<<<<<<<<<<
 * 
 *         #    :    2 ,
 */
  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_gram), __pyx_n_s__extend); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___flexion_graminfo); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_v_word);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_word);
  __Pyx_GIVEREF(__pyx_v_word);
  __Pyx_INCREF(__pyx_v_require_prefix);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_require_prefix);
  __Pyx_GIVEREF(__pyx_v_require_prefix);
  __pyx_t_4 = PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __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;
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __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_4); __pyx_t_4 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":597
 *         #     ,
 *         # (  ,   )
 *         variants = _get_split_variants(word)             # <<<<<<<<<<<<<<
 *         for (lemma, suffix) in variants:
 *             if lemma in self.data.lemmas:
 */
  if (!(likely(PyUnicode_CheckExact(__pyx_v_word))||((__pyx_v_word) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected unicode, got %.200s", Py_TYPE(__pyx_v_word)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_4 = ((PyObject *)__pyx_f_8pymorphy_6_morph__get_split_variants(((PyObject *)__pyx_v_word), 0)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 597; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(((PyObject *)__pyx_v_variants));
  __pyx_v_variants = ((PyObject *)__pyx_t_4);
  __pyx_t_4 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":598
 *         # (  ,   )
 *         variants = _get_split_variants(word)
 *         for (lemma, suffix) in variants:             # <<<<<<<<<<<<<<
 *             if lemma in self.data.lemmas:
 *                 gram.extend(
 */
  if (likely(((PyObject *)__pyx_v_variants) != Py_None)) {
    __pyx_t_5 = 0; __pyx_t_4 = ((PyObject *)__pyx_v_variants); __Pyx_INCREF(__pyx_t_4);
  } else {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  for (;;) {
    if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_4)) break;
    __pyx_t_3 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++;
    if (PyTuple_CheckExact(__pyx_t_3) && likely(PyTuple_GET_SIZE(__pyx_t_3) == 2)) {
      PyObject* tuple = __pyx_t_3;
      __pyx_t_1 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_t_1);
      __pyx_t_2 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_v_lemma);
      __pyx_v_lemma = __pyx_t_1;
      __pyx_t_1 = 0;
      __Pyx_DECREF(__pyx_v_suffix);
      __pyx_v_suffix = __pyx_t_2;
      __pyx_t_2 = 0;
    } else {
      __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_t_1 = __Pyx_UnpackItem(__pyx_t_6, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_2 = __Pyx_UnpackItem(__pyx_t_6, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      if (__Pyx_EndUnpack(__pyx_t_6, 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_v_lemma);
      __pyx_v_lemma = __pyx_t_1;
      __pyx_t_1 = 0;
      __Pyx_DECREF(__pyx_v_suffix);
      __pyx_v_suffix = __pyx_t_2;
      __pyx_t_2 = 0;
    }

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":599
 *         variants = _get_split_variants(word)
 *         for (lemma, suffix) in variants:
 *             if lemma in self.data.lemmas:             # <<<<<<<<<<<<<<
 *                 gram.extend(
 *                     [info for info in
 */
    __pyx_t_3 = PyObject_GetAttr(((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->data, __pyx_n_s__lemmas); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 599; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_7 = ((PySequence_Contains(__pyx_t_3, __pyx_v_lemma))); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 599; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (__pyx_t_7) {

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":600
 *         for (lemma, suffix) in variants:
 *             if lemma in self.data.lemmas:
 *                 gram.extend(             # <<<<<<<<<<<<<<
 *                     [info for info in
 *                         self._get_lemma_graminfo(lemma, suffix, require_prefix,
 */
      __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_gram), __pyx_n_s__extend); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 600; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":601
 *             if lemma in self.data.lemmas:
 *                 gram.extend(
 *                     [info for info in             # <<<<<<<<<<<<<<
 *                         self._get_lemma_graminfo(lemma, suffix, require_prefix,
 *                                                  u'lemma(%s).suffix(%s)')
 */
      __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(((PyObject *)__pyx_t_2));

      /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":602
 *                 gram.extend(
 *                     [info for info in
 *                         self._get_lemma_graminfo(lemma, suffix, require_prefix,             # <<<<<<<<<<<<<<
 *                                                  u'lemma(%s).suffix(%s)')
 *                     ]
 */
      if (!(likely(PyUnicode_CheckExact(__pyx_v_lemma))||((__pyx_v_lemma) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected unicode, got %.200s", Py_TYPE(__pyx_v_lemma)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 602; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      if (!(likely(PyUnicode_CheckExact(__pyx_v_suffix))||((__pyx_v_suffix) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected unicode, got %.200s", Py_TYPE(__pyx_v_suffix)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 602; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      if (!(likely(PyUnicode_CheckExact(__pyx_v_require_prefix))||((__pyx_v_require_prefix) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected unicode, got %.200s", Py_TYPE(__pyx_v_require_prefix)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 602; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_8pymorphy_6_morph_Morph *)((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->__pyx_vtab)->_get_lemma_graminfo(((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self), ((PyObject *)__pyx_v_lemma), ((PyObject *)__pyx_v_suffix), ((PyObject *)__pyx_v_require_prefix), __pyx_kp_u_43, 0)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 602; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      if (likely(__pyx_t_1 != Py_None)) {
        __pyx_t_8 = 0; __pyx_t_6 = __pyx_t_1; __Pyx_INCREF(__pyx_t_6);
      } else {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 602; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      for (;;) {
        if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_6)) break;
        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++;
        __Pyx_DECREF(__pyx_v_info);
        __pyx_v_info = __pyx_t_1;
        __pyx_t_1 = 0;

        /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":601
 *             if lemma in self.data.lemmas:
 *                 gram.extend(
 *                     [info for info in             # <<<<<<<<<<<<<<
 *                         self._get_lemma_graminfo(lemma, suffix, require_prefix,
 *                                                  u'lemma(%s).suffix(%s)')
 */
        if (unlikely(PyList_Append(__pyx_t_2, (PyObject*)__pyx_v_info))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 600; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_INCREF(((PyObject *)__pyx_t_2));
      PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_t_2));
      __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
      __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
      __pyx_t_2 = PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 600; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      goto __pyx_L8;
    }
    __pyx_L8:;
  }
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":608
 * 
 *         #
 *         gram.extend(self._static_prefix_graminfo(variants, require_prefix))             # <<<<<<<<<<<<<<
 * 
 *         #   ,
 */
  __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_gram), __pyx_n_s__extend); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s_44); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_INCREF(((PyObject *)__pyx_v_variants));
  PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_v_variants));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_variants));
  __Pyx_INCREF(__pyx_v_require_prefix);
  PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_v_require_prefix);
  __Pyx_GIVEREF(__pyx_v_require_prefix);
  __pyx_t_3 = PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_3);
  __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_Call(__pyx_t_4, __pyx_t_6, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":611
 * 
 *         #   ,
 *         if not gram and self.handle_EE and predict_EE:             # <<<<<<<<<<<<<<
 *             gram.extend(self._handle_EE(word, require_prefix))
 * 
 */
  __pyx_t_7 = (((PyObject *)__pyx_v_gram) != Py_None) && (PyList_GET_SIZE(((PyObject *)__pyx_v_gram)) != 0);
  __pyx_t_9 = (!__pyx_t_7);
  if (__pyx_t_9) {
    if (((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->handle_EE) {
      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_predict_EE); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_10 = __pyx_t_7;
    } else {
      __pyx_t_10 = ((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->handle_EE;
    }
    __pyx_t_7 = __pyx_t_10;
  } else {
    __pyx_t_7 = __pyx_t_9;
  }
  if (__pyx_t_7) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":612
 *         #   ,
 *         if not gram and self.handle_EE and predict_EE:
 *             gram.extend(self._handle_EE(word, require_prefix))             # <<<<<<<<<<<<<<
 * 
 *         #
 */
    __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_gram), __pyx_n_s__extend); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 612; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_6 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___handle_EE); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 612; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 612; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_v_word);
    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_word);
    __Pyx_GIVEREF(__pyx_v_word);
    __Pyx_INCREF(__pyx_v_require_prefix);
    PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_require_prefix);
    __Pyx_GIVEREF(__pyx_v_require_prefix);
    __pyx_t_2 = PyObject_Call(__pyx_t_6, __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 612; __pyx_clineno = __LINE__; goto __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_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 612; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_2);
    __pyx_t_2 = 0;
    __pyx_t_2 = PyObject_Call(__pyx_t_3, __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 612; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __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_L11;
  }
  __pyx_L11:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":615
 * 
 *         #
 *         if not gram and predict_hyphenated:             # <<<<<<<<<<<<<<
 *             gram.extend(self._predict_hyphenated(word, require_prefix, predict))
 * 
 */
  __pyx_t_7 = (((PyObject *)__pyx_v_gram) != Py_None) && (PyList_GET_SIZE(((PyObject *)__pyx_v_gram)) != 0);
  __pyx_t_9 = (!__pyx_t_7);
  if (__pyx_t_9) {
    __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_predict_hyphenated); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_10 = __pyx_t_7;
  } else {
    __pyx_t_10 = __pyx_t_9;
  }
  if (__pyx_t_10) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":616
 *         #
 *         if not gram and predict_hyphenated:
 *             gram.extend(self._predict_hyphenated(word, require_prefix, predict))             # <<<<<<<<<<<<<<
 * 
 *         #     ,
 */
    __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_gram), __pyx_n_s__extend); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___predict_hyphenated); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_v_word);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_word);
    __Pyx_GIVEREF(__pyx_v_word);
    __Pyx_INCREF(__pyx_v_require_prefix);
    PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_require_prefix);
    __Pyx_GIVEREF(__pyx_v_require_prefix);
    __Pyx_INCREF(__pyx_v_predict);
    PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_predict);
    __Pyx_GIVEREF(__pyx_v_predict);
    __pyx_t_6 = PyObject_Call(__pyx_t_4, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_6 = PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L12;
  }
  __pyx_L12:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":619
 * 
 *         #     ,
 *         if not gram and predict and self.predict_by_prefix:             # <<<<<<<<<<<<<<
 *             gram.extend(self._predict_by_prefix_graminfo(word, require_prefix))
 * 
 */
  __pyx_t_10 = (((PyObject *)__pyx_v_gram) != Py_None) && (PyList_GET_SIZE(((PyObject *)__pyx_v_gram)) != 0);
  __pyx_t_9 = (!__pyx_t_10);
  if (__pyx_t_9) {
    __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_v_predict); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 619; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (__pyx_t_10) {
      __pyx_t_7 = ((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->predict_by_prefix;
    } else {
      __pyx_t_7 = __pyx_t_10;
    }
    __pyx_t_10 = __pyx_t_7;
  } else {
    __pyx_t_10 = __pyx_t_9;
  }
  if (__pyx_t_10) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":620
 *         #     ,
 *         if not gram and predict and self.predict_by_prefix:
 *             gram.extend(self._predict_by_prefix_graminfo(word, require_prefix))             # <<<<<<<<<<<<<<
 * 
 *         #     ,
 */
    __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_gram), __pyx_n_s__extend); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s_45); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_v_word);
    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_word);
    __Pyx_GIVEREF(__pyx_v_word);
    __Pyx_INCREF(__pyx_v_require_prefix);
    PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_require_prefix);
    __Pyx_GIVEREF(__pyx_v_require_prefix);
    __pyx_t_4 = PyObject_Call(__pyx_t_3, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_4);
    __pyx_t_4 = 0;
    __pyx_t_4 = PyObject_Call(__pyx_t_6, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    goto __pyx_L13;
  }
  __pyx_L13:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":623
 * 
 *         #     ,
 *         if not gram and predict and self.predict_by_suffix:             # <<<<<<<<<<<<<<
 *             gram.extend(self._do_predict_by_suffix(word))
 * 
 */
  __pyx_t_10 = (((PyObject *)__pyx_v_gram) != Py_None) && (PyList_GET_SIZE(((PyObject *)__pyx_v_gram)) != 0);
  __pyx_t_9 = (!__pyx_t_10);
  if (__pyx_t_9) {
    __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_v_predict); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (__pyx_t_10) {
      __pyx_t_7 = ((struct __pyx_obj_8pymorphy_6_morph_Morph *)__pyx_v_self)->predict_by_suffix;
    } else {
      __pyx_t_7 = __pyx_t_10;
    }
    __pyx_t_10 = __pyx_t_7;
  } else {
    __pyx_t_10 = __pyx_t_9;
  }
  if (__pyx_t_10) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":624
 *         #     ,
 *         if not gram and predict and self.predict_by_suffix:
 *             gram.extend(self._do_predict_by_suffix(word))             # <<<<<<<<<<<<<<
 * 
 *         return gram
 */
    __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_gram), __pyx_n_s__extend); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_2 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s_46); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_v_word);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_word);
    __Pyx_GIVEREF(__pyx_v_word);
    __pyx_t_3 = PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3);
    __Pyx_GIVEREF(__pyx_t_3);
    __pyx_t_3 = 0;
    __pyx_t_3 = PyObject_Call(__pyx_t_4, __pyx_t_6, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 624; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    goto __pyx_L14;
  }
  __pyx_L14:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":626
 *             gram.extend(self._do_predict_by_suffix(word))
 * 
 *         return gram             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_gram));
  __pyx_r = ((PyObject *)__pyx_v_gram);
  goto __pyx_L0;

  __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_6);
  __Pyx_AddTraceback("pymorphy._morph.Morph._get_graminfo");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_gram);
  __Pyx_DECREF(__pyx_v_variants);
  __Pyx_DECREF(__pyx_v_lemma);
  __Pyx_DECREF(__pyx_v_suffix);
  __Pyx_DECREF(__pyx_v_info);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":629
 * 
 * 
 * def get_morph(path, backend='sqlite', cached=True, **kwargs):             # <<<<<<<<<<<<<<
 *     """
 *          (Morph).
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_get_morph(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8pymorphy_6_morph_get_morph[] = "\n    \320\222\320\265\321\200\320\275\321\203\321\202\321\214 \320\276\320\261\321\212\320\265\320\272\321\202 \321\201 \320\274\320\276\321\200\321\204\320\276\320\273\320\276\320\263\320\270\321\207\320\265\321\201\320\272\320\270\320\274 \320\260\320\275\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\276\320\274 (Morph).\n\n    \320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213:\n\n    * path - \320\277\321\203\321\202\321\214 \320\272 \320\277\320\260\320\277\320\272\320\265 \321\201 \321\204\320\260\320\271\320\273\320\260\320\274\320\270 \321\201\320\273\320\276\320\262\320\260\321\200\320\265\320\271 (\320\270\320\273\320\270 \320\277\320\276\320\273\320\275\320\276\320\265 \320\270\320\274\321\217 \321\204\320\260\320\271\320\273\320\260 \321\201\320\276 \321\201\320\273\320\276\320\262\320\260\321\200\320\265\320\274, \320\262 \321\201\320\273\321\203\321\207\320\260\320\265 pickle)\n    * backend - \321\202\320\270\320\277 \321\201\320\273\320\276\320\262\320\260\321\200\320\265\320\271. \320\234\320\276\320\266\320\265\321\202 \320\261\321\213\321\202\321\214 'shelve', 'tch', 'tcb', 'cdb', 'pickle', 'sqlite'.\n    * cached - \320\272\320\265\321\210\320\270\321\200\320\276\320\262\320\260\321\202\321\214 \320\273\320\270 \320\264\320\260\320\275\320\275\321\213\320\265 \320\262 \320\276\320\277\320\265\321\200\320\260\321\202\320\270\320\262\320\275\320\276\320\271 \320\277\320\260\320\274\321\217\321\202\320\270\n\n    \320\242\320\260\320\272\320\266\320\265 \320\274\320\276\320\266\320\275\320\276 \321\203\320\272\320\260\320\267\321\213\320\262\320\260\321\202\321\214 \320\262\321\201\320\265 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213, \320\272\320\276\321\202\320\276\321\200\321\213\320\265 \320\277\321\200\320\270\320\275\320\270\320\274\320\260\320\265\321\202 \320\272\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200 \320\272\320\273\320\260\321\201\321\201\320\260\n    Morph.\n\n    ";
static PyObject *__pyx_pf_8pymorphy_6_morph_get_morph(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_path = 0;
  PyObject *__pyx_v_backend = 0;
  PyObject *__pyx_v_cached = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__path,&__pyx_n_s__backend,&__pyx_n_s__cached,0};
  __Pyx_RefNannySetupContext("get_morph");
  __pyx_self = __pyx_self;
  __pyx_v_kwargs = PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL;
  __Pyx_GOTREF(__pyx_v_kwargs);
  if (unlikely(__pyx_kwds)) {
    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
    PyObject* values[3] = {0,0,0};
    values[1] = ((PyObject *)__pyx_n_s__sqlite);
    values[2] = __pyx_k_47;
    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);
      case  0: break;
      default: goto __pyx_L5_argtuple_error;
    }
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  0:
      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__path);
      if (likely(values[0])) kw_args--;
      else goto __pyx_L5_argtuple_error;
      case  1:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__backend);
        if (value) { values[1] = value; kw_args--; }
      }
      case  2:
      if (kw_args > 0) {
        PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__cached);
        if (value) { values[2] = value; kw_args--; }
      }
    }
    if (unlikely(kw_args > 0)) {
      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, __pyx_v_kwargs, values, PyTuple_GET_SIZE(__pyx_args), "get_morph") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    }
    __pyx_v_path = values[0];
    __pyx_v_backend = values[1];
    __pyx_v_cached = values[2];
  } else {
    __pyx_v_backend = ((PyObject *)__pyx_n_s__sqlite);
    __pyx_v_cached = __pyx_k_47;
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  3: __pyx_v_cached = PyTuple_GET_ITEM(__pyx_args, 2);
      case  2: __pyx_v_backend = PyTuple_GET_ITEM(__pyx_args, 1);
      case  1: __pyx_v_path = PyTuple_GET_ITEM(__pyx_args, 0);
      break;
      default: goto __pyx_L5_argtuple_error;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("get_morph", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_DECREF(__pyx_v_kwargs);
  __Pyx_AddTraceback("pymorphy._morph.get_morph");
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":643
 * 
 *     """
 *     if backend == 'pickle':             # <<<<<<<<<<<<<<
 *         return Morph(PickleDataSource(path), **kwargs)
 *     return Morph(ShelveDataSource(path, backend, cached=cached), **kwargs)
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_backend, ((PyObject *)__pyx_n_s__pickle), Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 643; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 643; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_2) {

    /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":644
 *     """
 *     if backend == 'pickle':
 *         return Morph(PickleDataSource(path), **kwargs)             # <<<<<<<<<<<<<<
 *     return Morph(ShelveDataSource(path, backend, cached=cached), **kwargs)
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__PickleDataSource); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_v_path);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_path);
    __Pyx_GIVEREF(__pyx_v_path);
    __pyx_t_4 = PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; __pyx_clineno = __LINE__; goto __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_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_4);
    __pyx_t_4 = 0;
    __pyx_t_4 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_8pymorphy_6_morph_Morph)), __pyx_t_3, ((PyObject *)__pyx_v_kwargs)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 644; __pyx_clineno = __LINE__; goto __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;
    goto __pyx_L6;
  }
  __pyx_L6:;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":645
 *     if backend == 'pickle':
 *         return Morph(PickleDataSource(path), **kwargs)
 *     return Morph(ShelveDataSource(path, backend, cached=cached), **kwargs)             # <<<<<<<<<<<<<<
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__ShelveDataSource); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_v_path);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_path);
  __Pyx_GIVEREF(__pyx_v_path);
  __Pyx_INCREF(__pyx_v_backend);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_backend);
  __Pyx_GIVEREF(__pyx_v_backend);
  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__cached), __pyx_v_cached) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_5 = PyEval_CallObjectWithKeywords(__pyx_t_4, __pyx_t_3, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_5);
  __pyx_t_5 = 0;
  __pyx_t_5 = PyEval_CallObjectWithKeywords(((PyObject *)((PyObject*)__pyx_ptype_8pymorphy_6_morph_Morph)), __pyx_t_1, ((PyObject *)__pyx_v_kwargs)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_5;
  __pyx_t_5 = 0;
  goto __pyx_L0;

  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("pymorphy._morph.get_morph");
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_DECREF(__pyx_v_kwargs);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.pxd":11
 * 
 * cdef class GramForm(object):
 *     cpdef public set form             # <<<<<<<<<<<<<<
 *     cpdef public set denied_form
 * 
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_4form___get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_4form___get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannySetupContext("__get__");
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form));
  __pyx_r = ((PyObject *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form);
  goto __pyx_L0;

  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8pymorphy_6_morph_8GramForm_4form___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pf_8pymorphy_6_morph_8GramForm_4form___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannySetupContext("__set__");
  if (!(likely(PySet_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected set, got %.200s", Py_TYPE(__pyx_v_value)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form);
  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form));
  ((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form = ((PyObject *)__pyx_v_value);

  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_AddTraceback("pymorphy._morph.GramForm.form.__set__");
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8pymorphy_6_morph_8GramForm_4form___del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pf_8pymorphy_6_morph_8GramForm_4form___del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannySetupContext("__del__");
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form);
  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form));
  ((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->form = ((PyObject *)Py_None);

  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "/Users/kmike/dev/pymorphy/pymorphy/_morph.pxd":12
 * cdef class GramForm(object):
 *     cpdef public set form
 *     cpdef public set denied_form             # <<<<<<<<<<<<<<
 * 
 *     cpdef GramForm update(self, unicode form_string)
 */

static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_11denied_form___get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pf_8pymorphy_6_morph_8GramForm_11denied_form___get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannySetupContext("__get__");
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->denied_form));
  __pyx_r = ((PyObject *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->denied_form);
  goto __pyx_L0;

  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8pymorphy_6_morph_8GramForm_11denied_form___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pf_8pymorphy_6_morph_8GramForm_11denied_form___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannySetupContext("__set__");
  if (!(likely(PySet_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected set, got %.200s", Py_TYPE(__pyx_v_value)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->denied_form);
  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->denied_form));
  ((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->denied_form = ((PyObject *)__pyx_v_value);

  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_AddTraceback("pymorphy._morph.GramForm.denied_form.__set__");
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8pymorphy_6_morph_8GramForm_11denied_form___del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pf_8pymorphy_6_morph_8GramForm_11denied_form___del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannySetupContext("__del__");
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->denied_form);
  __Pyx_DECREF(((PyObject *)((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->denied_form));
  ((struct __pyx_obj_8pymorphy_6_morph_GramForm *)__pyx_v_self)->denied_form = ((PyObject *)Py_None);

  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
static struct __pyx_vtabstruct_8pymorphy_6_morph_GramForm __pyx_vtable_8pymorphy_6_morph_GramForm;

static PyObject *__pyx_tp_new_8pymorphy_6_morph_GramForm(PyTypeObject *t, PyObject *a, PyObject *k) {
  struct __pyx_obj_8pymorphy_6_morph_GramForm *p;
  PyObject *o = (*t->tp_alloc)(t, 0);
  if (!o) return 0;
  p = ((struct __pyx_obj_8pymorphy_6_morph_GramForm *)o);
  p->__pyx_vtab = __pyx_vtabptr_8pymorphy_6_morph_GramForm;
  p->form = ((PyObject *)Py_None); Py_INCREF(Py_None);
  p->denied_form = ((PyObject *)Py_None); Py_INCREF(Py_None);
  return o;
}

static void __pyx_tp_dealloc_8pymorphy_6_morph_GramForm(PyObject *o) {
  struct __pyx_obj_8pymorphy_6_morph_GramForm *p = (struct __pyx_obj_8pymorphy_6_morph_GramForm *)o;
  Py_XDECREF(((PyObject *)p->form));
  Py_XDECREF(((PyObject *)p->denied_form));
  (*Py_TYPE(o)->tp_free)(o);
}

static int __pyx_tp_traverse_8pymorphy_6_morph_GramForm(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_8pymorphy_6_morph_GramForm *p = (struct __pyx_obj_8pymorphy_6_morph_GramForm *)o;
  if (p->form) {
    e = (*v)(p->form, a); if (e) return e;
  }
  if (p->denied_form) {
    e = (*v)(p->denied_form, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_8pymorphy_6_morph_GramForm(PyObject *o) {
  struct __pyx_obj_8pymorphy_6_morph_GramForm *p = (struct __pyx_obj_8pymorphy_6_morph_GramForm *)o;
  PyObject* tmp;
  tmp = ((PyObject*)p->form);
  p->form = ((PyObject *)Py_None); Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->denied_form);
  p->denied_form = ((PyObject *)Py_None); Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyObject *__pyx_getprop_8pymorphy_6_morph_8GramForm_form(PyObject *o, void *x) {
  return __pyx_pf_8pymorphy_6_morph_8GramForm_4form___get__(o);
}

static int __pyx_setprop_8pymorphy_6_morph_8GramForm_form(PyObject *o, PyObject *v, void *x) {
  if (v) {
    return __pyx_pf_8pymorphy_6_morph_8GramForm_4form___set__(o, v);
  }
  else {
    return __pyx_pf_8pymorphy_6_morph_8GramForm_4form___del__(o);
  }
}

static PyObject *__pyx_getprop_8pymorphy_6_morph_8GramForm_denied_form(PyObject *o, void *x) {
  return __pyx_pf_8pymorphy_6_morph_8GramForm_11denied_form___get__(o);
}

static int __pyx_setprop_8pymorphy_6_morph_8GramForm_denied_form(PyObject *o, PyObject *v, void *x) {
  if (v) {
    return __pyx_pf_8pymorphy_6_morph_8GramForm_11denied_form___set__(o, v);
  }
  else {
    return __pyx_pf_8pymorphy_6_morph_8GramForm_11denied_form___del__(o);
  }
}

static PyMethodDef __pyx_methods_8pymorphy_6_morph_GramForm[] = {
  {__Pyx_NAMESTR("get_form_string"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_8GramForm_get_form_string, METH_NOARGS, __Pyx_DOCSTR(0)},
  {__Pyx_NAMESTR("clear_number"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_8GramForm_clear_number, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_8GramForm_clear_number)},
  {__Pyx_NAMESTR("clear_case"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_8GramForm_clear_case, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_8GramForm_clear_case)},
  {__Pyx_NAMESTR("clear_gender"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_8GramForm_clear_gender, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_8GramForm_clear_gender)},
  {__Pyx_NAMESTR("clear_person"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_8GramForm_clear_person, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_8GramForm_clear_person)},
  {__Pyx_NAMESTR("clear_tense"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_8GramForm_clear_tense, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_8GramForm_clear_tense)},
  {__Pyx_NAMESTR("clear_voice"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_8GramForm_clear_voice, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_8GramForm_clear_voice)},
  {__Pyx_NAMESTR("update"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_8GramForm_update, METH_O, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_8GramForm_update)},
  {__Pyx_NAMESTR("match"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_8GramForm_match, METH_O, __Pyx_DOCSTR(0)},
  {0, 0, 0, 0}
};

static struct PyGetSetDef __pyx_getsets_8pymorphy_6_morph_GramForm[] = {
  {(char *)"form", __pyx_getprop_8pymorphy_6_morph_8GramForm_form, __pyx_setprop_8pymorphy_6_morph_8GramForm_form, 0, 0},
  {(char *)"denied_form", __pyx_getprop_8pymorphy_6_morph_8GramForm_denied_form, __pyx_setprop_8pymorphy_6_morph_8GramForm_denied_form, 0, 0},
  {0, 0, 0, 0, 0}
};

static PyNumberMethods __pyx_tp_as_number_GramForm = {
  0, /*nb_add*/
  0, /*nb_subtract*/
  0, /*nb_multiply*/
  #if PY_MAJOR_VERSION < 3
  0, /*nb_divide*/
  #endif
  0, /*nb_remainder*/
  0, /*nb_divmod*/
  0, /*nb_power*/
  0, /*nb_negative*/
  0, /*nb_positive*/
  0, /*nb_absolute*/
  0, /*nb_nonzero*/
  0, /*nb_invert*/
  0, /*nb_lshift*/
  0, /*nb_rshift*/
  0, /*nb_and*/
  0, /*nb_xor*/
  0, /*nb_or*/
  #if PY_MAJOR_VERSION < 3
  0, /*nb_coerce*/
  #endif
  0, /*nb_int*/
  #if PY_MAJOR_VERSION < 3
  0, /*nb_long*/
  #else
  0, /*reserved*/
  #endif
  0, /*nb_float*/
  #if PY_MAJOR_VERSION < 3
  0, /*nb_oct*/
  #endif
  #if PY_MAJOR_VERSION < 3
  0, /*nb_hex*/
  #endif
  0, /*nb_inplace_add*/
  0, /*nb_inplace_subtract*/
  0, /*nb_inplace_multiply*/
  #if PY_MAJOR_VERSION < 3
  0, /*nb_inplace_divide*/
  #endif
  0, /*nb_inplace_remainder*/
  0, /*nb_inplace_power*/
  0, /*nb_inplace_lshift*/
  0, /*nb_inplace_rshift*/
  0, /*nb_inplace_and*/
  0, /*nb_inplace_xor*/
  0, /*nb_inplace_or*/
  0, /*nb_floor_divide*/
  0, /*nb_true_divide*/
  0, /*nb_inplace_floor_divide*/
  0, /*nb_inplace_true_divide*/
  #if PY_VERSION_HEX >= 0x02050000
  0, /*nb_index*/
  #endif
};

static PySequenceMethods __pyx_tp_as_sequence_GramForm = {
  0, /*sq_length*/
  0, /*sq_concat*/
  0, /*sq_repeat*/
  0, /*sq_item*/
  0, /*sq_slice*/
  0, /*sq_ass_item*/
  0, /*sq_ass_slice*/
  0, /*sq_contains*/
  0, /*sq_inplace_concat*/
  0, /*sq_inplace_repeat*/
};

static PyMappingMethods __pyx_tp_as_mapping_GramForm = {
  0, /*mp_length*/
  0, /*mp_subscript*/
  0, /*mp_ass_subscript*/
};

static PyBufferProcs __pyx_tp_as_buffer_GramForm = {
  #if PY_MAJOR_VERSION < 3
  0, /*bf_getreadbuffer*/
  #endif
  #if PY_MAJOR_VERSION < 3
  0, /*bf_getwritebuffer*/
  #endif
  #if PY_MAJOR_VERSION < 3
  0, /*bf_getsegcount*/
  #endif
  #if PY_MAJOR_VERSION < 3
  0, /*bf_getcharbuffer*/
  #endif
  #if PY_VERSION_HEX >= 0x02060000
  0, /*bf_getbuffer*/
  #endif
  #if PY_VERSION_HEX >= 0x02060000
  0, /*bf_releasebuffer*/
  #endif
};

PyTypeObject __pyx_type_8pymorphy_6_morph_GramForm = {
  PyVarObject_HEAD_INIT(0, 0)
  __Pyx_NAMESTR("pymorphy._morph.GramForm"), /*tp_name*/
  sizeof(struct __pyx_obj_8pymorphy_6_morph_GramForm), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_8pymorphy_6_morph_GramForm, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #else
  0, /*reserved*/
  #endif
  0, /*tp_repr*/
  &__pyx_tp_as_number_GramForm, /*tp_as_number*/
  &__pyx_tp_as_sequence_GramForm, /*tp_as_sequence*/
  &__pyx_tp_as_mapping_GramForm, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  &__pyx_tp_as_buffer_GramForm, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  __Pyx_DOCSTR(" \320\232\320\273\320\260\321\201\321\201 \320\264\320\273\321\217 \321\200\320\260\320\261\320\276\321\202\321\213 \321\201 \320\263\321\200\320\260\320\274\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\276\320\271 \321\204\320\276\321\200\320\274\320\276\320\271 "), /*tp_doc*/
  __pyx_tp_traverse_8pymorphy_6_morph_GramForm, /*tp_traverse*/
  __pyx_tp_clear_8pymorphy_6_morph_GramForm, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  __pyx_methods_8pymorphy_6_morph_GramForm, /*tp_methods*/
  0, /*tp_members*/
  __pyx_getsets_8pymorphy_6_morph_GramForm, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  __pyx_pf_8pymorphy_6_morph_8GramForm___init__, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_8pymorphy_6_morph_GramForm, /*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*/
  #if PY_VERSION_HEX >= 0x02060000
  0, /*tp_version_tag*/
  #endif
};
static struct __pyx_vtabstruct_8pymorphy_6_morph_Morph __pyx_vtable_8pymorphy_6_morph_Morph;

static PyObject *__pyx_tp_new_8pymorphy_6_morph_Morph(PyTypeObject *t, PyObject *a, PyObject *k) {
  struct __pyx_obj_8pymorphy_6_morph_Morph *p;
  PyObject *o = (*t->tp_alloc)(t, 0);
  if (!o) return 0;
  p = ((struct __pyx_obj_8pymorphy_6_morph_Morph *)o);
  p->__pyx_vtab = __pyx_vtabptr_8pymorphy_6_morph_Morph;
  p->data = Py_None; Py_INCREF(Py_None);
  return o;
}

static void __pyx_tp_dealloc_8pymorphy_6_morph_Morph(PyObject *o) {
  struct __pyx_obj_8pymorphy_6_morph_Morph *p = (struct __pyx_obj_8pymorphy_6_morph_Morph *)o;
  Py_XDECREF(p->data);
  (*Py_TYPE(o)->tp_free)(o);
}

static int __pyx_tp_traverse_8pymorphy_6_morph_Morph(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_8pymorphy_6_morph_Morph *p = (struct __pyx_obj_8pymorphy_6_morph_Morph *)o;
  if (p->data) {
    e = (*v)(p->data, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_8pymorphy_6_morph_Morph(PyObject *o) {
  struct __pyx_obj_8pymorphy_6_morph_Morph *p = (struct __pyx_obj_8pymorphy_6_morph_Morph *)o;
  PyObject* tmp;
  tmp = ((PyObject*)p->data);
  p->data = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyMethodDef __pyx_methods_8pymorphy_6_morph_Morph[] = {
  {__Pyx_NAMESTR("get_graminfo"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_5Morph_get_graminfo, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_5Morph_get_graminfo)},
  {__Pyx_NAMESTR("decline"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_5Morph_decline, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_5Morph_decline)},
  {__Pyx_NAMESTR("inflect_ru"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_5Morph_inflect_ru, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_5Morph_inflect_ru)},
  {__Pyx_NAMESTR("pluralize_ru"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_5Morph_pluralize_ru, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_5Morph_pluralize_ru)},
  {__Pyx_NAMESTR("pluralize_inflected_ru"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_5Morph_pluralize_inflected_ru, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_5Morph_pluralize_inflected_ru)},
  {__Pyx_NAMESTR("normalize"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_5Morph_normalize, METH_O, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_5Morph_normalize)},
  {__Pyx_NAMESTR("_drop_cache"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_5Morph__drop_cache, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_5Morph__drop_cache)},
  {__Pyx_NAMESTR("_decline"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_5Morph__decline, METH_O, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_5Morph__decline)},
  {__Pyx_NAMESTR("_get_lemma_graminfo"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_5Morph__get_lemma_graminfo, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_5Morph__get_lemma_graminfo)},
  {__Pyx_NAMESTR("_flexion_graminfo"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_5Morph__flexion_graminfo, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_5Morph__flexion_graminfo)},
  {__Pyx_NAMESTR("_do_predict_by_suffix"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_5Morph__do_predict_by_suffix, METH_O, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_5Morph__do_predict_by_suffix)},
  {__Pyx_NAMESTR("_static_prefix_graminfo"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_5Morph__static_prefix_graminfo, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_5Morph__static_prefix_graminfo)},
  {__Pyx_NAMESTR("_predict_hyphenated"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_5Morph__predict_hyphenated, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_5Morph__predict_hyphenated)},
  {__Pyx_NAMESTR("_predict_by_prefix_graminfo"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_5Morph__predict_by_prefix_graminfo, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_5Morph__predict_by_prefix_graminfo)},
  {__Pyx_NAMESTR("_handle_EE"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_5Morph__handle_EE, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_5Morph__handle_EE)},
  {__Pyx_NAMESTR("_get_graminfo"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_5Morph__get_graminfo, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_5Morph__get_graminfo)},
  {0, 0, 0, 0}
};

static PyNumberMethods __pyx_tp_as_number_Morph = {
  0, /*nb_add*/
  0, /*nb_subtract*/
  0, /*nb_multiply*/
  #if PY_MAJOR_VERSION < 3
  0, /*nb_divide*/
  #endif
  0, /*nb_remainder*/
  0, /*nb_divmod*/
  0, /*nb_power*/
  0, /*nb_negative*/
  0, /*nb_positive*/
  0, /*nb_absolute*/
  0, /*nb_nonzero*/
  0, /*nb_invert*/
  0, /*nb_lshift*/
  0, /*nb_rshift*/
  0, /*nb_and*/
  0, /*nb_xor*/
  0, /*nb_or*/
  #if PY_MAJOR_VERSION < 3
  0, /*nb_coerce*/
  #endif
  0, /*nb_int*/
  #if PY_MAJOR_VERSION < 3
  0, /*nb_long*/
  #else
  0, /*reserved*/
  #endif
  0, /*nb_float*/
  #if PY_MAJOR_VERSION < 3
  0, /*nb_oct*/
  #endif
  #if PY_MAJOR_VERSION < 3
  0, /*nb_hex*/
  #endif
  0, /*nb_inplace_add*/
  0, /*nb_inplace_subtract*/
  0, /*nb_inplace_multiply*/
  #if PY_MAJOR_VERSION < 3
  0, /*nb_inplace_divide*/
  #endif
  0, /*nb_inplace_remainder*/
  0, /*nb_inplace_power*/
  0, /*nb_inplace_lshift*/
  0, /*nb_inplace_rshift*/
  0, /*nb_inplace_and*/
  0, /*nb_inplace_xor*/
  0, /*nb_inplace_or*/
  0, /*nb_floor_divide*/
  0, /*nb_true_divide*/
  0, /*nb_inplace_floor_divide*/
  0, /*nb_inplace_true_divide*/
  #if PY_VERSION_HEX >= 0x02050000
  0, /*nb_index*/
  #endif
};

static PySequenceMethods __pyx_tp_as_sequence_Morph = {
  0, /*sq_length*/
  0, /*sq_concat*/
  0, /*sq_repeat*/
  0, /*sq_item*/
  0, /*sq_slice*/
  0, /*sq_ass_item*/
  0, /*sq_ass_slice*/
  0, /*sq_contains*/
  0, /*sq_inplace_concat*/
  0, /*sq_inplace_repeat*/
};

static PyMappingMethods __pyx_tp_as_mapping_Morph = {
  0, /*mp_length*/
  0, /*mp_subscript*/
  0, /*mp_ass_subscript*/
};

static PyBufferProcs __pyx_tp_as_buffer_Morph = {
  #if PY_MAJOR_VERSION < 3
  0, /*bf_getreadbuffer*/
  #endif
  #if PY_MAJOR_VERSION < 3
  0, /*bf_getwritebuffer*/
  #endif
  #if PY_MAJOR_VERSION < 3
  0, /*bf_getsegcount*/
  #endif
  #if PY_MAJOR_VERSION < 3
  0, /*bf_getcharbuffer*/
  #endif
  #if PY_VERSION_HEX >= 0x02060000
  0, /*bf_getbuffer*/
  #endif
  #if PY_VERSION_HEX >= 0x02060000
  0, /*bf_releasebuffer*/
  #endif
};

PyTypeObject __pyx_type_8pymorphy_6_morph_Morph = {
  PyVarObject_HEAD_INIT(0, 0)
  __Pyx_NAMESTR("pymorphy._morph.Morph"), /*tp_name*/
  sizeof(struct __pyx_obj_8pymorphy_6_morph_Morph), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_8pymorphy_6_morph_Morph, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #else
  0, /*reserved*/
  #endif
  0, /*tp_repr*/
  &__pyx_tp_as_number_Morph, /*tp_as_number*/
  &__pyx_tp_as_sequence_Morph, /*tp_as_sequence*/
  &__pyx_tp_as_mapping_Morph, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  &__pyx_tp_as_buffer_Morph, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  __Pyx_DOCSTR(" \320\232\320\273\320\260\321\201\321\201, \321\200\320\265\320\260\320\273\320\270\320\267\321\203\321\216\321\211\320\270\320\271 \320\274\320\276\321\200\321\204\320\276\320\273\320\276\320\263\320\270\321\207\320\265\321\201\320\272\320\270\320\271 \320\260\320\275\320\260\320\273\320\270\320\267 \320\275\320\260 \320\276\321\201\320\275\320\276\320\262\320\265 \321\201\320\273\320\276\320\262\320\260\321\200\320\265\320\271 \320\270\320\267\n        data_source\n    "), /*tp_doc*/
  __pyx_tp_traverse_8pymorphy_6_morph_Morph, /*tp_traverse*/
  __pyx_tp_clear_8pymorphy_6_morph_Morph, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  __pyx_methods_8pymorphy_6_morph_Morph, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  __pyx_pf_8pymorphy_6_morph_5Morph___init__, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_8pymorphy_6_morph_Morph, /*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*/
  #if PY_VERSION_HEX >= 0x02060000
  0, /*tp_version_tag*/
  #endif
};

static PyMethodDef __pyx_methods[] = {
  {__Pyx_NAMESTR("_get_split_variants"), (PyCFunction)__pyx_pf_8pymorphy_6_morph__get_split_variants, METH_O, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph__get_split_variants)},
  {__Pyx_NAMESTR("_array_match"), (PyCFunction)__pyx_pf_8pymorphy_6_morph__array_match, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph__array_match)},
  {__Pyx_NAMESTR("_convert_to_standard"), (PyCFunction)__pyx_pf_8pymorphy_6_morph__convert_to_standard, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph__convert_to_standard)},
  {__Pyx_NAMESTR("_parse_gram_str"), (PyCFunction)__pyx_pf_8pymorphy_6_morph__parse_gram_str, METH_O, __Pyx_DOCSTR(0)},
  {__Pyx_NAMESTR("get_morph"), (PyCFunction)__pyx_pf_8pymorphy_6_morph_get_morph, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_8pymorphy_6_morph_get_morph)},
  {0, 0, 0, 0}
};

char* __pyx_import_star_type_names[] = {
  "GramForm",
  "Morph",
  0
};

static int __pyx_import_star_set(PyObject *o, PyObject* py_name, char *name) {
  char** type_name = __pyx_import_star_type_names;
  while (*type_name) {
    if (__Pyx_StrEq(name, *type_name)) {
      PyErr_Format(PyExc_TypeError, "Cannot overwrite C type %s", name);
      goto bad;
    }
    type_name++;
  }
  if (0);
  else {
    if (PyObject_SetAttr(__pyx_m, py_name, o) < 0) goto bad;
  }
  return 0;
  __Pyx_AddTraceback("pymorphy._morph");
  bad:
  Py_DECREF(o);
  return -1;
}


/* import_all_from is an unexposed function from ceval.c */

static int
__Pyx_import_all_from(PyObject *locals, PyObject *v)
{
    PyObject *all = __Pyx_GetAttrString(v, "__all__");
    PyObject *dict, *name, *value;
    int skip_leading_underscores = 0;
    int pos, err;

    if (all == NULL) {
        if (!PyErr_ExceptionMatches(PyExc_AttributeError))
            return -1; /* Unexpected error */
        PyErr_Clear();
        dict = __Pyx_GetAttrString(v, "__dict__");
        if (dict == NULL) {
            if (!PyErr_ExceptionMatches(PyExc_AttributeError))
                return -1;
            PyErr_SetString(PyExc_ImportError,
            "from-import-* object has no __dict__ and no __all__");
            return -1;
        }
        all = PyMapping_Keys(dict);
        Py_DECREF(dict);
        if (all == NULL)
            return -1;
        skip_leading_underscores = 1;
    }

    for (pos = 0, err = 0; ; pos++) {
        name = PySequence_GetItem(all, pos);
        if (name == NULL) {
            if (!PyErr_ExceptionMatches(PyExc_IndexError))
                err = -1;
            else
                PyErr_Clear();
            break;
        }
        if (skip_leading_underscores &&
#if PY_MAJOR_VERSION < 3
            PyString_Check(name) &&
            PyString_AS_STRING(name)[0] == '_')
#else
            PyUnicode_Check(name) &&
            PyUnicode_AS_UNICODE(name)[0] == '_')
#endif
        {
            Py_DECREF(name);
            continue;
        }
        value = PyObject_GetAttr(v, name);
        if (value == NULL)
            err = -1;
        else if (PyDict_CheckExact(locals))
            err = PyDict_SetItem(locals, name, value);
        else
            err = PyObject_SetItem(locals, name, value);
        Py_DECREF(name);
        Py_XDECREF(value);
        if (err != 0)
            break;
    }
    Py_DECREF(all);
    return err;
}


static int __pyx_import_star(PyObject* m) {

    int i;
    int ret = -1;
    char* s;
    PyObject *locals = 0;
    PyObject *list = 0;
#if PY_MAJOR_VERSION >= 3
    PyObject *utf8_name = 0;
#endif
    PyObject *name;
    PyObject *item;
    
    locals = PyDict_New();              if (!locals) goto bad;
    if (__Pyx_import_all_from(locals, m) < 0) goto bad;
    list = PyDict_Items(locals);        if (!list) goto bad;
    
    for(i=0; i<PyList_GET_SIZE(list); i++) {
        name = PyTuple_GET_ITEM(PyList_GET_ITEM(list, i), 0);
        item = PyTuple_GET_ITEM(PyList_GET_ITEM(list, i), 1);
#if PY_MAJOR_VERSION >= 3
        utf8_name = PyUnicode_AsUTF8String(name);
        if (!utf8_name) goto bad;
        s = PyBytes_AS_STRING(utf8_name);
        if (__pyx_import_star_set(item, name, s) < 0) goto bad;
        Py_DECREF(utf8_name); utf8_name = 0;
#else
        s = PyString_AsString(name);
        if (!s) goto bad;
        if (__pyx_import_star_set(item, name, s) < 0) goto bad;
#endif
    }
    ret = 0;
    
bad:
    Py_XDECREF(locals);
    Py_XDECREF(list);
#if PY_MAJOR_VERSION >= 3
    Py_XDECREF(utf8_name);
#endif
    return ret;
}


#if PY_MAJOR_VERSION >= 3
static struct PyModuleDef __pyx_moduledef = {
    PyModuleDef_HEAD_INIT,
    __Pyx_NAMESTR("_morph"),
    0, /* 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_u_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 1, 0, 0},
  {&__pyx_n_u_10, __pyx_k_10, sizeof(__pyx_k_10), 0, 1, 0, 1},
  {&__pyx_n_u_11, __pyx_k_11, sizeof(__pyx_k_11), 0, 1, 0, 1},
  {&__pyx_n_s_16, __pyx_k_16, sizeof(__pyx_k_16), 0, 0, 1, 1},
  {&__pyx_n_s_17, __pyx_k_17, sizeof(__pyx_k_17), 0, 0, 1, 1},
  {&__pyx_n_u_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 1, 0, 1},
  {&__pyx_kp_s_20, __pyx_k_20, sizeof(__pyx_k_20), 0, 0, 1, 0},
  {&__pyx_kp_u_20, __pyx_k_20, sizeof(__pyx_k_20), 0, 1, 0, 0},
  {&__pyx_n_s_21, __pyx_k_21, sizeof(__pyx_k_21), 0, 0, 1, 1},
  {&__pyx_n_u_22, __pyx_k_22, sizeof(__pyx_k_22), 0, 1, 0, 1},
  {&__pyx_kp_u_23, __pyx_k_23, sizeof(__pyx_k_23), 0, 1, 0, 0},
  {&__pyx_kp_u_24, __pyx_k_24, sizeof(__pyx_k_24), 0, 1, 0, 0},
  {&__pyx_kp_u_25, __pyx_k_25, sizeof(__pyx_k_25), 0, 1, 0, 0},
  {&__pyx_n_u_26, __pyx_k_26, sizeof(__pyx_k_26), 0, 1, 0, 1},
  {&__pyx_kp_u_27, __pyx_k_27, sizeof(__pyx_k_27), 0, 1, 0, 0},
  {&__pyx_kp_u_28, __pyx_k_28, sizeof(__pyx_k_28), 0, 1, 0, 0},
  {&__pyx_kp_u_29, __pyx_k_29, sizeof(__pyx_k_29), 0, 1, 0, 0},
  {&__pyx_n_u_3, __pyx_k_3, sizeof(__pyx_k_3), 0, 1, 0, 1},
  {&__pyx_kp_u_30, __pyx_k_30, sizeof(__pyx_k_30), 0, 1, 0, 0},
  {&__pyx_kp_u_31, __pyx_k_31, sizeof(__pyx_k_31), 0, 1, 0, 0},
  {&__pyx_n_s_32, __pyx_k_32, sizeof(__pyx_k_32), 0, 0, 1, 1},
  {&__pyx_kp_u_34, __pyx_k_34, sizeof(__pyx_k_34), 0, 1, 0, 0},
  {&__pyx_kp_u_35, __pyx_k_35, sizeof(__pyx_k_35), 0, 1, 0, 0},
  {&__pyx_kp_u_36, __pyx_k_36, sizeof(__pyx_k_36), 0, 1, 0, 0},
  {&__pyx_kp_u_37, __pyx_k_37, sizeof(__pyx_k_37), 0, 1, 0, 0},
  {&__pyx_n_u_38, __pyx_k_38, sizeof(__pyx_k_38), 0, 1, 0, 1},
  {&__pyx_n_u_39, __pyx_k_39, sizeof(__pyx_k_39), 0, 1, 0, 1},
  {&__pyx_n_u_4, __pyx_k_4, sizeof(__pyx_k_4), 0, 1, 0, 1},
  {&__pyx_kp_u_43, __pyx_k_43, sizeof(__pyx_k_43), 0, 1, 0, 0},
  {&__pyx_n_s_44, __pyx_k_44, sizeof(__pyx_k_44), 0, 0, 1, 1},
  {&__pyx_n_s_45, __pyx_k_45, sizeof(__pyx_k_45), 0, 0, 1, 1},
  {&__pyx_n_s_46, __pyx_k_46, sizeof(__pyx_k_46), 0, 0, 1, 1},
  {&__pyx_n_s_48, __pyx_k_48, sizeof(__pyx_k_48), 0, 0, 1, 1},
  {&__pyx_n_s_49, __pyx_k_49, sizeof(__pyx_k_49), 0, 0, 1, 1},
  {&__pyx_n_u_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 1, 0, 1},
  {&__pyx_n_s_50, __pyx_k_50, sizeof(__pyx_k_50), 0, 0, 1, 1},
  {&__pyx_kp_u_51, __pyx_k_51, sizeof(__pyx_k_51), 0, 1, 0, 0},
  {&__pyx_kp_u_52, __pyx_k_52, sizeof(__pyx_k_52), 0, 1, 0, 0},
  {&__pyx_kp_u_53, __pyx_k_53, sizeof(__pyx_k_53), 0, 1, 0, 0},
  {&__pyx_kp_u_54, __pyx_k_54, sizeof(__pyx_k_54), 0, 1, 0, 0},
  {&__pyx_kp_u_55, __pyx_k_55, sizeof(__pyx_k_55), 0, 1, 0, 0},
  {&__pyx_kp_u_56, __pyx_k_56, sizeof(__pyx_k_56), 0, 1, 0, 0},
  {&__pyx_kp_u_57, __pyx_k_57, sizeof(__pyx_k_57), 0, 1, 0, 0},
  {&__pyx_kp_u_58, __pyx_k_58, sizeof(__pyx_k_58), 0, 1, 0, 0},
  {&__pyx_kp_u_59, __pyx_k_59, sizeof(__pyx_k_59), 0, 1, 0, 0},
  {&__pyx_n_s_6, __pyx_k_6, sizeof(__pyx_k_6), 0, 0, 1, 1},
  {&__pyx_kp_u_60, __pyx_k_60, sizeof(__pyx_k_60), 0, 1, 0, 0},
  {&__pyx_kp_u_61, __pyx_k_61, sizeof(__pyx_k_61), 0, 1, 0, 0},
  {&__pyx_kp_u_62, __pyx_k_62, sizeof(__pyx_k_62), 0, 1, 0, 0},
  {&__pyx_kp_u_63, __pyx_k_63, sizeof(__pyx_k_63), 0, 1, 0, 0},
  {&__pyx_kp_u_64, __pyx_k_64, sizeof(__pyx_k_64), 0, 1, 0, 0},
  {&__pyx_kp_u_65, __pyx_k_65, sizeof(__pyx_k_65), 0, 1, 0, 0},
  {&__pyx_kp_u_66, __pyx_k_66, sizeof(__pyx_k_66), 0, 1, 0, 0},
  {&__pyx_n_s_67, __pyx_k_67, sizeof(__pyx_k_67), 0, 0, 1, 1},
  {&__pyx_kp_u_68, __pyx_k_68, sizeof(__pyx_k_68), 0, 1, 0, 0},
  {&__pyx_kp_u_69, __pyx_k_69, sizeof(__pyx_k_69), 0, 1, 0, 0},
  {&__pyx_kp_s_7, __pyx_k_7, sizeof(__pyx_k_7), 0, 0, 1, 0},
  {&__pyx_kp_u_7, __pyx_k_7, sizeof(__pyx_k_7), 0, 1, 0, 0},
  {&__pyx_kp_u_70, __pyx_k_70, sizeof(__pyx_k_70), 0, 1, 0, 0},
  {&__pyx_kp_u_71, __pyx_k_71, sizeof(__pyx_k_71), 0, 1, 0, 0},
  {&__pyx_kp_u_72, __pyx_k_72, sizeof(__pyx_k_72), 0, 1, 0, 0},
  {&__pyx_kp_u_73, __pyx_k_73, sizeof(__pyx_k_73), 0, 1, 0, 0},
  {&__pyx_kp_u_74, __pyx_k_74, sizeof(__pyx_k_74), 0, 1, 0, 0},
  {&__pyx_kp_u_75, __pyx_k_75, sizeof(__pyx_k_75), 0, 1, 0, 0},
  {&__pyx_kp_u_76, __pyx_k_76, sizeof(__pyx_k_76), 0, 1, 0, 0},
  {&__pyx_kp_u_77, __pyx_k_77, sizeof(__pyx_k_77), 0, 1, 0, 0},
  {&__pyx_kp_u_78, __pyx_k_78, sizeof(__pyx_k_78), 0, 1, 0, 0},
  {&__pyx_kp_u_79, __pyx_k_79, sizeof(__pyx_k_79), 0, 1, 0, 0},
  {&__pyx_kp_u_8, __pyx_k_8, sizeof(__pyx_k_8), 0, 1, 0, 0},
  {&__pyx_n_u_9, __pyx_k_9, sizeof(__pyx_k_9), 0, 1, 0, 1},
  {&__pyx_kp_u__2, __pyx_k__2, sizeof(__pyx_k__2), 0, 1, 0, 0},
  {&__pyx_n_s__GramForm, __pyx_k__GramForm, sizeof(__pyx_k__GramForm), 0, 0, 1, 1},
  {&__pyx_n_s__Morph, __pyx_k__Morph, sizeof(__pyx_k__Morph), 0, 0, 1, 1},
  {&__pyx_n_s__PRODUCTIVE_CLASSES, __pyx_k__PRODUCTIVE_CLASSES, sizeof(__pyx_k__PRODUCTIVE_CLASSES), 0, 0, 1, 1},
  {&__pyx_n_s__PickleDataSource, __pyx_k__PickleDataSource, sizeof(__pyx_k__PickleDataSource), 0, 0, 1, 1},
  {&__pyx_n_s__RU_CASES, __pyx_k__RU_CASES, sizeof(__pyx_k__RU_CASES), 0, 0, 1, 1},
  {&__pyx_n_s__RU_CLASSES_STANDARD, __pyx_k__RU_CLASSES_STANDARD, sizeof(__pyx_k__RU_CLASSES_STANDARD), 0, 0, 1, 1},
  {&__pyx_n_s__RU_GENDERS, __pyx_k__RU_GENDERS, sizeof(__pyx_k__RU_GENDERS), 0, 0, 1, 1},
  {&__pyx_n_s__RU_NUMBERS, __pyx_k__RU_NUMBERS, sizeof(__pyx_k__RU_NUMBERS), 0, 0, 1, 1},
  {&__pyx_n_s__RU_PERSONS, __pyx_k__RU_PERSONS, sizeof(__pyx_k__RU_PERSONS), 0, 0, 1, 1},
  {&__pyx_n_s__RU_TENSES, __pyx_k__RU_TENSES, sizeof(__pyx_k__RU_TENSES), 0, 0, 1, 1},
  {&__pyx_n_s__RU_VOICES, __pyx_k__RU_VOICES, sizeof(__pyx_k__RU_VOICES), 0, 0, 1, 1},
  {&__pyx_n_s__ShelveDataSource, __pyx_k__ShelveDataSource, sizeof(__pyx_k__ShelveDataSource), 0, 0, 1, 1},
  {&__pyx_n_s____init__, __pyx_k____init__, sizeof(__pyx_k____init__), 0, 0, 1, 1},
  {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1},
  {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1},
  {&__pyx_n_s___array_match, __pyx_k___array_match, sizeof(__pyx_k___array_match), 0, 0, 1, 1},
  {&__pyx_n_s___decline, __pyx_k___decline, sizeof(__pyx_k___decline), 0, 0, 1, 1},
  {&__pyx_n_s___drop_cache, __pyx_k___drop_cache, sizeof(__pyx_k___drop_cache), 0, 0, 1, 1},
  {&__pyx_n_s___flexion_graminfo, __pyx_k___flexion_graminfo, sizeof(__pyx_k___flexion_graminfo), 0, 0, 1, 1},
  {&__pyx_n_s___get_graminfo, __pyx_k___get_graminfo, sizeof(__pyx_k___get_graminfo), 0, 0, 1, 1},
  {&__pyx_n_s___get_lemma_graminfo, __pyx_k___get_lemma_graminfo, sizeof(__pyx_k___get_lemma_graminfo), 0, 0, 1, 1},
  {&__pyx_n_s___get_split_variants, __pyx_k___get_split_variants, sizeof(__pyx_k___get_split_variants), 0, 0, 1, 1},
  {&__pyx_n_s___handle_EE, __pyx_k___handle_EE, sizeof(__pyx_k___handle_EE), 0, 0, 1, 1},
  {&__pyx_n_s___parse_gram_str, __pyx_k___parse_gram_str, sizeof(__pyx_k___parse_gram_str), 0, 0, 1, 1},
  {&__pyx_n_s___predict_hyphenated, __pyx_k___predict_hyphenated, sizeof(__pyx_k___predict_hyphenated), 0, 0, 1, 1},
  {&__pyx_n_s__add, __pyx_k__add, sizeof(__pyx_k__add), 0, 0, 1, 1},
  {&__pyx_n_s__ancode, __pyx_k__ancode, sizeof(__pyx_k__ancode), 0, 0, 1, 1},
  {&__pyx_n_s__arr, __pyx_k__arr, sizeof(__pyx_k__arr), 0, 0, 1, 1},
  {&__pyx_n_s__backend, __pyx_k__backend, sizeof(__pyx_k__backend), 0, 0, 1, 1},
  {&__pyx_n_s__cache, __pyx_k__cache, sizeof(__pyx_k__cache), 0, 0, 1, 1},
  {&__pyx_n_s__cached, __pyx_k__cached, sizeof(__pyx_k__cached), 0, 0, 1, 1},
  {&__pyx_n_s__check_prefixes, __pyx_k__check_prefixes, sizeof(__pyx_k__check_prefixes), 0, 0, 1, 1},
  {&__pyx_n_s__class, __pyx_k__class, sizeof(__pyx_k__class), 0, 0, 1, 1},
  {&__pyx_n_s__clear_case, __pyx_k__clear_case, sizeof(__pyx_k__clear_case), 0, 0, 1, 1},
  {&__pyx_n_s__clear_gender, __pyx_k__clear_gender, sizeof(__pyx_k__clear_gender), 0, 0, 1, 1},
  {&__pyx_n_s__clear_number, __pyx_k__clear_number, sizeof(__pyx_k__clear_number), 0, 0, 1, 1},
  {&__pyx_n_s__clear_person, __pyx_k__clear_person, sizeof(__pyx_k__clear_person), 0, 0, 1, 1},
  {&__pyx_n_s__clear_tense, __pyx_k__clear_tense, sizeof(__pyx_k__clear_tense), 0, 0, 1, 1},
  {&__pyx_n_s__clear_voice, __pyx_k__clear_voice, sizeof(__pyx_k__clear_voice), 0, 0, 1, 1},
  {&__pyx_n_s__copy, __pyx_k__copy, sizeof(__pyx_k__copy), 0, 0, 1, 1},
  {&__pyx_n_s__data, __pyx_k__data, sizeof(__pyx_k__data), 0, 0, 1, 1},
  {&__pyx_n_s__data_source, __pyx_k__data_source, sizeof(__pyx_k__data_source), 0, 0, 1, 1},
  {&__pyx_n_s__decline, __pyx_k__decline, sizeof(__pyx_k__decline), 0, 0, 1, 1},
  {&__pyx_n_s__deepcopy, __pyx_k__deepcopy, sizeof(__pyx_k__deepcopy), 0, 0, 1, 1},
  {&__pyx_n_s__denied_form, __pyx_k__denied_form, sizeof(__pyx_k__denied_form), 0, 0, 1, 1},
  {&__pyx_n_s__difference_update, __pyx_k__difference_update, sizeof(__pyx_k__difference_update), 0, 0, 1, 1},
  {&__pyx_n_s__endings, __pyx_k__endings, sizeof(__pyx_k__endings), 0, 0, 1, 1},
  {&__pyx_n_s__extend, __pyx_k__extend, sizeof(__pyx_k__extend), 0, 0, 1, 1},
  {&__pyx_n_s__filter, __pyx_k__filter, sizeof(__pyx_k__filter), 0, 0, 1, 1},
  {&__pyx_n_s__form, __pyx_k__form, sizeof(__pyx_k__form), 0, 0, 1, 1},
  {&__pyx_n_s__form_str, __pyx_k__form_str, sizeof(__pyx_k__form_str), 0, 0, 1, 1},
  {&__pyx_n_s__form_string, __pyx_k__form_string, sizeof(__pyx_k__form_string), 0, 0, 1, 1},
  {&__pyx_n_s__ger, __pyx_k__ger, sizeof(__pyx_k__ger), 0, 0, 1, 1},
  {&__pyx_n_s__get, __pyx_k__get, sizeof(__pyx_k__get), 0, 0, 1, 1},
  {&__pyx_n_s__get_form_string, __pyx_k__get_form_string, sizeof(__pyx_k__get_form_string), 0, 0, 1, 1},
  {&__pyx_n_s__get_graminfo, __pyx_k__get_graminfo, sizeof(__pyx_k__get_graminfo), 0, 0, 1, 1},
  {&__pyx_n_s__get_morph, __pyx_k__get_morph, sizeof(__pyx_k__get_morph), 0, 0, 1, 1},
  {&__pyx_n_s__gram_class, __pyx_k__gram_class, sizeof(__pyx_k__gram_class), 0, 0, 1, 1},
  {&__pyx_n_s__gram_form, __pyx_k__gram_form, sizeof(__pyx_k__gram_form), 0, 0, 1, 1},
  {&__pyx_n_s__gramtab, __pyx_k__gramtab, sizeof(__pyx_k__gramtab), 0, 0, 1, 1},
  {&__pyx_n_s__handle_EE, __pyx_k__handle_EE, sizeof(__pyx_k__handle_EE), 0, 0, 1, 1},
  {&__pyx_n_s__inf, __pyx_k__inf, sizeof(__pyx_k__inf), 0, 0, 1, 1},
  {&__pyx_n_s__inflect_ru, __pyx_k__inflect_ru, sizeof(__pyx_k__inflect_ru), 0, 0, 1, 1},
  {&__pyx_n_s__info, __pyx_k__info, sizeof(__pyx_k__info), 0, 0, 1, 1},
  {&__pyx_n_s__intersection, __pyx_k__intersection, sizeof(__pyx_k__intersection), 0, 0, 1, 1},
  {&__pyx_n_s__issuperset, __pyx_k__issuperset, sizeof(__pyx_k__issuperset), 0, 0, 1, 1},
  {&__pyx_n_s__join, __pyx_k__join, sizeof(__pyx_k__join), 0, 0, 1, 1},
  {&__pyx_n_s__lemma, __pyx_k__lemma, sizeof(__pyx_k__lemma), 0, 0, 1, 1},
  {&__pyx_n_s__lemmas, __pyx_k__lemmas, sizeof(__pyx_k__lemmas), 0, 0, 1, 1},
  {&__pyx_n_s__load, __pyx_k__load, sizeof(__pyx_k__load), 0, 0, 1, 1},
  {&__pyx_n_s__match, __pyx_k__match, sizeof(__pyx_k__match), 0, 0, 1, 1},
  {&__pyx_n_s__method, __pyx_k__method, sizeof(__pyx_k__method), 0, 0, 1, 1},
  {&__pyx_n_s__method_format_str, __pyx_k__method_format_str, sizeof(__pyx_k__method_format_str), 0, 0, 1, 1},
  {&__pyx_n_s__norm, __pyx_k__norm, sizeof(__pyx_k__norm), 0, 0, 1, 1},
  {&__pyx_n_s__normalize, __pyx_k__normalize, sizeof(__pyx_k__normalize), 0, 0, 1, 1},
  {&__pyx_n_s__num, __pyx_k__num, sizeof(__pyx_k__num), 0, 0, 1, 1},
  {&__pyx_n_s__paradigm_id, __pyx_k__paradigm_id, sizeof(__pyx_k__paradigm_id), 0, 0, 1, 1},
  {&__pyx_n_s__partcp, __pyx_k__partcp, sizeof(__pyx_k__partcp), 0, 0, 1, 1},
  {&__pyx_n_s__path, __pyx_k__path, sizeof(__pyx_k__path), 0, 0, 1, 1},
  {&__pyx_n_s__pickle, __pyx_k__pickle, sizeof(__pyx_k__pickle), 0, 0, 1, 1},
  {&__pyx_n_s__pluralize_ru, __pyx_k__pluralize_ru, sizeof(__pyx_k__pluralize_ru), 0, 0, 1, 1},
  {&__pyx_n_s__predict, __pyx_k__predict, sizeof(__pyx_k__predict), 0, 0, 1, 1},
  {&__pyx_n_s__predict_EE, __pyx_k__predict_EE, sizeof(__pyx_k__predict_EE), 0, 0, 1, 1},
  {&__pyx_n_s__predict_by_prefix, __pyx_k__predict_by_prefix, sizeof(__pyx_k__predict_by_prefix), 0, 0, 1, 1},
  {&__pyx_n_s__predict_by_suffix, __pyx_k__predict_by_suffix, sizeof(__pyx_k__predict_by_suffix), 0, 0, 1, 1},
  {&__pyx_n_s__predict_hyphenated, __pyx_k__predict_hyphenated, sizeof(__pyx_k__predict_hyphenated), 0, 0, 1, 1},
  {&__pyx_n_s__prefixes, __pyx_k__prefixes, sizeof(__pyx_k__prefixes), 0, 0, 1, 1},
  {&__pyx_n_s__range, __pyx_k__range, sizeof(__pyx_k__range), 0, 0, 1, 1},
  {&__pyx_n_s__replace, __pyx_k__replace, sizeof(__pyx_k__replace), 0, 0, 1, 1},
  {&__pyx_n_s__require_prefix, __pyx_k__require_prefix, sizeof(__pyx_k__require_prefix), 0, 0, 1, 1},
  {&__pyx_n_s__rules, __pyx_k__rules, sizeof(__pyx_k__rules), 0, 0, 1, 1},
  {&__pyx_n_s__split, __pyx_k__split, sizeof(__pyx_k__split), 0, 0, 1, 1},
  {&__pyx_n_s__sqlite, __pyx_k__sqlite, sizeof(__pyx_k__sqlite), 0, 0, 1, 1},
  {&__pyx_n_s__standard, __pyx_k__standard, sizeof(__pyx_k__standard), 0, 0, 1, 1},
  {&__pyx_n_s__strip, __pyx_k__strip, sizeof(__pyx_k__strip), 0, 0, 1, 1},
  {&__pyx_n_s__suffix, __pyx_k__suffix, sizeof(__pyx_k__suffix), 0, 0, 1, 1},
  {&__pyx_n_s__update, __pyx_k__update, sizeof(__pyx_k__update), 0, 0, 1, 1},
  {&__pyx_n_s__variants, __pyx_k__variants, sizeof(__pyx_k__variants), 0, 0, 1, 1},
  {&__pyx_n_s__word, __pyx_k__word, sizeof(__pyx_k__word), 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0}
};
static int __Pyx_InitCachedBuiltins(void) {
  __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  return 0;
  __pyx_L1_error:;
  return -1;
}

static int __Pyx_InitGlobals(void) {
  #if PY_VERSION_HEX < 0x02040000
  if (unlikely(__Pyx_Py23SetsImport() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #endif
  if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __pyx_int_4 = PyInt_FromLong(4); if (unlikely(!__pyx_int_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __pyx_int_5 = PyInt_FromLong(5); if (unlikely(!__pyx_int_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __pyx_int_10 = PyInt_FromLong(10); if (unlikely(!__pyx_int_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __pyx_int_11 = PyInt_FromLong(11); if (unlikely(!__pyx_int_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __pyx_int_20 = PyInt_FromLong(20); if (unlikely(!__pyx_int_20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __pyx_int_100 = PyInt_FromLong(100); if (unlikely(!__pyx_int_100)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  return 0;
  __pyx_L1_error:;
  return -1;
}

#if PY_MAJOR_VERSION < 3
PyMODINIT_FUNC init_morph(void); /*proto*/
PyMODINIT_FUNC init_morph(void)
#else
PyMODINIT_FUNC PyInit__morph(void); /*proto*/
PyMODINIT_FUNC PyInit__morph(void)
#endif
{
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  #if CYTHON_REFNANNY
  void* __pyx_refnanny = NULL;
  __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");
  }
  __pyx_refnanny = __Pyx_RefNanny->SetupContext("PyMODINIT_FUNC PyInit__morph(void)", __LINE__, __FILE__);
  #endif
  __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #ifdef __pyx_binding_PyCFunctionType_USED
  if (__pyx_binding_PyCFunctionType_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __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(__Pyx_NAMESTR("_morph"), __pyx_methods, 0, 0, PYTHON_API_VERSION);
  #else
  __pyx_m = PyModule_Create(&__pyx_moduledef);
  #endif
  if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  #if PY_MAJOR_VERSION < 3
  Py_INCREF(__pyx_m);
  #endif
  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME));
  if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  /*--- Initialize various global constants etc. ---*/
  if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_module_is_main_pymorphy___morph) {
    if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  }
  /*--- Builtin init code ---*/
  if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  /*--- Global init code ---*/
  /*--- Function export code ---*/
  if (__Pyx_ExportFunction("_get_split_variants", (void (*)(void))__pyx_f_8pymorphy_6_morph__get_split_variants, "PyObject *(PyObject *, int __pyx_skip_dispatch)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__Pyx_ExportFunction("_array_match", (void (*)(void))__pyx_f_8pymorphy_6_morph__array_match, "int (PyObject *, PyObject *, int __pyx_skip_dispatch)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  /*--- Type init code ---*/
  __pyx_vtabptr_8pymorphy_6_morph_GramForm = &__pyx_vtable_8pymorphy_6_morph_GramForm;
  #if PY_MAJOR_VERSION >= 3
  __pyx_vtable_8pymorphy_6_morph_GramForm.update = (struct __pyx_obj_8pymorphy_6_morph_GramForm *(*)(struct __pyx_obj_8pymorphy_6_morph_GramForm *, PyObject *, int __pyx_skip_dispatch))__pyx_f_8pymorphy_6_morph_8GramForm_update;
  __pyx_vtable_8pymorphy_6_morph_GramForm.get_form_string = (PyObject *(*)(struct __pyx_obj_8pymorphy_6_morph_GramForm *, int __pyx_skip_dispatch))__pyx_f_8pymorphy_6_morph_8GramForm_get_form_string;
  __pyx_vtable_8pymorphy_6_morph_GramForm.match = (int (*)(struct __pyx_obj_8pymorphy_6_morph_GramForm *, struct __pyx_obj_8pymorphy_6_morph_GramForm *, int __pyx_skip_dispatch))__pyx_f_8pymorphy_6_morph_8GramForm_match;
  #else
  *(void(**)(void))&__pyx_vtable_8pymorphy_6_morph_GramForm.update = (void(*)(void))__pyx_f_8pymorphy_6_morph_8GramForm_update;
  *(void(**)(void))&__pyx_vtable_8pymorphy_6_morph_GramForm.get_form_string = (void(*)(void))__pyx_f_8pymorphy_6_morph_8GramForm_get_form_string;
  *(void(**)(void))&__pyx_vtable_8pymorphy_6_morph_GramForm.match = (void(*)(void))__pyx_f_8pymorphy_6_morph_8GramForm_match;
  #endif
  if (PyType_Ready(&__pyx_type_8pymorphy_6_morph_GramForm) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__Pyx_SetVtable(__pyx_type_8pymorphy_6_morph_GramForm.tp_dict, __pyx_vtabptr_8pymorphy_6_morph_GramForm) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__Pyx_SetAttrString(__pyx_m, "GramForm", (PyObject *)&__pyx_type_8pymorphy_6_morph_GramForm) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_ptype_8pymorphy_6_morph_GramForm = &__pyx_type_8pymorphy_6_morph_GramForm;
  __pyx_vtabptr_8pymorphy_6_morph_Morph = &__pyx_vtable_8pymorphy_6_morph_Morph;
  #if PY_MAJOR_VERSION >= 3
  __pyx_vtable_8pymorphy_6_morph_Morph._get_lemma_graminfo = (PyObject *(*)(struct __pyx_obj_8pymorphy_6_morph_Morph *, PyObject *, PyObject *, PyObject *, PyObject *, int __pyx_skip_dispatch))__pyx_f_8pymorphy_6_morph_5Morph__get_lemma_graminfo;
  #else
  *(void(**)(void))&__pyx_vtable_8pymorphy_6_morph_Morph._get_lemma_graminfo = (void(*)(void))__pyx_f_8pymorphy_6_morph_5Morph__get_lemma_graminfo;
  #endif
  if (PyType_Ready(&__pyx_type_8pymorphy_6_morph_Morph) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  {
    PyObject *wrapper = __Pyx_GetAttrString((PyObject *)&__pyx_type_8pymorphy_6_morph_Morph, "__init__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_8pymorphy_6_morph_5Morph___init__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_8pymorphy_6_morph_5Morph___init__.doc = __pyx_doc_8pymorphy_6_morph_5Morph___init__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_8pymorphy_6_morph_5Morph___init__;
    }
  }
  if (__Pyx_SetVtable(__pyx_type_8pymorphy_6_morph_Morph.tp_dict, __pyx_vtabptr_8pymorphy_6_morph_Morph) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__Pyx_SetAttrString(__pyx_m, "Morph", (PyObject *)&__pyx_type_8pymorphy_6_morph_Morph) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_ptype_8pymorphy_6_morph_Morph = &__pyx_type_8pymorphy_6_morph_Morph;
  /*--- Type import code ---*/
  /*--- Function import code ---*/
  /*--- Execution code ---*/

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":4
 * ## cython: profile=True
 * 
 * from copy import deepcopy             # <<<<<<<<<<<<<<
 * 
 * from pymorphy.constants import *
 */
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
  __Pyx_INCREF(((PyObject *)__pyx_n_s__deepcopy));
  PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__deepcopy));
  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__deepcopy));
  __pyx_t_2 = __Pyx_Import(((PyObject *)__pyx_n_s__copy), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__deepcopy); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__deepcopy, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":6
 * from copy import deepcopy
 * 
 * from pymorphy.constants import *             # <<<<<<<<<<<<<<
 * from pymorphy.backends import PickleDataSource, ShelveDataSource
 * 
 */
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
  __Pyx_INCREF(((PyObject *)__pyx_n_s_49));
  PyList_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_n_s_49));
  __Pyx_GIVEREF(((PyObject *)__pyx_n_s_49));
  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s_48), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
  if (__pyx_import_star(__pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":7
 * 
 * from pymorphy.constants import *
 * from pymorphy.backends import PickleDataSource, ShelveDataSource             # <<<<<<<<<<<<<<
 * 
 * def _get_split_variants(word):
 */
  __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
  __Pyx_INCREF(((PyObject *)__pyx_n_s__PickleDataSource));
  PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__PickleDataSource));
  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__PickleDataSource));
  __Pyx_INCREF(((PyObject *)__pyx_n_s__ShelveDataSource));
  PyList_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_n_s__ShelveDataSource));
  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__ShelveDataSource));
  __pyx_t_2 = __Pyx_Import(((PyObject *)__pyx_n_s_50), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__PickleDataSource); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__PickleDataSource, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__ShelveDataSource); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__ShelveDataSource, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":130
 *     """
 * 
 *     def __init__(self, data_source, check_prefixes = True,             # <<<<<<<<<<<<<<
 *                  predict_by_prefix = True, predict_by_suffix = True,
 *                  handle_EE = False):
 */
  __pyx_t_2 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_k_12 = __pyx_t_2;
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":131
 * 
 *     def __init__(self, data_source, check_prefixes = True,
 *                  predict_by_prefix = True, predict_by_suffix = True,             # <<<<<<<<<<<<<<
 *                  handle_EE = False):
 *         '''
 */
  __pyx_t_2 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_k_13 = __pyx_t_2;
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_k_14 = __pyx_t_2;
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":132
 *     def __init__(self, data_source, check_prefixes = True,
 *                  predict_by_prefix = True, predict_by_suffix = True,
 *                  handle_EE = False):             # <<<<<<<<<<<<<<
 *         '''
 *          :
 */
  __pyx_t_2 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_k_15 = __pyx_t_2;
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":169
 *         self.handle_EE = handle_EE
 * 
 *     def get_graminfo(self, word, standard=False, predict=True, **kwargs):             # <<<<<<<<<<<<<<
 *         """         .
 *               standard=True,
 */
  __pyx_t_2 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_k_18 = __pyx_t_2;
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_k_19 = __pyx_t_2;
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":491
 * 
 * 
 *     def _predict_hyphenated(self, word, require_prefix=u'', predict=True):             # <<<<<<<<<<<<<<
 *         """    ,     """
 *         gram = []
 */
  __pyx_t_2 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_k_33 = __pyx_t_2;
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":582
 * 
 * 
 *     def _get_graminfo(self, word, require_prefix=u'', predict = True,             # <<<<<<<<<<<<<<
 *                       predict_EE = True, predict_hyphenated=True):
 *         """  .   .
 */
  __pyx_t_2 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 582; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_k_40 = __pyx_t_2;
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":583
 * 
 *     def _get_graminfo(self, word, require_prefix=u'', predict = True,
 *                       predict_EE = True, predict_hyphenated=True):             # <<<<<<<<<<<<<<
 *         """  .   .
 * 
 */
  __pyx_t_2 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_k_41 = __pyx_t_2;
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 583; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_k_42 = __pyx_t_2;
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":629
 * 
 * 
 * def get_morph(path, backend='sqlite', cached=True, **kwargs):             # <<<<<<<<<<<<<<
 *     """
 *          (Morph).
 */
  __pyx_t_2 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_k_47 = __pyx_t_2;
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.py":1
 * # coding: utf-8             # <<<<<<<<<<<<<<
 * ## cython: profile=True
 * 
 */
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
  __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s___get_split_variants); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_51), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s___array_match); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_52), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s_21); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_53), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__GramForm); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__clear_number); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_54), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__GramForm); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__clear_case); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_55), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__GramForm); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__clear_gender); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_56), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__GramForm); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__clear_person); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_57), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__GramForm); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__clear_tense); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_58), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__GramForm); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__clear_voice); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_59), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__GramForm); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__update); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_60), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Morph); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s____init__); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_61), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Morph); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__get_graminfo); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_62), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Morph); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__decline); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_63), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Morph); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__inflect_ru); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_64), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Morph); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__pluralize_ru); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_65), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Morph); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s_67); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_66), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Morph); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__normalize); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_68), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Morph); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s___drop_cache); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_69), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Morph); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s___decline); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_70), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Morph); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s___get_lemma_graminfo); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_71), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Morph); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s___flexion_graminfo); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_72), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Morph); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s_46); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_73), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Morph); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s_44); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_74), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Morph); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s___predict_hyphenated); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_75), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Morph); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s_45); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_76), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Morph); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s___handle_EE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_77), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Morph); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s___get_graminfo); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_78), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__get_morph); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_79), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;

  /* "/Users/kmike/dev/pymorphy/pymorphy/_morph.pxd":12
 * cdef class GramForm(object):
 *     cpdef public set form
 *     cpdef public set denied_form             # <<<<<<<<<<<<<<
 * 
 *     cpdef GramForm update(self, unicode form_string)
 */
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  if (__pyx_m) {
    __Pyx_AddTraceback("init pymorphy._morph");
    Py_DECREF(__pyx_m); __pyx_m = 0;
  } else if (!PyErr_Occurred()) {
    PyErr_SetString(PyExc_ImportError, "init pymorphy._morph");
  }
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  #if PY_MAJOR_VERSION < 3
  return;
  #else
  return __pyx_m;
  #endif
}

/* Runtime support code */

static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {
    PyObject *result;
    result = PyObject_GetAttr(dict, name);
    if (!result)
        PyErr_SetObject(PyExc_NameError, name);
    return result;
}

static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
    const char *name, int exact)
{
    if (!type) {
        PyErr_Format(PyExc_SystemError, "Missing type object");
        return 0;
    }
    if (none_allowed && obj == Py_None) return 1;
    else if (exact) {
        if (Py_TYPE(obj) == type) return 1;
    }
    else {
        if (PyObject_TypeCheck(obj, type)) return 1;
    }
    PyErr_Format(PyExc_TypeError,
        "Argument '%s' has incorrect type (expected %s, got %s)",
        name, type->tp_name, Py_TYPE(obj)->tp_name);
    return 0;
}

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_AS_STRING(kw_name));
        #endif
}

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 *number, *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";
    }
    number = (num_expected == 1) ? "" : "s";
    PyErr_Format(PyExc_TypeError,
        #if PY_VERSION_HEX < 0x02050000
            "%s() takes %s %d positional argument%s (%d given)",
        #else
            "%s() takes %s %zd positional argument%s (%zd given)",
        #endif
        func_name, more_or_less, num_expected, number, num_found);
}

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;
        } else {
            #if PY_MAJOR_VERSION < 3
            if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key))) {
            #else
            if (unlikely(!PyUnicode_CheckExact(key)) && unlikely(!PyUnicode_Check(key))) {
            #endif
                goto invalid_keyword_type;
            } else {
                for (name = first_kw_arg; *name; name++) {
                    #if PY_MAJOR_VERSION >= 3
                    if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) &&
                        PyUnicode_Compare(**name, key) == 0) break;
                    #else
                    if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) &&
                        _PyString_Eq(**name, key)) break;
                    #endif
                }
                if (*name) {
                    values[name-argnames] = value;
                } else {
                    /* unexpected keyword found */
                    for (name=argnames; name != first_kw_arg; name++) {
                        if (**name == key) goto arg_passed_twice;
                        #if PY_MAJOR_VERSION >= 3
                        if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) &&
                            PyUnicode_Compare(**name, key) == 0) goto arg_passed_twice;
                        #else
                        if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) &&
                            _PyString_Eq(**name, key)) goto arg_passed_twice;
                        #endif
                    }
                    if (kwds2) {
                        if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
                    } else {
                        goto invalid_keyword;
                    }
                }
            }
        }
    }
    return 0;
arg_passed_twice:
    __Pyx_RaiseDoubleKeywordsError(function_name, **name);
    goto bad;
invalid_keyword_type:
    PyErr_Format(PyExc_TypeError,
        "%s() keywords must be strings", function_name);
    goto bad;
invalid_keyword:
    PyErr_Format(PyExc_TypeError,
    #if PY_MAJOR_VERSION < 3
        "%s() got an unexpected keyword argument '%s'",
        function_name, PyString_AsString(key));
    #else
        "%s() got an unexpected keyword argument '%U'",
        function_name, key);
    #endif
bad:
    return -1;
}


static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
    PyErr_Format(PyExc_ValueError,
        #if PY_VERSION_HEX < 0x02050000
                 "need more than %d value%s to unpack", (int)index,
        #else
                 "need more than %zd value%s to unpack", index,
        #endif
                 (index == 1) ? "" : "s");
}

static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {
    PyErr_Format(PyExc_ValueError,
        #if PY_VERSION_HEX < 0x02050000
            "too many values to unpack (expected %d)", (int)expected);
        #else
            "too many values to unpack (expected %zd)", expected);
        #endif
}

static PyObject *__Pyx_UnpackItem(PyObject *iter, Py_ssize_t index) {
    PyObject *item;
    if (!(item = PyIter_Next(iter))) {
        if (!PyErr_Occurred()) {
            __Pyx_RaiseNeedMoreValuesError(index);
        }
    }
    return item;
}

static int __Pyx_EndUnpack(PyObject *iter, Py_ssize_t expected) {
    PyObject *item;
    if ((item = PyIter_Next(iter))) {
        Py_DECREF(item);
        __Pyx_RaiseTooManyValuesError(expected);
        return -1;
    }
    else if (!PyErr_Occurred())
        return 0;
    else
        return -1;
}

static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
    if (unlikely(!type)) {
        PyErr_Format(PyExc_SystemError, "Missing type object");
        return 0;
    }
    if (likely(PyObject_TypeCheck(obj, type)))
        return 1;
    PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s",
                 Py_TYPE(obj)->tp_name, type->tp_name);
    return 0;
}

static CYTHON_INLINE void __Pyx_RaiseNoneIndexingError(void) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is unsubscriptable");
}

static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list) {
    PyObject *py_import = 0;
    PyObject *empty_list = 0;
    PyObject *module = 0;
    PyObject *global_dict = 0;
    PyObject *empty_dict = 0;
    PyObject *list;
    py_import = __Pyx_GetAttrString(__pyx_b, "__import__");
    if (!py_import)
        goto bad;
    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;
    module = PyObject_CallFunctionObjArgs(py_import,
        name, global_dict, empty_dict, list, NULL);
bad:
    Py_XDECREF(empty_list);
    Py_XDECREF(py_import);
    Py_XDECREF(empty_dict);
    return module;
}

static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {
    const unsigned char neg_one = (unsigned char)-1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
    if (sizeof(unsigned char) < sizeof(long)) {
        long val = __Pyx_PyInt_AsLong(x);
        if (unlikely(val != (long)(unsigned char)val)) {
            if (!unlikely(val == -1 && PyErr_Occurred())) {
                PyErr_SetString(PyExc_OverflowError,
                    (is_unsigned && unlikely(val < 0)) ?
                    "can't convert negative value to unsigned char" :
                    "value too large to convert to unsigned char");
            }
            return (unsigned char)-1;
        }
        return (unsigned char)val;
    }
    return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x);
}

static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) {
    const unsigned short neg_one = (unsigned short)-1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
    if (sizeof(unsigned short) < sizeof(long)) {
        long val = __Pyx_PyInt_AsLong(x);
        if (unlikely(val != (long)(unsigned short)val)) {
            if (!unlikely(val == -1 && PyErr_Occurred())) {
                PyErr_SetString(PyExc_OverflowError,
                    (is_unsigned && unlikely(val < 0)) ?
                    "can't convert negative value to unsigned short" :
                    "value too large to convert to unsigned short");
            }
            return (unsigned short)-1;
        }
        return (unsigned short)val;
    }
    return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x);
}

static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) {
    const unsigned int neg_one = (unsigned int)-1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
    if (sizeof(unsigned int) < sizeof(long)) {
        long val = __Pyx_PyInt_AsLong(x);
        if (unlikely(val != (long)(unsigned int)val)) {
            if (!unlikely(val == -1 && PyErr_Occurred())) {
                PyErr_SetString(PyExc_OverflowError,
                    (is_unsigned && unlikely(val < 0)) ?
                    "can't convert negative value to unsigned int" :
                    "value too large to convert to unsigned int");
            }
            return (unsigned int)-1;
        }
        return (unsigned int)val;
    }
    return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x);
}

static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) {
    const char neg_one = (char)-1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
    if (sizeof(char) < sizeof(long)) {
        long val = __Pyx_PyInt_AsLong(x);
        if (unlikely(val != (long)(char)val)) {
            if (!unlikely(val == -1 && PyErr_Occurred())) {
                PyErr_SetString(PyExc_OverflowError,
                    (is_unsigned && unlikely(val < 0)) ?
                    "can't convert negative value to char" :
                    "value too large to convert to char");
            }
            return (char)-1;
        }
        return (char)val;
    }
    return (char)__Pyx_PyInt_AsLong(x);
}

static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) {
    const short neg_one = (short)-1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
    if (sizeof(short) < sizeof(long)) {
        long val = __Pyx_PyInt_AsLong(x);
        if (unlikely(val != (long)(short)val)) {
            if (!unlikely(val == -1 && PyErr_Occurred())) {
                PyErr_SetString(PyExc_OverflowError,
                    (is_unsigned && unlikely(val < 0)) ?
                    "can't convert negative value to short" :
                    "value too large to convert to short");
            }
            return (short)-1;
        }
        return (short)val;
    }
    return (short)__Pyx_PyInt_AsLong(x);
}

static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) {
    const int neg_one = (int)-1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
    if (sizeof(int) < sizeof(long)) {
        long val = __Pyx_PyInt_AsLong(x);
        if (unlikely(val != (long)(int)val)) {
            if (!unlikely(val == -1 && PyErr_Occurred())) {
                PyErr_SetString(PyExc_OverflowError,
                    (is_unsigned && unlikely(val < 0)) ?
                    "can't convert negative value to int" :
                    "value too large to convert to int");
            }
            return (int)-1;
        }
        return (int)val;
    }
    return (int)__Pyx_PyInt_AsLong(x);
}

static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) {
    const signed char neg_one = (signed char)-1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
    if (sizeof(signed char) < sizeof(long)) {
        long val = __Pyx_PyInt_AsLong(x);
        if (unlikely(val != (long)(signed char)val)) {
            if (!unlikely(val == -1 && PyErr_Occurred())) {
                PyErr_SetString(PyExc_OverflowError,
                    (is_unsigned && unlikely(val < 0)) ?
                    "can't convert negative value to signed char" :
                    "value too large to convert to signed char");
            }
            return (signed char)-1;
        }
        return (signed char)val;
    }
    return (signed char)__Pyx_PyInt_AsSignedLong(x);
}

static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) {
    const signed short neg_one = (signed short)-1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
    if (sizeof(signed short) < sizeof(long)) {
        long val = __Pyx_PyInt_AsLong(x);
        if (unlikely(val != (long)(signed short)val)) {
            if (!unlikely(val == -1 && PyErr_Occurred())) {
                PyErr_SetString(PyExc_OverflowError,
                    (is_unsigned && unlikely(val < 0)) ?
                    "can't convert negative value to signed short" :
                    "value too large to convert to signed short");
            }
            return (signed short)-1;
        }
        return (signed short)val;
    }
    return (signed short)__Pyx_PyInt_AsSignedLong(x);
}

static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) {
    const signed int neg_one = (signed int)-1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
    if (sizeof(signed int) < sizeof(long)) {
        long val = __Pyx_PyInt_AsLong(x);
        if (unlikely(val != (long)(signed int)val)) {
            if (!unlikely(val == -1 && PyErr_Occurred())) {
                PyErr_SetString(PyExc_OverflowError,
                    (is_unsigned && unlikely(val < 0)) ?
                    "can't convert negative value to signed int" :
                    "value too large to convert to signed int");
            }
            return (signed int)-1;
        }
        return (signed int)val;
    }
    return (signed int)__Pyx_PyInt_AsSignedLong(x);
}

static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject* x) {
    const int neg_one = (int)-1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
    if (sizeof(int) < sizeof(long)) {
        long val = __Pyx_PyInt_AsLong(x);
        if (unlikely(val != (long)(int)val)) {
            if (!unlikely(val == -1 && PyErr_Occurred())) {
                PyErr_SetString(PyExc_OverflowError,
                    (is_unsigned && unlikely(val < 0)) ?
                    "can't convert negative value to int" :
                    "value too large to convert to int");
            }
            return (int)-1;
        }
        return (int)val;
    }
    return (int)__Pyx_PyInt_AsLong(x);
}

static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {
    const unsigned long neg_one = (unsigned long)-1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_VERSION_HEX < 0x03000000
    if (likely(PyInt_Check(x))) {
        long val = PyInt_AS_LONG(x);
        if (is_unsigned && unlikely(val < 0)) {
            PyErr_SetString(PyExc_OverflowError,
                            "can't convert negative value to unsigned long");
            return (unsigned long)-1;
        }
        return (unsigned long)val;
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
            if (unlikely(Py_SIZE(x) < 0)) {
                PyErr_SetString(PyExc_OverflowError,
                                "can't convert negative value to unsigned long");
                return (unsigned long)-1;
            }
            return PyLong_AsUnsignedLong(x);
        } else {
            return PyLong_AsLong(x);
        }
    } else {
        unsigned long val;
        PyObject *tmp = __Pyx_PyNumber_Int(x);
        if (!tmp) return (unsigned long)-1;
        val = __Pyx_PyInt_AsUnsignedLong(tmp);
        Py_DECREF(tmp);
        return val;
    }
}

static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) {
    const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_VERSION_HEX < 0x03000000
    if (likely(PyInt_Check(x))) {
        long val = PyInt_AS_LONG(x);
        if (is_unsigned && unlikely(val < 0)) {
            PyErr_SetString(PyExc_OverflowError,
                            "can't convert negative value to unsigned PY_LONG_LONG");
            return (unsigned PY_LONG_LONG)-1;
        }
        return (unsigned PY_LONG_LONG)val;
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
            if (unlikely(Py_SIZE(x) < 0)) {
                PyErr_SetString(PyExc_OverflowError,
                                "can't convert negative value to unsigned PY_LONG_LONG");
                return (unsigned PY_LONG_LONG)-1;
            }
            return PyLong_AsUnsignedLongLong(x);
        } else {
            return PyLong_AsLongLong(x);
        }
    } else {
        unsigned PY_LONG_LONG val;
        PyObject *tmp = __Pyx_PyNumber_Int(x);
        if (!tmp) return (unsigned PY_LONG_LONG)-1;
        val = __Pyx_PyInt_AsUnsignedLongLong(tmp);
        Py_DECREF(tmp);
        return val;
    }
}

static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) {
    const long neg_one = (long)-1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_VERSION_HEX < 0x03000000
    if (likely(PyInt_Check(x))) {
        long val = PyInt_AS_LONG(x);
        if (is_unsigned && unlikely(val < 0)) {
            PyErr_SetString(PyExc_OverflowError,
                            "can't convert negative value to long");
            return (long)-1;
        }
        return (long)val;
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
            if (unlikely(Py_SIZE(x) < 0)) {
                PyErr_SetString(PyExc_OverflowError,
                                "can't convert negative value to long");
                return (long)-1;
            }
            return PyLong_AsUnsignedLong(x);
        } else {
            return PyLong_AsLong(x);
        }
    } else {
        long val;
        PyObject *tmp = __Pyx_PyNumber_Int(x);
        if (!tmp) return (long)-1;
        val = __Pyx_PyInt_AsLong(tmp);
        Py_DECREF(tmp);
        return val;
    }
}

static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) {
    const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_VERSION_HEX < 0x03000000
    if (likely(PyInt_Check(x))) {
        long val = PyInt_AS_LONG(x);
        if (is_unsigned && unlikely(val < 0)) {
            PyErr_SetString(PyExc_OverflowError,
                            "can't convert negative value to PY_LONG_LONG");
            return (PY_LONG_LONG)-1;
        }
        return (PY_LONG_LONG)val;
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
            if (unlikely(Py_SIZE(x) < 0)) {
                PyErr_SetString(PyExc_OverflowError,
                                "can't convert negative value to PY_LONG_LONG");
                return (PY_LONG_LONG)-1;
            }
            return PyLong_AsUnsignedLongLong(x);
        } else {
            return PyLong_AsLongLong(x);
        }
    } else {
        PY_LONG_LONG val;
        PyObject *tmp = __Pyx_PyNumber_Int(x);
        if (!tmp) return (PY_LONG_LONG)-1;
        val = __Pyx_PyInt_AsLongLong(tmp);
        Py_DECREF(tmp);
        return val;
    }
}

static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) {
    const signed long neg_one = (signed long)-1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_VERSION_HEX < 0x03000000
    if (likely(PyInt_Check(x))) {
        long val = PyInt_AS_LONG(x);
        if (is_unsigned && unlikely(val < 0)) {
            PyErr_SetString(PyExc_OverflowError,
                            "can't convert negative value to signed long");
            return (signed long)-1;
        }
        return (signed long)val;
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
            if (unlikely(Py_SIZE(x) < 0)) {
                PyErr_SetString(PyExc_OverflowError,
                                "can't convert negative value to signed long");
                return (signed long)-1;
            }
            return PyLong_AsUnsignedLong(x);
        } else {
            return PyLong_AsLong(x);
        }
    } else {
        signed long val;
        PyObject *tmp = __Pyx_PyNumber_Int(x);
        if (!tmp) return (signed long)-1;
        val = __Pyx_PyInt_AsSignedLong(tmp);
        Py_DECREF(tmp);
        return val;
    }
}

static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) {
    const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_VERSION_HEX < 0x03000000
    if (likely(PyInt_Check(x))) {
        long val = PyInt_AS_LONG(x);
        if (is_unsigned && unlikely(val < 0)) {
            PyErr_SetString(PyExc_OverflowError,
                            "can't convert negative value to signed PY_LONG_LONG");
            return (signed PY_LONG_LONG)-1;
        }
        return (signed PY_LONG_LONG)val;
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
            if (unlikely(Py_SIZE(x) < 0)) {
                PyErr_SetString(PyExc_OverflowError,
                                "can't convert negative value to signed PY_LONG_LONG");
                return (signed PY_LONG_LONG)-1;
            }
            return PyLong_AsUnsignedLongLong(x);
        } else {
            return PyLong_AsLongLong(x);
        }
    } else {
        signed PY_LONG_LONG val;
        PyObject *tmp = __Pyx_PyNumber_Int(x);
        if (!tmp) return (signed PY_LONG_LONG)-1;
        val = __Pyx_PyInt_AsSignedLongLong(tmp);
        Py_DECREF(tmp);
        return val;
    }
}

static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
    PyObject *tmp_type, *tmp_value, *tmp_tb;
    PyThreadState *tstate = PyThreadState_GET();

    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_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
    PyThreadState *tstate = PyThreadState_GET();
    *type = tstate->curexc_type;
    *value = tstate->curexc_value;
    *tb = tstate->curexc_traceback;

    tstate->curexc_type = 0;
    tstate->curexc_value = 0;
    tstate->curexc_traceback = 0;
}


static void __Pyx_WriteUnraisable(const char *name) {
    PyObject *old_exc, *old_val, *old_tb;
    PyObject *ctx;
    __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);
    #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);
    }
}

static CYTHON_INLINE int __Pyx_StrEq(const char *s1, const char *s2) {
     while (*s1 != '\0' && *s1 == *s2) { s1++; s2++; }
     return *s1 == *s2;
}

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 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0)
    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;
}

static int __Pyx_SetVtable(PyObject *dict, void *vtable) {
#if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0)
    PyObject *ob = PyCapsule_New(vtable, 0, 0);
#else
    PyObject *ob = PyCObject_FromVoidPtr(vtable, 0);
#endif
    if (!ob)
        goto bad;
    if (PyDict_SetItemString(dict, "__pyx_vtable__", ob) < 0)
        goto bad;
    Py_DECREF(ob);
    return 0;
bad:
    Py_XDECREF(ob);
    return -1;
}

#include "compile.h"
#include "frameobject.h"
#include "traceback.h"

static void __Pyx_AddTraceback(const char *funcname) {
    PyObject *py_srcfile = 0;
    PyObject *py_funcname = 0;
    PyObject *py_globals = 0;
    PyCodeObject *py_code = 0;
    PyFrameObject *py_frame = 0;

    #if PY_MAJOR_VERSION < 3
    py_srcfile = PyString_FromString(__pyx_filename);
    #else
    py_srcfile = PyUnicode_FromString(__pyx_filename);
    #endif
    if (!py_srcfile) goto bad;
    if (__pyx_clineno) {
        #if PY_MAJOR_VERSION < 3
        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno);
        #else
        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno);
        #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_globals = PyModule_GetDict(__pyx_m);
    if (!py_globals) goto bad;
    py_code = PyCode_New(
        0,            /*int argcount,*/
        #if PY_MAJOR_VERSION >= 3
        0,            /*int kwonlyargcount,*/
        #endif
        0,            /*int nlocals,*/
        0,            /*int stacksize,*/
        0,            /*int flags,*/
        __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,*/
        __pyx_lineno,   /*int firstlineno,*/
        __pyx_empty_bytes  /*PyObject *lnotab*/
    );
    if (!py_code) goto bad;
    py_frame = PyFrame_New(
        PyThreadState_GET(), /*PyThreadState *tstate,*/
        py_code,             /*PyCodeObject *code,*/
        py_globals,          /*PyObject *globals,*/
        0                    /*PyObject *locals*/
    );
    if (!py_frame) goto bad;
    py_frame->f_lineno = __pyx_lineno;
    PyTraceBack_Here(py_frame);
bad:
    Py_XDECREF(py_srcfile);
    Py_XDECREF(py_funcname);
    Py_XDECREF(py_code);
    Py_XDECREF(py_frame);
}

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  /* Python 3+ has unicode identifiers */
        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;
}

/* Type Conversion Functions */

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_Int(PyObject* x) {
  PyNumberMethods *m;
  const char *name = NULL;
  PyObject *res = NULL;
#if PY_VERSION_HEX < 0x03000000
  if (PyInt_Check(x) || PyLong_Check(x))
#else
  if (PyLong_Check(x))
#endif
    return Py_INCREF(x), x;
  m = Py_TYPE(x)->tp_as_number;
#if PY_VERSION_HEX < 0x03000000
  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_VERSION_HEX < 0x03000000
    if (!PyInt_Check(res) && !PyLong_Check(res)) {
#else
    if (!PyLong_Check(res)) {
#endif
      PyErr_Format(PyExc_TypeError,
                   "__%s__ returned non-%s (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 = 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) {
#if PY_VERSION_HEX < 0x02050000
   if (ival <= LONG_MAX)
       return PyInt_FromLong((long)ival);
   else {
       unsigned char *bytes = (unsigned char *) &ival;
       int one = 1; int little = (int)*(unsigned char*)&one;
       return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0);
   }
#else
   return PyInt_FromSize_t(ival);
#endif
}

static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) {
   unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x);
   if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) {
       return (size_t)-1;
   } else if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) {
       PyErr_SetString(PyExc_OverflowError,
                       "value too large to convert to size_t");
       return (size_t)-1;
   }
   return (size_t)val;
}


#endif /* Py_PYTHON_H */
